feat: add skill update detection via SHA-256 content hashing

- Add content_hash and updated_at fields to skills table (DB migration v6→v7)
- Compute directory content hash on install/import/restore for version tracking
- Add check_updates command: downloads repos, compares hashes, returns update list
- Add update_skill command: backs up old files, re-downloads and replaces SSOT
- Backfill content_hash for existing skills on first update check
- Add "Check Updates" button and per-skill update badge/button in UnifiedSkillsPanel
- Add i18n keys for zh/en/ja
This commit is contained in:
Jason
2026-04-05 19:19:01 +08:00
parent 46488ecd93
commit e3179ad9e4
13 changed files with 660 additions and 14 deletions
+28 -1
View File
@@ -8,7 +8,7 @@ use crate::app_config::{AppType, InstalledSkill, UnmanagedSkill};
use crate::error::format_skill_error;
use crate::services::skill::{
DiscoverableSkill, ImportSkillSelection, Skill, SkillBackupEntry, SkillRepo, SkillService,
SkillUninstallResult,
SkillUninstallResult, SkillUpdateInfo,
};
use crate::store::AppState;
use std::sync::Arc;
@@ -134,6 +134,33 @@ pub async fn discover_available_skills(
.map_err(|e| e.to_string())
}
/// 检查 Skills 更新
#[tauri::command]
pub async fn check_skill_updates(
service: State<'_, SkillServiceState>,
app_state: State<'_, AppState>,
) -> Result<Vec<SkillUpdateInfo>, String> {
service
.0
.check_updates(&app_state.db)
.await
.map_err(|e| e.to_string())
}
/// 更新单个 Skill
#[tauri::command]
pub async fn update_skill(
id: String,
service: State<'_, SkillServiceState>,
app_state: State<'_, AppState>,
) -> Result<InstalledSkill, String> {
service
.0
.update_skill(&app_state.db, &id)
.await
.map_err(|e| e.to_string())
}
// ========== 兼容旧 API 的命令 ==========
/// 获取技能列表(兼容旧 API)