99import pytest
1010
1111from code_assistant_manager .skills import (
12+ DEFAULT_SKILL_REPOS ,
13+ SKILL_INSTALL_DIRS ,
1214 Skill ,
1315 SkillManager ,
1416 SkillRepo ,
15- SKILL_INSTALL_DIRS ,
16- DEFAULT_SKILL_REPOS ,
1717)
1818
1919
@@ -210,18 +210,18 @@ def test_manager_delete(self, temp_config_dir):
210210 manager = SkillManager (temp_config_dir )
211211 skill = Skill (key = "test" , name = "Test" , description = "Desc" , directory = "/path" )
212212 manager .create (skill )
213-
213+
214214 manager .delete ("test" )
215215 assert manager .get ("test" ) is None
216216
217217 def test_manager_add_remove_repo (self , temp_config_dir ):
218218 """Test adding and removing skill repos."""
219219 manager = SkillManager (temp_config_dir )
220-
220+
221221 # Get initial count (includes default repos)
222222 initial_repos = manager .get_repos ()
223223 initial_count = len (initial_repos )
224-
224+
225225 repo = SkillRepo (owner = "testowner" , name = "testrepo" , branch = "main" )
226226 manager .add_repo (repo )
227227
@@ -292,11 +292,11 @@ def test_manager_nonexistent_operations_error(self, temp_config_dir):
292292 def test_manager_init_default_repos (self , temp_config_dir ):
293293 """Test initializing default repos."""
294294 manager = SkillManager (temp_config_dir )
295-
295+
296296 # Repos are auto-initialized now, so should already have defaults
297297 repos = manager .get_repos ()
298298 assert len (repos ) == len (DEFAULT_SKILL_REPOS )
299-
299+
300300 # Calling init_default_repos again should be idempotent
301301 manager .init_default_repos ()
302302 repos = manager .get_repos ()
@@ -305,38 +305,48 @@ def test_manager_init_default_repos(self, temp_config_dir):
305305 def test_manager_sync_installed_status (self , temp_config_dir , temp_install_dir ):
306306 """Test syncing installed status."""
307307 manager = SkillManager (temp_config_dir )
308-
308+
309309 # Create skills
310- skill1 = Skill (key = "test1" , name = "Test 1" , description = "Desc" , directory = "skill1" )
311- skill2 = Skill (key = "test2" , name = "Test 2" , description = "Desc" , directory = "skill2" )
310+ skill1 = Skill (
311+ key = "test1" , name = "Test 1" , description = "Desc" , directory = "skill1"
312+ )
313+ skill2 = Skill (
314+ key = "test2" , name = "Test 2" , description = "Desc" , directory = "skill2"
315+ )
312316 manager .create (skill1 )
313317 manager .create (skill2 )
314-
318+
315319 # Mock the install directory
316- with patch .dict ('code_assistant_manager.skills.SKILL_INSTALL_DIRS' , {'test_app' : temp_install_dir }):
320+ with patch .dict (
321+ "code_assistant_manager.skills.SKILL_INSTALL_DIRS" ,
322+ {"test_app" : temp_install_dir },
323+ ):
317324 # Create skill1 directory in install location
318325 (temp_install_dir / "skill1" ).mkdir (parents = True )
319-
326+
320327 manager .sync_installed_status ("test_app" )
321-
328+
322329 skills = manager .get_all ()
323330 assert skills ["test1" ].installed is True
324331 assert skills ["test2" ].installed is False
325332
326333 def test_manager_get_installed_skills (self , temp_config_dir , temp_install_dir ):
327334 """Test getting installed skills."""
328335 manager = SkillManager (temp_config_dir )
329-
336+
330337 # Create a skill and a skill directory
331338 skill = Skill (key = "test" , name = "Test" , description = "Desc" , directory = "my-skill" )
332339 manager .create (skill )
333-
334- with patch .dict ('code_assistant_manager.skills.SKILL_INSTALL_DIRS' , {'test_app' : temp_install_dir }):
340+
341+ with patch .dict (
342+ "code_assistant_manager.skills.SKILL_INSTALL_DIRS" ,
343+ {"test_app" : temp_install_dir },
344+ ):
335345 # Create skill directory with SKILL.md
336346 skill_dir = temp_install_dir / "my-skill"
337347 skill_dir .mkdir (parents = True )
338348 (skill_dir / "SKILL.md" ).write_text ("---\n name: My Skill\n ---\n # My Skill" )
339-
349+
340350 installed = manager .get_installed_skills ("test_app" )
341351 assert len (installed ) == 1
342352 assert installed [0 ].name == "Test"
@@ -345,39 +355,41 @@ def test_manager_get_installed_skills(self, temp_config_dir, temp_install_dir):
345355 def test_parse_skill_metadata (self , temp_config_dir ):
346356 """Test parsing SKILL.md metadata."""
347357 manager = SkillManager (temp_config_dir )
348-
358+
349359 skill_md = temp_config_dir / "SKILL.md"
350- skill_md .write_text ("""---
360+ skill_md .write_text (
361+ """---
351362name: Test Skill
352363description: A test skill description
353364---
354365
355366# Test Skill
356367
357368This is the skill content.
358- """ )
359-
369+ """
370+ )
371+
360372 meta = manager ._parse_skill_metadata (skill_md )
361373 assert meta .get ("name" ) == "Test Skill"
362374 assert meta .get ("description" ) == "A test skill description"
363375
364376 def test_parse_skill_metadata_no_frontmatter (self , temp_config_dir ):
365377 """Test parsing SKILL.md without frontmatter."""
366378 manager = SkillManager (temp_config_dir )
367-
379+
368380 skill_md = temp_config_dir / "SKILL.md"
369381 skill_md .write_text ("# Just Content\n \n No frontmatter here." )
370-
382+
371383 meta = manager ._parse_skill_metadata (skill_md )
372384 assert meta == {}
373385
374386 def test_parse_skill_metadata_invalid_yaml (self , temp_config_dir ):
375387 """Test parsing SKILL.md with invalid YAML."""
376388 manager = SkillManager (temp_config_dir )
377-
389+
378390 skill_md = temp_config_dir / "SKILL.md"
379391 skill_md .write_text ("---\n invalid: yaml: content:\n ---\n # Content" )
380-
392+
381393 meta = manager ._parse_skill_metadata (skill_md )
382394 assert meta == {}
383395
@@ -401,28 +413,33 @@ def temp_install_dir(self):
401413 def mock_skill_repo (self , temp_config_dir ):
402414 """Create a mock skill repository structure."""
403415 repo_dir = temp_config_dir / "mock_repo"
404-
416+
405417 # Create skill structure
406418 skill_dir = repo_dir / "my-skill"
407419 skill_dir .mkdir (parents = True )
408- (skill_dir / "SKILL.md" ).write_text ("""---
420+ (skill_dir / "SKILL.md" ).write_text (
421+ """---
409422name: My Skill
410423description: A test skill
411424---
412425# My Skill
413426Content here.
414- """ )
427+ """
428+ )
415429 (skill_dir / "config.json" ).write_text ('{"key": "value"}' )
416-
430+
417431 return repo_dir
418432
419433 def test_install_skill_no_repo_info (self , temp_config_dir , temp_install_dir ):
420434 """Test installing skill without repo info raises error."""
421435 manager = SkillManager (temp_config_dir )
422436 skill = Skill (key = "test" , name = "Test" , description = "Desc" , directory = "my-skill" )
423437 manager .create (skill )
424-
425- with patch .dict ('code_assistant_manager.skills.SKILL_INSTALL_DIRS' , {'claude' : temp_install_dir }):
438+
439+ with patch .dict (
440+ "code_assistant_manager.skills.SKILL_INSTALL_DIRS" ,
441+ {"claude" : temp_install_dir },
442+ ):
426443 with pytest .raises (ValueError , match = "no repository information" ):
427444 manager .install ("test" , "claude" )
428445
@@ -439,18 +456,21 @@ def test_uninstall_skill(self, temp_config_dir, temp_install_dir):
439456 repo_name = "repo" ,
440457 )
441458 manager .create (skill )
442-
459+
443460 # Create the skill directory
444461 skill_dir = temp_install_dir / "my-skill"
445462 skill_dir .mkdir (parents = True )
446463 (skill_dir / "SKILL.md" ).write_text ("# Skill" )
447-
448- with patch .dict ('code_assistant_manager.skills.SKILL_INSTALL_DIRS' , {'claude' : temp_install_dir }):
464+
465+ with patch .dict (
466+ "code_assistant_manager.skills.SKILL_INSTALL_DIRS" ,
467+ {"claude" : temp_install_dir },
468+ ):
449469 manager .uninstall ("test" , "claude" )
450-
470+
451471 # Check skill directory was removed
452472 assert not skill_dir .exists ()
453-
473+
454474 # Check skill is marked as uninstalled
455475 loaded = manager .get ("test" )
456476 assert loaded .installed is False
@@ -468,11 +488,14 @@ def test_uninstall_nonexistent_directory(self, temp_config_dir, temp_install_dir
468488 repo_name = "repo" ,
469489 )
470490 manager .create (skill )
471-
472- with patch .dict ('code_assistant_manager.skills.SKILL_INSTALL_DIRS' , {'claude' : temp_install_dir }):
491+
492+ with patch .dict (
493+ "code_assistant_manager.skills.SKILL_INSTALL_DIRS" ,
494+ {"claude" : temp_install_dir },
495+ ):
473496 # Should not raise even if directory doesn't exist
474497 manager .uninstall ("test" , "claude" )
475-
498+
476499 loaded = manager .get ("test" )
477500 assert loaded .installed is False
478501
@@ -485,6 +508,7 @@ def test_skill_install_dirs(self):
485508 assert "claude" in SKILL_INSTALL_DIRS
486509 assert "codex" in SKILL_INSTALL_DIRS
487510 assert "gemini" in SKILL_INSTALL_DIRS
511+ assert "droid" in SKILL_INSTALL_DIRS
488512
489513 def test_default_skill_repos (self ):
490514 """Test DEFAULT_SKILL_REPOS has expected structure."""
0 commit comments