J.A.R.V.I.S-rust/resources/commands/github_pr/summarize.lua
Bossiara13 b243e67870 feat: Tauri backend commands + wikipedia rewrite + github PR review pack
GUI integration
  - crates/jarvis-gui/src/tauri_commands/backends.rs — 5 new Tauri commands:
      get_active_backends()  -> {tts, llm, llm_model, profile}
      set_llm_backend(name)  -> swap LLM hot, persists to DB
      set_tts_backend(name)  -> persist choice (effective on jarvis-app restart)
      llm_reset_context()    -> clear conversation history
      llm_get_last_reply()   -> last assistant message or null
  - Registered in main.rs invoke_handler. Svelte side can now read active
    backend + swap from a settings page / footer without env-var gymnastics.

Wikipedia pack rewritten (resources/commands/wikipedia/)
  - Old `wiki/wiki.lua` (104 lines, hand-rolled Groq HTTP + inline SAPI PS) deleted.
  - Replacement `wikipedia/summary.lua` (87 lines):
    * REST summary endpoint (cleaner than opensearch+summary chain).
    * Russian first, English fallback with LLM translation.
    * Pure LLM fallback if Wikipedia has no article.
    * Uses jarvis.cmd.{ok,error,not_found} + jarvis.llm + jarvis.speak (no
      inline PowerShell SAPI). Phrases kept compatible with old pack.

GitHub PR voice review (resources/commands/github_pr/, 3 commands)
  - "текущий репо bossiara13/J.A.R.V.I.S-rust"  → github.set_repo
    Persists repo via jarvis.memory.
  - "какие пиары" / "открытые пиары"            → github.list_prs
    Calls `gh pr list --json number,title,author,createdAt --limit 10`.
    Parses count + first 3 titles by regex from JSON.
  - "разбери последний пиар" / "что в pr"       → github.summarize_pr
    `gh pr view N --json title,body,additions,deletions,changedFiles,author`,
    sends to LLM with "senior reviewer" system prompt, speaks 3-5 sentence
    review focusing on changes, risks, merge-readiness.
  - Requires gh CLI installed and `gh auth login` done.

Tests: 52/52 jarvis-core unit tests pass (Wikipedia pack TOML/script auto-checked).
Build: cargo build --release -p jarvis-app -p jarvis-gui green.
2026-05-15 16:31:54 +03:00

62 lines
2.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local repo = jarvis.memory.recall("github.repo")
if not repo or repo == "" then
return jarvis.cmd.not_found("Сначала укажите репозиторий: текущий репо owner/repo.")
end
-- get the most recent PR's number
local list = jarvis.system.exec(string.format(
'gh pr list --repo "%s" --state open --json number --limit 1',
repo
))
if not list or not list.success then
return jarvis.cmd.error("gh CLI не отвечает.")
end
local number = (list.stdout or ""):match('"number"%s*:%s*(%d+)')
if not number then
return jarvis.cmd.ok("Открытых пиаров нет.")
end
-- fetch title + body + diff stat
local detail = jarvis.system.exec(string.format(
'gh pr view %s --repo "%s" --json title,body,additions,deletions,changedFiles,author',
number, repo
))
if not detail or not detail.success then
return jarvis.cmd.error("Не получилось получить PR.")
end
local d = detail.stdout or ""
local title = d:match('"title"%s*:%s*"([^"]*)"') or "(no title)"
local body = d:match('"body"%s*:%s*"(.-)"') or ""
body = body:gsub("\\n", "\n"):gsub("\\r", " "):gsub('\\"', '"'):gsub("\\\\", "\\")
local additions = d:match('"additions"%s*:%s*(%d+)') or "?"
local deletions = d:match('"deletions"%s*:%s*(%d+)') or "?"
local files = d:match('"changedFiles"%s*:%s*(%d+)') or "?"
local author = d:match('"login"%s*:%s*"([^"]*)"') or "(unknown)"
-- Trim body for prompt
if #body > 3000 then body = body:sub(1, 3000) .. "\n... [truncated]" end
local user_prompt = string.format([[
Repo: %s
PR #%s: %s
Author: %s
Changed files: %s (+%s, -%s)
Description:
%s
Кратко (3-5 предложений) на русском объясни: что меняет этот PR, какие риски, стоит ли мёржить.
]], repo, number, title, author, files, additions, deletions, body)
local review = jarvis.llm({
{ role = "system", content = "Ты — старший разработчик, делаешь код-ревью. Отвечай по делу, без воды, без 'отличный PR' вступлений." },
{ role = "user", content = user_prompt }
}, { max_tokens = 400, temperature = 0.2 })
if not review or review == "" then
return jarvis.cmd.error("Не получилось проанализировать.")
end
jarvis.system.notify(string.format("PR #%s — %s", number, title), review:sub(1, 250))
return jarvis.cmd.ok(string.format("Пиар номер %s: %s", number, review))