@@ -106,6 +106,53 @@ describe("renderSkills", () => {
106106 }
107107 } ) ;
108108
109+ it ( "does not transfer toggle state when a skill leaves the disabled tab" , async ( ) => {
110+ const container = document . createElement ( "div" ) ;
111+ document . body . append ( container ) ;
112+ dialogRestores . push ( ( ) => container . remove ( ) ) ;
113+
114+ const passwordSkill = createSkill ( { skillKey : "1password" , name : "1Password" , disabled : true } ) ;
115+ const appleNotesSkill = createSkill ( {
116+ skillKey : "apple-notes" ,
117+ name : "Apple Notes" ,
118+ disabled : true ,
119+ } ) ;
120+ const report : SkillStatusReport = {
121+ workspaceDir : "/tmp/workspace" ,
122+ managedSkillsDir : "/tmp/skills" ,
123+ skills : [ passwordSkill , appleNotesSkill ] ,
124+ } ;
125+
126+ render ( renderSkills ( createProps ( { report, statusFilter : "disabled" } ) ) , container ) ;
127+ await Promise . resolve ( ) ;
128+
129+ const toggles = container . querySelectorAll < HTMLInputElement > ( ".skill-toggle" ) ;
130+ expect ( toggles ) . toHaveLength ( 2 ) ;
131+ expect ( toggles [ 0 ] . checked ) . toBe ( false ) ;
132+ expect ( toggles [ 1 ] . checked ) . toBe ( false ) ;
133+
134+ // Simulate the user clicking the 1password toggle before the re-render propagates.
135+ // Without repeat(), Lit's dirty-check skips re-setting `.checked = false` on the reused
136+ // DOM node, so apple-notes inherits this stale user-driven state.
137+ toggles [ 0 ] . checked = true ;
138+
139+ const updatedReport : SkillStatusReport = {
140+ workspaceDir : "/tmp/workspace" ,
141+ managedSkillsDir : "/tmp/skills" ,
142+ skills : [ { ...passwordSkill , disabled : false } , appleNotesSkill ] ,
143+ } ;
144+
145+ render (
146+ renderSkills ( createProps ( { report : updatedReport , statusFilter : "disabled" } ) ) ,
147+ container ,
148+ ) ;
149+ await Promise . resolve ( ) ;
150+
151+ const updatedToggles = container . querySelectorAll < HTMLInputElement > ( ".skill-toggle" ) ;
152+ expect ( updatedToggles ) . toHaveLength ( 1 ) ;
153+ expect ( updatedToggles [ 0 ] . checked ) . toBe ( false ) ;
154+ } ) ;
155+
109156 it ( "defers detail dialog opening until the dialog is connected" , async ( ) => {
110157 const container = document . createElement ( "div" ) ;
111158 const showModal = vi . fn ( function ( this : HTMLDialogElement ) {
0 commit comments