From e1719efbc8809581d12a69cf67785ae467952dc7 Mon Sep 17 00:00:00 2001 From: RC-CHN <1051989940@qq.com> Date: Thu, 26 Feb 2026 10:45:03 +0800 Subject: [PATCH] fix(skills): normalize release stage and handle rollback skip Normalize release stage values before stability checks so enum-like objects and mixed-case strings are handled consistently. When stable sync fails, treat "no previous release exists" during auto-rollback as a skipped rollback instead of raising a secondary runtime error --- astrbot/core/skills/neo_skill_sync.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/astrbot/core/skills/neo_skill_sync.py b/astrbot/core/skills/neo_skill_sync.py index 6f37b9f03..b07daaa3a 100644 --- a/astrbot/core/skills/neo_skill_sync.py +++ b/astrbot/core/skills/neo_skill_sync.py @@ -173,7 +173,9 @@ class NeoSkillSyncManager: raise ValueError("release_id or skill_key is required for sync.") release_id_val = str(release.get("id") or "") - release_stage = str(release.get("stage") or "") + release_stage_raw = release.get("stage") + release_stage_value = getattr(release_stage_raw, "value", release_stage_raw) + release_stage = str(release_stage_value or "").strip().lower() skill_key_val = str(release.get("skill_key") or "") candidate_id = str(release.get("candidate_id") or "") @@ -181,7 +183,8 @@ class NeoSkillSyncManager: raise ValueError("Release payload is incomplete.") if require_stable and release_stage != "stable": raise ValueError( - f"Only stable releases can be synced to local SKILL.md (got: {release_stage})." + "Only stable releases can be synced to local SKILL.md " + f"(got: {release_stage_raw})." ) candidate = await client.skills.get_candidate(candidate_id) @@ -268,10 +271,17 @@ class NeoSkillSyncManager: ) rollback_json = _to_jsonable(rollback) except Exception as rollback_err: - raise RuntimeError( - "stable release synced failed and auto rollback also failed; " - f"sync_error={sync_error}; rollback_error={rollback_err}" - ) from rollback_err + rollback_msg = str(rollback_err) + if "no previous release exists" in rollback_msg.lower(): + rollback_json = { + "skipped": True, + "reason": rollback_msg, + } + else: + raise RuntimeError( + "stable release synced failed and auto rollback also failed; " + f"sync_error={sync_error}; rollback_error={rollback_err}" + ) from rollback_err return { "release": release_json,