J.A.R.V.I.S-py/tools/command_builder
Bossiara13 a4171ec6b1 feat(url): optional browser field (yandex/chrome/firefox/edge)
Adds optional 'browser' field to url-action; runtime resolves it via
config.BROWSER_PATHS (subprocess.Popen with the chosen exe). When
omitted, falls back to webbrowser.open (system default). Constructor
GUI gains a browser dropdown on URL action and on multi-step URL.
Existing open_browser/youtube/google updated to use yandex by default
since user prefers Yandex Browser.
2026-04-27 20:06:26 +03:00
..
tests feat(tools): yaml writer with ruamel (preserves comments, atomic + backup) 2026-04-22 23:17:24 +03:00
web feat(url): optional browser field (yandex/chrome/firefox/edge) 2026-04-27 20:06:26 +03:00
__init__.py feat(tools): scaffold command builder schema 2026-04-22 23:17:17 +03:00
__main__.py feat(tools): pywebview bootstrap + python bridge API 2026-04-22 23:21:20 +03:00
app.py feat(ui): keyboard nav (Enter advances step) + yaml-health warning on launch 2026-04-23 02:13:43 +03:00
llm_suggest.py feat(tools): llm-suggest via groq with JSON response format 2026-04-23 02:11:45 +03:00
README.md docs: command builder README + user-facing README section + run_builder.bat 2026-04-23 02:13:47 +03:00
schema.py feat(url): optional browser field (yandex/chrome/firefox/edge) 2026-04-27 20:06:26 +03:00
yaml_writer.py feat(tools): yaml writer with ruamel (preserves comments, atomic + backup) 2026-04-22 23:17:24 +03:00

Конструктор команд (developer notes)

GUI-надстройка для редактирования commands.yaml без ручной правки YAML. Запускается отдельным процессом, не зависит от рантайма Jarvis.

Запуск

python -m tools.command_builder

или из корня репо run_builder.bat.

Стек

  • pywebview (бэкенд EdgeWebView2 на Windows) — оборачивает локальный HTML.
  • Frontend — vanilla JS + CSS, без сборки. Vendored js-yaml только для предпросмотра YAML на стороне UI.
  • ruamel.yaml — чтение/запись commands.yaml с сохранением комментариев и форматирования.
  • pyautogui — рантайм для action-типа keys.

Структура

tools/command_builder/
  __main__.py        точка входа python -m
  app.py             pywebview bootstrap + Python bridge (js_api)
  schema.py          dataclass-схема action-блоков и валидация
  yaml_writer.py     atomic write + .bak бэкап перед каждой записью
  llm_suggest.py     Groq/OpenAI SDK 1.x, response_format=json_object
  web/               frontend
  tests/             pytest для schema + writer

Bridge API (методы класса Bridge в app.py)

Все методы возвращают сериализуемые структуры. Ошибки идут как {"ok": false, "error": "..."}.

метод назначение
list_existing_commands() список ключей верхнего уровня в commands.yaml
list_exes() basename'ы *.exe из custom-commands/
list_sound_names() разрешённые имена для play_sound (из schema.VALID_SOUND_NAMES)
preview_sound(name) проигрывает звук в фоновом потоке через simpleaudio
slugify(phrase) транслит для генерации cmd_id
validate_draft(json_str) прогон через command_from_dict
save_command(json_str) append/upsert + бэкап (overwrite: true чтобы перезаписать)
llm_suggest(prompt) Groq → JSON → провалидированный action-блок

Расширение схемы (новый тип action)

  1. В schema.py: добавить dataclass с полем type и методом to_dict(). Включить в Union Action. Расширить action_from_dict().
  2. В tests/test_schema.py: добавить roundtrip + negative-case тесты.
  3. В web/app.js:
    • карточка в #action-grid (index.html);
    • ветка в renderActionForm();
    • ветка в updateAction();
    • ветка в renderInlineEditor() для использования внутри multi.steps.
  4. В main.pyrun_action(): обработчик нового type.
  5. В llm_suggest.py_ACTION_SCHEMA_DOC: описание для LLM.

Бэкапы

yaml_writer.append_command / upsert_command перед записью копируют commands.yaml в commands.yaml.bak (через shutil.copy2). При запуске app.py вызывается _check_yaml_health() — если основной файл не парсится, в stderr печатается путь к .bak для ручного восстановления.

Тесты

.venv\Scripts\python.exe -m pytest tools/command_builder/tests/