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.
This commit is contained in:
parent
385bd5c8ce
commit
b243e67870
11 changed files with 439 additions and 131 deletions
62
resources/commands/github_pr/summarize.lua
Normal file
62
resources/commands/github_pr/summarize.lua
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
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))
|
||||
Loading…
Add table
Add a link
Reference in a new issue