feat: Wave 1 — 10 new packs (75 → 85 rust packs)

User picked from the fishki roadmap; this commit ships the 10 easy/medium
ones in one batch. No Rust core changes — all pure Lua + jarvis.* APIs.

Pack catalog

magic_8ball
  - "ответь да или нет" / "магический шар" / "что скажешь"
  - 15 канонических ответов, random pick. Pure fun.

github_issues (2 cmds)
  - "какие issues" / "открытые issues" — gh issue list по сохранённому репо
  - "мои issues" / "что мне назначено" — gh issue list --assignee @me

weather_extended (2 cmds, Open-Meteo, no key)
  - "погода завтра" — temp min/max + conditions + rain note
  - "прогноз на неделю" — общий диапазон температур
  - Auto-detects location via ipinfo.io if not in memory; stores lat/lon/city.

rss_reader (3 cmds)
  - "добавь rss <url>" — extracts URL, persists via memory под ключом "rss.<domain>"
  - "что в ленте" — fetches first feed, parses <title> tags, speaks top 3
  - "какие у меня rss" — lists subscribed feed domains

ics_event
  - "добавь встречу завтра в 15:00 обсудить проект"
  - Parses time (HH:MM или "в HH") + date keywords (сегодня/завтра/послезавтра)
  - Writes valid iCalendar v2.0 file to ~/Documents/jarvis-events/
  - jarvis.system.open → дефолтный handler (Outlook/Mail/whatever)

backup
  - "сделай бекап" — PowerShell Compress-Archive всех state files из APPDATA/Jarvis
  - Outputs to ~/Documents/jarvis-backup-<YYYYMMDD-HHMMSS>.zip
  - Bundles: long_term_memory, schedule, macros, profiles/, active_profile, llm_backend, settings

clip_history (3 cmds, 20-slot rolling buffer)
  - "запиши буфер" — push current clipboard onto memory keys clip.0..clip.19
  - "что я копировал" — speak preview of last 3
  - "верни первый/второй/третий буфер" — restore clip.N to clipboard

notif_queue (2 cmds)
  - "что я пропустил" — enumerate memory keys "notif.*", speak last 5 by recency
  - "очисти уведомления" — purge all notif.* keys
  - Producers (scheduler/macros/llm) can later push to memory[notif.<ts>] = text

password_vault (3 cmds, Windows DPAPI)
  - "сохрани пароль от GitHub" — encrypts current clipboard content via DPAPI
    (CurrentUser scope), base64-stored in memory[vault.GitHub]. Clears clipboard.
    Password is NEVER spoken or written to disk in plaintext.
  - "пароль от GitHub" — decrypts via DPAPI, restores to clipboard for 30 sec,
    schedules auto-clear via jarvis.scheduler. Speaks only "Пароль от X в буфере."
  - "какие у меня пароли" — list of stored service names.

habit_streaks (2 cmds, integrates with habit_nudge)
  - "сколько дней подряд" / "статистика привычек" — reads memory keys
    "habit_streak.<habit>.<YYYY-MM-DD>", computes consecutive-day streak per habit.
  - "я попил воды" / "отметь привычку" — marks today's check-in.
    Maps voice to habit: воды→water, размял/зарядк→stretch, глаз→eyes.

Tests: 6 commands tests pass (auto-validate the 10 new packs).
This commit is contained in:
Bossiara13 2026-05-16 01:04:23 +03:00
parent 4d3d664abd
commit c4b22618f8
30 changed files with 1086 additions and 0 deletions

View file

@ -0,0 +1,19 @@
# Backup all user state (memory, profiles, schedule, macros) to a ZIP.
[[commands]]
id = "backup.export"
type = "lua"
script = "export.lua"
sandbox = "full"
timeout = 10000
[commands.phrases]
ru = [
"сделай бекап",
"экспортируй настройки",
"сохрани мои настройки",
"экспорт данных",
"выгрузи настройки",
]
en = ["backup", "export settings"]
ua = ["зроби бекап", "експортуй налаштування"]

View file

@ -0,0 +1,46 @@
-- Zip all user-state JSON files into ~/Documents/jarvis-backup-<ts>.zip.
local t = jarvis.context.time
local stamp = string.format("%04d%02d%02d-%02d%02d%02d",
t.year, t.month, t.day, t.hour, t.minute, t.second or 0)
local userprofile = jarvis.system.env("USERPROFILE") or "C:\\Users\\Public"
local out_zip = userprofile .. "\\Documents\\jarvis-backup-" .. stamp .. ".zip"
-- The state files live under <APP_CONFIG_DIR>. We can't easily read that path
-- from Lua, but the user can navigate from %APPDATA%/Jarvis. So we ask
-- PowerShell to do the discovery + zip in one shot.
local ps = string.format([[
$cfg = Join-Path $env:APPDATA 'Jarvis';
if (-not (Test-Path $cfg)) { Write-Output 'NOCFG'; exit };
$files = @();
foreach ($n in @('long_term_memory.json','schedule.json','macros.json','active_profile.txt','llm_backend.txt','settings.json')) {
$p = Join-Path $cfg $n;
if (Test-Path $p) { $files += $p }
};
$profiles_dir = Join-Path $cfg 'profiles';
if (Test-Path $profiles_dir) {
$files += Get-ChildItem $profiles_dir -File | ForEach-Object { $_.FullName }
};
if ($files.Count -eq 0) { Write-Output 'NONE'; exit };
Compress-Archive -Path $files -DestinationPath '%s' -Force;
Write-Output ('OK|' + $files.Count)
]], out_zip:gsub("'", "''"))
local res = jarvis.system.exec(string.format(
'powershell -NoProfile -Command "%s"', ps:gsub('"', '\\"'):gsub("\r?\n", "; ")
))
if not res.success then
return jarvis.cmd.error("Не получилось создать бекап.")
end
local out = (res.stdout or ""):gsub("^%s+", ""):gsub("%s+$", "")
if out == "NOCFG" then
return jarvis.cmd.not_found("Папка настроек не найдена.")
end
if out == "NONE" then
return jarvis.cmd.not_found("Нечего бекапить — нет данных.")
end
local count = out:match("OK|(%d+)") or "?"
jarvis.system.notify("Backup готов", out_zip)
return jarvis.cmd.ok(string.format("Бекап сохранён, %s файлов.", count))