feat: Wave 1 python parity — 20 new commands (154 → 174)

Mirrors all 10 packs from rust commit c4b2261 to python.

wave1_handlers.py (new, ~480 lines)
  Self-contained module with 20 handlers + DPAPI helpers + http/ps wrappers.
  Imports memory_store for state-backed packs (vault, clip, habit, rss, weather).

  Coverage:
    do_magic_8ball         — 15 random answers
    do_github_list_issues  — gh issue list (uses memory[github.repo])
    do_github_my_issues    — gh issue list --assignee @me
    do_weather_tomorrow    — Open-Meteo + ipinfo auto-detect
    do_weather_week        — 7-day forecast min/max range
    do_rss_add/read/list   — RSS subscriptions + parse <title> tags
    do_ics_create          — write .ics, open via os.startfile
    do_backup_export       — zipfile of long_term_memory.json + schedule + macros
                              + profiles/ + active_profile + llm_backend + settings
                              (searches script_dir + %APPDATA%/Jarvis)
    do_clip_save/list/restore — 20-slot rolling clipboard history in memory
    do_notif_missed/clear  — enumerate memory[notif.*] / purge
    do_vault_save/get/list — DPAPI encrypt via PowerShell, clears clipboard
                              after 30 sec via threading.Thread
    do_habit_checkin/streak — date-keyed memory state, consecutive-day counter

extensions.py: +20 proxy functions + wave1_handlers import + set_speak wiring.

main.py: +20 dispatch entries.

commands.yaml: +20 entries (154 → 174).

Tests: ast.parse passes for all .py files. 42 pytest still green.
This commit is contained in:
Bossiara13 2026-05-16 01:08:17 +03:00
parent 4e62049a98
commit 2bef1d5ea7
4 changed files with 839 additions and 0 deletions

40
main.py
View file

@ -1636,6 +1636,46 @@ def run_action(action):
extensions.do_world_clock(action, _current_voice or '')
elif t == 'daily_quote':
extensions.do_daily_quote(action, _current_voice or '')
elif t == 'magic_8ball':
extensions.do_magic_8ball(action, _current_voice or '')
elif t == 'gh_list_issues':
extensions.do_gh_list_issues(action, _current_voice or '')
elif t == 'gh_my_issues':
extensions.do_gh_my_issues(action, _current_voice or '')
elif t == 'weather_tomorrow':
extensions.do_weather_tomorrow(action, _current_voice or '')
elif t == 'weather_week':
extensions.do_weather_week(action, _current_voice or '')
elif t == 'rss_add':
extensions.do_rss_add(action, _current_voice or '')
elif t == 'rss_read':
extensions.do_rss_read(action, _current_voice or '')
elif t == 'rss_list':
extensions.do_rss_list(action, _current_voice or '')
elif t == 'ics_create':
extensions.do_ics_create(action, _current_voice or '')
elif t == 'backup_export':
extensions.do_backup_export(action, _current_voice or '')
elif t == 'clip_save':
extensions.do_clip_save(action, _current_voice or '')
elif t == 'clip_list':
extensions.do_clip_list(action, _current_voice or '')
elif t == 'clip_restore':
extensions.do_clip_restore(action, _current_voice or '')
elif t == 'notif_missed':
extensions.do_notif_missed(action, _current_voice or '')
elif t == 'notif_clear':
extensions.do_notif_clear(action, _current_voice or '')
elif t == 'vault_save':
extensions.do_vault_save(action, _current_voice or '')
elif t == 'vault_get':
extensions.do_vault_get(action, _current_voice or '')
elif t == 'vault_list':
extensions.do_vault_list(action, _current_voice or '')
elif t == 'habit_checkin':
extensions.do_habit_checkin(action, _current_voice or '')
elif t == 'habit_streak':
extensions.do_habit_streak(action, _current_voice or '')
_current_voice: str = ''