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

View file

@ -27,6 +27,7 @@ import scheduler_store
import vision_handler
import dev_handlers
import llm_backend
import wave1_handlers
_speak_fn = print
_set_clipboard_fn = None
@ -39,6 +40,7 @@ def set_speak(fn):
scheduler_store.set_speak(fn)
vision_handler.set_speak(fn)
dev_handlers.set_speak(fn)
wave1_handlers.set_speak(fn)
def set_clipboard_fn(fn):
@ -1093,3 +1095,27 @@ def do_github_list_prs(action, voice):
def do_github_summarize_pr(action, voice):
dev_handlers.do_github_summarize_pr(action, voice)
# ── Wave 1 proxies (to wave1_handlers) ──────────────────────────────────────
def do_magic_8ball(a, v): wave1_handlers.do_magic_8ball(a, v)
def do_gh_list_issues(a, v): wave1_handlers.do_github_list_issues(a, v)
def do_gh_my_issues(a, v): wave1_handlers.do_github_my_issues(a, v)
def do_weather_tomorrow(a, v): wave1_handlers.do_weather_tomorrow(a, v)
def do_weather_week(a, v): wave1_handlers.do_weather_week(a, v)
def do_rss_add(a, v): wave1_handlers.do_rss_add(a, v)
def do_rss_read(a, v): wave1_handlers.do_rss_read(a, v)
def do_rss_list(a, v): wave1_handlers.do_rss_list(a, v)
def do_ics_create(a, v): wave1_handlers.do_ics_create(a, v)
def do_backup_export(a, v): wave1_handlers.do_backup_export(a, v)
def do_clip_save(a, v): wave1_handlers.do_clip_save(a, v)
def do_clip_list(a, v): wave1_handlers.do_clip_list(a, v)
def do_clip_restore(a, v): wave1_handlers.do_clip_restore(a, v)
def do_notif_missed(a, v): wave1_handlers.do_notif_missed(a, v)
def do_notif_clear(a, v): wave1_handlers.do_notif_clear(a, v)
def do_vault_save(a, v): wave1_handlers.do_vault_save(a, v)
def do_vault_get(a, v): wave1_handlers.do_vault_get(a, v)
def do_vault_list(a, v): wave1_handlers.do_vault_list(a, v)
def do_habit_checkin(a, v): wave1_handlers.do_habit_checkin(a, v)
def do_habit_streak(a, v): wave1_handlers.do_habit_streak(a, v)