answer42 0.2.0__tar.gz → 0.2.2__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 (59) hide show
  1. {answer42-0.2.0 → answer42-0.2.2}/.gitignore +1 -1
  2. {answer42-0.2.0 → answer42-0.2.2}/PKG-INFO +47 -149
  3. {answer42-0.2.0 → answer42-0.2.2}/README.md +46 -148
  4. answer42-0.2.2/docs/agent-installation.md +254 -0
  5. {answer42-0.2.0 → answer42-0.2.2}/docs/architecture.md +2 -2
  6. answer42-0.2.2/docs/assets/platform42-logo.svg +2 -0
  7. {answer42-0.2.0 → answer42-0.2.2}/pyproject.toml +1 -1
  8. answer42-0.2.2/scripts/build_pages.py +294 -0
  9. {answer42-0.2.0 → answer42-0.2.2}/scripts/e2e_stable.py +94 -60
  10. {answer42-0.2.0 → answer42-0.2.2}/src/cf/DataProcessors/MCPTestManager/Forms//320/244/320/276/321/200/320/274/320/260/Ext/Form/Module.bsl +114 -16
  11. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/assets/MCPTestClient.cf +0 -0
  12. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/assets/MCPTestManager.cf +0 -0
  13. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/assets/skills/answer42/SKILL.md +1 -1
  14. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/server.py +28 -0
  15. answer42-0.2.0/docs/publishing.md +0 -103
  16. {answer42-0.2.0 → answer42-0.2.2}/LICENSE +0 -0
  17. {answer42-0.2.0 → answer42-0.2.2}/credentials.example.json +0 -0
  18. {answer42-0.2.0 → answer42-0.2.2}/docs/assets/answer42-logo.png +0 -0
  19. {answer42-0.2.0 → answer42-0.2.2}/docs/installation.md +0 -0
  20. {answer42-0.2.0 → answer42-0.2.2}/scripts/build_cf.py +0 -0
  21. {answer42-0.2.0 → answer42-0.2.2}/scripts/openclaw_mcp_autoreload.py +0 -0
  22. {answer42-0.2.0 → answer42-0.2.2}/scripts/rag_cli.py +0 -0
  23. {answer42-0.2.0 → answer42-0.2.2}/src/cf/ConfigDumpInfo.xml +0 -0
  24. {answer42-0.2.0 → answer42-0.2.2}/src/cf/Configuration.xml +0 -0
  25. {answer42-0.2.0 → answer42-0.2.2}/src/cf/DataProcessors/MCPTestManager/Ext/ObjectModule.bsl +0 -0
  26. {answer42-0.2.0 → answer42-0.2.2}/src/cf/DataProcessors/MCPTestManager/Forms//320/244/320/276/321/200/320/274/320/260/Ext/Form.xml" +0 -0
  27. {answer42-0.2.0 → answer42-0.2.2}/src/cf/DataProcessors/MCPTestManager/Forms//320/244/320/276/321/200/320/274/320/260.xml" +0 -0
  28. {answer42-0.2.0 → answer42-0.2.2}/src/cf/DataProcessors/MCPTestManager.xml +0 -0
  29. {answer42-0.2.0 → answer42-0.2.2}/src/cf/Ext/ManagedApplicationModule.bsl +0 -0
  30. {answer42-0.2.0 → answer42-0.2.2}/src/cf/Languages//320/240/321/203/321/201/321/201/320/272/320/270/320/271.xml" +0 -0
  31. {answer42-0.2.0 → answer42-0.2.2}/src/client_cf/Catalogs//320/237/320/241_/320/222/320/273/320/260/320/264/320/265/320/273/320/265/321/206.xml" +0 -0
  32. {answer42-0.2.0 → answer42-0.2.2}/src/client_cf/Catalogs//320/237/320/241_/320/241/320/277/321/200/320/260/320/262/320/276/321/207/320/275/320/270/320/2721.xml" +0 -0
  33. {answer42-0.2.0 → answer42-0.2.2}/src/client_cf/ConfigDumpInfo.xml +0 -0
  34. {answer42-0.2.0 → answer42-0.2.2}/src/client_cf/Configuration.xml +0 -0
  35. {answer42-0.2.0 → answer42-0.2.2}/src/client_cf/Languages//320/240/321/203/321/201/321/201/320/272/320/270/320/271.xml" +0 -0
  36. {answer42-0.2.0 → answer42-0.2.2}/src/client_cf/Reports//320/237/320/241_/320/241/320/277/320/270/321/201/320/276/320/272/320/255/320/273/320/265/320/274/320/265/320/275/321/202/320/276/320/262/Ext/ManagerModule.bsl" +0 -0
  37. {answer42-0.2.0 → answer42-0.2.2}/src/client_cf/Reports//320/237/320/241_/320/241/320/277/320/270/321/201/320/276/320/272/320/255/320/273/320/265/320/274/320/265/320/275/321/202/320/276/320/262/Ext/ObjectModule.bsl" +0 -0
  38. {answer42-0.2.0 → answer42-0.2.2}/src/client_cf/Reports//320/237/320/241_/320/241/320/277/320/270/321/201/320/276/320/272/320/255/320/273/320/265/320/274/320/265/320/275/321/202/320/276/320/262/Templates//320/236/321/201/320/275/320/276/320/262/320/275/320/260/321/217/320/241/321/205/320/265/320/274/320/260/320/232/320/276/320/274/320/277/320/276/320/275/320/276/320/262/320/272/320/270/320/224/320/260/320/275/320/275/321/213/321/205/Ext/Template.xml" +0 -0
  39. {answer42-0.2.0 → answer42-0.2.2}/src/client_cf/Reports//320/237/320/241_/320/241/320/277/320/270/321/201/320/276/320/272/320/255/320/273/320/265/320/274/320/265/320/275/321/202/320/276/320/262/Templates//320/236/321/201/320/275/320/276/320/262/320/275/320/260/321/217/320/241/321/205/320/265/320/274/320/260/320/232/320/276/320/274/320/277/320/276/320/275/320/276/320/262/320/272/320/270/320/224/320/260/320/275/320/275/321/213/321/205.xml" +0 -0
  40. {answer42-0.2.0 → answer42-0.2.2}/src/client_cf/Reports//320/237/320/241_/320/241/320/277/320/270/321/201/320/276/320/272/320/255/320/273/320/265/320/274/320/265/320/275/321/202/320/276/320/262.xml" +0 -0
  41. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/__init__.py +0 -0
  42. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/assets/__init__.py +0 -0
  43. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/assets/skills/answer42-rag/SKILL.md +0 -0
  44. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/bridge.py +0 -0
  45. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/credentials.py +0 -0
  46. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/os_support.py +0 -0
  47. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/platform.py +0 -0
  48. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/protocol.py +0 -0
  49. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/rag/__init__.py +0 -0
  50. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/rag/detect.py +0 -0
  51. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/rag/model.py +0 -0
  52. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/rag/parsers.py +0 -0
  53. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/rag/service.py +0 -0
  54. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/rag/store.py +0 -0
  55. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/recorder.py +0 -0
  56. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/release_helper.py +0 -0
  57. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/runtime.py +0 -0
  58. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/skill_installer.py +0 -0
  59. {answer42-0.2.0 → answer42-0.2.2}/src/mcp_1c/window_control.py +0 -0
@@ -22,4 +22,4 @@ dist/
22
22
 
23
23
  # BSL Language Server report (created at repo root)
24
24
  bsl-json.json
25
-
25
+ public/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: answer42
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
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
5
  Author: Marvin (AI Assistant), 42Clouds, and contributors
6
6
  Author-email: "Kosolapov Stanislav (proDOOMman)" <prodoomman@gmail.com>
@@ -34,9 +34,7 @@ Description-Content-Type: text/markdown
34
34
 
35
35
  # Answer42
36
36
 
37
- <p align="center">
38
- <img src="docs/assets/answer42-logo.png" alt="Answer42 logo" width="220">
39
- </p>
37
+ ![Answer42 logo](docs/assets/answer42-logo.png)
40
38
 
41
39
  **Answer42** — MCP-инструмент для интерактивного управления UI **1С:Предприятия** через клиент тестирования. Он позволяет AI-агенту открывать формы 1С, нажимать кнопки, заполнять поля, выбирать ссылки из форм выбора, работать с таблицами, динамическими списками и табличными документами.
42
40
 
@@ -86,6 +84,48 @@ start_session(
86
84
 
87
85
  Логин/пароль рекомендуется **не передавать явно**: `start_session` умеет брать их из локального credentials-файла по `base_url`. Параметры `username`/`password` остаются в API для разовых сценариев и обратной совместимости, но при передаче в MCP-вызове они видны вызывающему агенту в аргументах tool-call.
88
86
 
87
+ ## Установка skills
88
+
89
+ PyPI-пакет не записывает agent skills в пользовательские каталоги автоматически. После установки Answer42 поставьте bundled skills отдельной командой:
90
+
91
+ ```bash
92
+ answer42 install-skills
93
+ ```
94
+
95
+ По умолчанию команда устанавливает `answer42` и `answer42-rag` в OpenClaw:
96
+
97
+ ```text
98
+ ~/.openclaw/workspace/skills
99
+ ```
100
+
101
+ Другие агенты и варианты установки:
102
+
103
+ ```bash
104
+ answer42 install-skills --agent claude
105
+ answer42 install-skills --agent codex
106
+ answer42 install-skills --agent opencode
107
+ answer42 install-skills --agent pi
108
+ answer42 install-skills --agent hermes
109
+ answer42 install-skills --agent all
110
+ answer42 install-skills --target-dir /path/to/skills
111
+ answer42 install-skills --list-agents
112
+ answer42 install-skills --dry-run --agent all
113
+ ```
114
+
115
+ Для агентов без стабильного стандарта skill-директорий (`codex`, `opencode`, `pi`, `hermes`) presets best-effort. Если конкретная установка использует другой путь, укажите `--target-dir` явно.
116
+
117
+ ## Инструкция для AI-агентов
118
+
119
+ Если вы AI-агент и пользователь просит установить Answer42 и skills, используйте отдельную инструкцию: [`docs/agent-installation.md`](docs/agent-installation.md).
120
+
121
+ Коротко:
122
+
123
+ 1. установите пакет через `pipx` или virtualenv;
124
+ 2. выполните `answer42 install-skills`;
125
+ 3. подготовьте `ONEC_MCP_CREDENTIALS_FILE` вне репозитория;
126
+ 4. зарегистрируйте MCP-сервер в агентском клиенте;
127
+ 5. проверьте установку через `credentials_check`, затем smoke-сессию `start_session` → `active_window` → `stop_session`.
128
+
89
129
  ## Безопасное хранение логинов и паролей
90
130
 
91
131
  Чтобы креды были доступны MCP-серверу, но не попадали в чат и аргументы tool-call, храните их в локальном файле за пределами репозитория и передайте путь в окружение процесса Answer42:
@@ -156,11 +196,13 @@ stop_session(session_id="my-session", clean_data=False)
156
196
  ## Требования
157
197
 
158
198
  - Python 3.11+
159
- - 1С:Предприятие 8.3.27+
199
+ - 1С:Предприятие **8.3.27+ или 8.5+**
160
200
  - Пакеты Python: `mcp`, `websockets`, `pydantic`; для скриншотов — `mss`
161
201
  - Linux/X11: `python-xlib`/`wmctrl`/`xdotool`, GUI/Xvfb для headless-сервера
162
202
  - Windows: интерактивная пользовательская desktop-сессия; window-control и screenshots работают через WinAPI/`mss`
163
203
 
204
+ Проверяйте наличие платформы 1С в стандартных каталогах: Linux `/opt/1cv8/x86_64/<version>/` и `/opt/1cv8/i386/<version>/`; Windows `C:\Program Files\1cv8\<version>\bin\` и `C:\Program Files (x86)\1cv8\<version>\bin\`; macOS `/Applications/1cv8/<version>/` или `/opt/1cv8/<version>/`. Для штатной работы нужны `1cv8c` и `ibcmd`; `ibsrv` желателен, но при его отсутствии Answer42 может использовать fallback `/F`. Если автоопределение ошиблось, задайте `ONEC_PLATFORM_DIR`. Для очень медленного старта web-клиента можно увеличить `ONEC_MCP_TEST_CLIENT_READY_TIMEOUT` и timeout MCP-клиента; по умолчанию Answer42 ждёт открытия `-TPort` 55 секунд и затем отдаёт явную ошибку с логами клиента.
205
+
164
206
  ## Безопасность стендов и учётных данных
165
207
 
166
208
  В репозитории не должно быть реальных URL стендов, логинов или паролей. Для штатного запуска передавайте только `base_url`, а логин/пароль храните в локальном credentials-файле, доступном процессу Answer42 через `ONEC_MCP_CREDENTIALS_FILE`.
@@ -229,88 +271,6 @@ E2E_PARALLEL=1 E2E_SESSION_ID=e2e-split python3 scripts/e2e_stable.py
229
271
 
230
272
  `start_session` также переиспользует общий автономный сервер для одинаковой файловой базы. Последний `stop_session` освобождает refcount и завершает shared `ibsrv`.
231
273
 
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
274
  ## Ограничения
315
275
 
316
276
  - Форма пользовательской настройки **«Изменить форму»** частично недоступна для надёжной автоматизации через API клиента тестирования. В частности, команда **«Добавить поля»** в верхней панели формы настройки может быть видна на скриншоте и в диагностическом тексте, но не нажиматься как обычная `ТестируемаяКнопкаФормы`: `click_button` может не находить её, а `activate_object` может вернуть `activated=true` без открытия диалога добавления полей.
@@ -324,65 +284,3 @@ MIT
324
284
  Copyright (c) 2026 Kosolapov Stanislav aka proDOOMman <prodoomman@gmail.com>, Marvin (AI Assistant), 42Clouds, and contributors.
325
285
 
326
286
  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`.
@@ -1,8 +1,6 @@
1
1
  # Answer42
2
2
 
3
- <p align="center">
4
- <img src="docs/assets/answer42-logo.png" alt="Answer42 logo" width="220">
5
- </p>
3
+ ![Answer42 logo](docs/assets/answer42-logo.png)
6
4
 
7
5
  **Answer42** — MCP-инструмент для интерактивного управления UI **1С:Предприятия** через клиент тестирования. Он позволяет AI-агенту открывать формы 1С, нажимать кнопки, заполнять поля, выбирать ссылки из форм выбора, работать с таблицами, динамическими списками и табличными документами.
8
6
 
@@ -52,6 +50,48 @@ start_session(
52
50
 
53
51
  Логин/пароль рекомендуется **не передавать явно**: `start_session` умеет брать их из локального credentials-файла по `base_url`. Параметры `username`/`password` остаются в API для разовых сценариев и обратной совместимости, но при передаче в MCP-вызове они видны вызывающему агенту в аргументах tool-call.
54
52
 
53
+ ## Установка skills
54
+
55
+ PyPI-пакет не записывает agent skills в пользовательские каталоги автоматически. После установки Answer42 поставьте bundled skills отдельной командой:
56
+
57
+ ```bash
58
+ answer42 install-skills
59
+ ```
60
+
61
+ По умолчанию команда устанавливает `answer42` и `answer42-rag` в OpenClaw:
62
+
63
+ ```text
64
+ ~/.openclaw/workspace/skills
65
+ ```
66
+
67
+ Другие агенты и варианты установки:
68
+
69
+ ```bash
70
+ answer42 install-skills --agent claude
71
+ answer42 install-skills --agent codex
72
+ answer42 install-skills --agent opencode
73
+ answer42 install-skills --agent pi
74
+ answer42 install-skills --agent hermes
75
+ answer42 install-skills --agent all
76
+ answer42 install-skills --target-dir /path/to/skills
77
+ answer42 install-skills --list-agents
78
+ answer42 install-skills --dry-run --agent all
79
+ ```
80
+
81
+ Для агентов без стабильного стандарта skill-директорий (`codex`, `opencode`, `pi`, `hermes`) presets best-effort. Если конкретная установка использует другой путь, укажите `--target-dir` явно.
82
+
83
+ ## Инструкция для AI-агентов
84
+
85
+ Если вы AI-агент и пользователь просит установить Answer42 и skills, используйте отдельную инструкцию: [`docs/agent-installation.md`](docs/agent-installation.md).
86
+
87
+ Коротко:
88
+
89
+ 1. установите пакет через `pipx` или virtualenv;
90
+ 2. выполните `answer42 install-skills`;
91
+ 3. подготовьте `ONEC_MCP_CREDENTIALS_FILE` вне репозитория;
92
+ 4. зарегистрируйте MCP-сервер в агентском клиенте;
93
+ 5. проверьте установку через `credentials_check`, затем smoke-сессию `start_session` → `active_window` → `stop_session`.
94
+
55
95
  ## Безопасное хранение логинов и паролей
56
96
 
57
97
  Чтобы креды были доступны MCP-серверу, но не попадали в чат и аргументы tool-call, храните их в локальном файле за пределами репозитория и передайте путь в окружение процесса Answer42:
@@ -122,11 +162,13 @@ stop_session(session_id="my-session", clean_data=False)
122
162
  ## Требования
123
163
 
124
164
  - Python 3.11+
125
- - 1С:Предприятие 8.3.27+
165
+ - 1С:Предприятие **8.3.27+ или 8.5+**
126
166
  - Пакеты Python: `mcp`, `websockets`, `pydantic`; для скриншотов — `mss`
127
167
  - Linux/X11: `python-xlib`/`wmctrl`/`xdotool`, GUI/Xvfb для headless-сервера
128
168
  - Windows: интерактивная пользовательская desktop-сессия; window-control и screenshots работают через WinAPI/`mss`
129
169
 
170
+ Проверяйте наличие платформы 1С в стандартных каталогах: Linux `/opt/1cv8/x86_64/<version>/` и `/opt/1cv8/i386/<version>/`; Windows `C:\Program Files\1cv8\<version>\bin\` и `C:\Program Files (x86)\1cv8\<version>\bin\`; macOS `/Applications/1cv8/<version>/` или `/opt/1cv8/<version>/`. Для штатной работы нужны `1cv8c` и `ibcmd`; `ibsrv` желателен, но при его отсутствии Answer42 может использовать fallback `/F`. Если автоопределение ошиблось, задайте `ONEC_PLATFORM_DIR`. Для очень медленного старта web-клиента можно увеличить `ONEC_MCP_TEST_CLIENT_READY_TIMEOUT` и timeout MCP-клиента; по умолчанию Answer42 ждёт открытия `-TPort` 55 секунд и затем отдаёт явную ошибку с логами клиента.
171
+
130
172
  ## Безопасность стендов и учётных данных
131
173
 
132
174
  В репозитории не должно быть реальных URL стендов, логинов или паролей. Для штатного запуска передавайте только `base_url`, а логин/пароль храните в локальном credentials-файле, доступном процессу Answer42 через `ONEC_MCP_CREDENTIALS_FILE`.
@@ -195,88 +237,6 @@ E2E_PARALLEL=1 E2E_SESSION_ID=e2e-split python3 scripts/e2e_stable.py
195
237
 
196
238
  `start_session` также переиспользует общий автономный сервер для одинаковой файловой базы. Последний `stop_session` освобождает refcount и завершает shared `ibsrv`.
197
239
 
198
- ## MCP-инструменты
199
-
200
- ### Жизненный цикл
201
-
202
- - `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` объединяются через `;`.
203
- - `session_status(session_id)` — состояние bridge, runtime, клиента тестирования и RAG snapshot.
204
- - `stop_session(session_id, clean_data)` — отключение клиента тестирования и остановка всех процессов, Xvfb и bridge.
205
-
206
- ### Автоматизация UI
207
-
208
- - `active_window()` — активное окно тестируемого приложения через `ТестируемоеПриложение.ПолучитьАктивноеОкно()`.
209
- - `windows_list(max_depth)` — список окон тестируемого приложения; если открыто два окна клиента, возвращает оба, потому что читает подчинённые объекты `ТестируемоеПриложение`, а не окна менеджера тестирования.
210
- - `activate_window(index, title, name)` — переключить активное окно по индексу, заголовку или имени.
211
- - `goto_start_page()`, `goto_previous_window()`, `goto_next_window()` — навигация основного окна: `ПерейтиКНачальнойСтранице`, `ПерейтиКПредыдущемуОкну`, `ПерейтиКСледующемуОкну`.
212
- - `ui_tree(max_depth, include_rag_types, include_hidden, rag_snapshot)` — дерево UI с `visible`, `available`, `enabled`, `read_only`; скрытые элементы и неактивные страницы page-group по умолчанию опускаются, `include_hidden=true` возвращает полное дерево. RAG-типы добавляются, когда доступен индекс метаданных.
213
- - `command_bar()` — диагностическая информация по командной панели, когда она доступна API тест-клиента.
214
- - `current_element()` — диагностическая информация по текущему элементу, когда она доступна API тест-клиента.
215
- - `find_object(name, title, type)` — найти объект в дереве UI.
216
- - `activate_object(name, title, type)` — активировать объект.
217
- - `open_navigation_link(navigation_link)` — открыть навигационную ссылку `e1cib/...`.
218
- - `click_button(name, search_by_title)` — нажать кнопку.
219
- - `set_field_value(field_name, value, search_by_title)` — установить значение поля.
220
- - `create_new_item()` — создать новый элемент.
221
- - `save_form()` — сохранить форму.
222
- - `close_form()` — закрыть форму.
223
- - `screenshot(path)` — скриншот экрана.
224
-
225
- ### Таблицы и табличные части
226
-
227
- - `table_rows(...)` — строки таблицы.
228
- - `table_find_row(...)` — найти строку по подстроке.
229
- - `table_goto_row(...)` — перейти к строке.
230
- - `table_current_row(...)` — текущая строка.
231
- - `table_selected_rows(...)` — выделенные строки.
232
- - `table_set_field(...)` — установить значение в ячейке.
233
- - `table_choose_field_from_list(...)` — открыть форму выбора для ссылочного поля в строке табличной части.
234
- - `table_edit_info(...)` — информация о редактировании таблицы.
235
- - `table_move_row(...)` — перейти к первой/следующей/предыдущей/последней строке.
236
-
237
- ### Динамические списки
238
-
239
- - `dynamic_list_available_fields(object, rag_snapshot)` — поля, доступные для отбора/сортировки по RAG-индексу.
240
- - `dynamic_list_apply_settings(filters, orders, clear_first)` — применить сортировки через API тест-клиента и best-effort отборы через стандартную форму **Настроить список**.
241
- - `dynamic_list_set_order(column_title, name="Список")` — сортировка по видимому заголовку колонки.
242
- - `dynamic_list_output()` — команда **Вывести список** с возвратом текста табличного документа, когда он доступен.
243
- - `dynamic_list_open_settings()` — открыть **Настроить список**.
244
- - `dynamic_list_clear_settings()` — сбросить настройки динамического списка.
245
- - `dynamic_list_open_form_settings()` — открыть **Изменить форму**.
246
-
247
- ### Табличные документы
248
-
249
- - `tabular_documents(include_text)` — список табличных документов в активном окне.
250
- - `tabular_document_text(...)` — текст табличного документа.
251
- - `tabular_document_save(path, format)` — сохранить табличный документ в выбранном формате.
252
-
253
-
254
- ### Доказательная запись
255
-
256
- - `recording_start(output_dir, display, window)` — включить доказательную запись.
257
- - `recording_capture(action, note)` — вручную добавить доказательный слайд.
258
- - `recording_stop()` — собрать `manifest.json`, `recording.pdf` (если доступен backend PDF).
259
-
260
- ### RAG / индекс метаданных
261
-
262
- - `rag_source_add(name, path, kind, format="auto")` — зарегистрировать источник; формат определяется автоматически при `format="auto"`.
263
- - `rag_sources_list()` — список источников.
264
- - `rag_snapshot_create(name, base, extensions, sources)` — создать effective snapshot.
265
- - `rag_snapshots_list()` — список snapshot-ов.
266
- - `rag_index_build(snapshot, source)` — построить индекс.
267
- - `rag_lookup_object(object, snapshot)` — найти объект метаданных.
268
- - `rag_query(query, snapshot, limit)` — полнотекстовый поиск.
269
-
270
- CLI-пример:
271
-
272
- ```bash
273
- python3 scripts/rag_cli.py add-source Configuration /path/to/configuration/src --kind base
274
- python3 scripts/rag_cli.py add-source Extension1 /path/to/extension/src --kind extension
275
- python3 scripts/rag_cli.py snapshot Configuration+Extension1 --base Configuration --extension Extension1
276
- python3 scripts/rag_cli.py build --snapshot Configuration+Extension1
277
- python3 scripts/rag_cli.py lookup РегистрСведений.Регистр1 --snapshot Configuration+Extension1
278
- ```
279
-
280
240
  ## Ограничения
281
241
 
282
242
  - Форма пользовательской настройки **«Изменить форму»** частично недоступна для надёжной автоматизации через API клиента тестирования. В частности, команда **«Добавить поля»** в верхней панели формы настройки может быть видна на скриншоте и в диагностическом тексте, но не нажиматься как обычная `ТестируемаяКнопкаФормы`: `click_button` может не находить её, а `activate_object` может вернуть `activated=true` без открытия диалога добавления полей.
@@ -290,65 +250,3 @@ MIT
290
250
  Copyright (c) 2026 Kosolapov Stanislav aka proDOOMman <prodoomman@gmail.com>, Marvin (AI Assistant), 42Clouds, and contributors.
291
251
 
292
252
  Licensed under the MIT License.
293
-
294
- ## Публикация пакета
295
-
296
- Рекомендуемый канал установки для пользователей — PyPI:
297
-
298
- ```bash
299
- pipx install 'answer42[screenshot,linux-window-control]'
300
- # Windows:
301
- # pipx install "answer42[screenshot,windows-window-control]"
302
- ```
303
-
304
- Публикация автоматизирована в `.gitlab-ci.yml` и оставлена только для PyPI:
305
-
306
- 1. tag `vX.Y.Z` запускает unit/ruff/package checks;
307
- 2. `package` собирает wheel/sdist и проверяет их через `twine check`;
308
- 3. `publish_pypi` публикует wheel/sdist в PyPI через `PYPI_API_TOKEN`;
309
- 4. `create_gitlab_release` создаёт GitLab Release для tag.
310
-
311
-
312
- One-command релиз:
313
-
314
- ```bash
315
- answer42 release 0.2.1
316
- ```
317
-
318
- Команда меняет `pyproject.toml`, создаёт commit `Release v0.2.1`, annotated tag `v0.2.1`, пушит branch и tag. Tag запускает CI: публикацию в PyPI и создание GitLab Release.
319
-
320
- Секрет GitLab CI:
321
-
322
- - `PYPI_API_TOKEN` — PyPI token для проекта `answer42`.
323
-
324
- Перед релизом проверьте, что `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`.
325
-
326
- ### Установка packaged skills
327
-
328
- PyPI сам по себе не устанавливает agent skills в пользовательские каталоги, поэтому в CLI добавлена команда:
329
-
330
- ```bash
331
- answer42 install-skills
332
- ```
333
-
334
- По умолчанию она устанавливает `answer42` и `answer42-rag` в OpenClaw:
335
-
336
- ```text
337
- ~/.openclaw/workspace/skills
338
- ```
339
-
340
- Другие агенты/варианты:
341
-
342
- ```bash
343
- answer42 install-skills --agent claude
344
- answer42 install-skills --agent codex
345
- answer42 install-skills --agent opencode
346
- answer42 install-skills --agent pi
347
- answer42 install-skills --agent hermes
348
- answer42 install-skills --agent all
349
- answer42 install-skills --target-dir /path/to/skills
350
- answer42 install-skills --list-agents
351
- answer42 install-skills --dry-run --agent all
352
- ```
353
-
354
- Для агентов без стабильного стандарта skill-директорий (`codex`, `opencode`, `pi`, `hermes`) presets best-effort; если у конкретной установки другой путь, используйте `--target-dir`.