Files
antigravity-skills-reference/scripts/tests/inspect_microsoft_repo.py
Ahmed Rehan 17bce709de feat: Add Official Microsoft & Gemini Skills (845+ Total)
🚀 Impact

Significantly expands the capabilities of **Antigravity Awesome Skills** by integrating official skill collections from **Microsoft** and **Google Gemini**. This update increases the total skill count to **845+**, making the library even more comprehensive for AI coding assistants.

 Key Changes

1. New Official Skills

- **Microsoft Skills**: Added a massive collection of official skills from [microsoft/skills](https://github.com/microsoft/skills).
  - Includes Azure, .NET, Python, TypeScript, and Semantic Kernel skills.
  - Preserves the original directory structure under `skills/official/microsoft/`.
  - Includes plugin skills from the `.github/plugins` directory.
- **Gemini Skills**: Added official Gemini API development skills under `skills/gemini-api-dev/`.

2. New Scripts & Tooling

- **`scripts/sync_microsoft_skills.py`**: A robust synchronization script that:
  - Clones the official Microsoft repository.
  - Preserves the original directory heirarchy.
  - Handles symlinks and plugin locations.
  - Generates attribution metadata.
- **`scripts/tests/inspect_microsoft_repo.py`**: Debug tool to inspect the remote repository structure.
- **`scripts/tests/test_comprehensive_coverage.py`**: Verification script to ensure 100% of skills are captured during sync.

3. Core Improvements

- **`scripts/generate_index.py`**: Enhanced frontmatter parsing to safely handle unquoted values containing `@` symbols and commas (fixing issues with some Microsoft skill descriptions).
- **`package.json`**: Added `sync:microsoft` and `sync:all-official` scripts for easy maintenance.

4. Documentation

- Updated `README.md` to reflect the new skill counts (845+) and added Microsoft/Gemini to the provider list.
- Updated `CATALOG.md` and `skills_index.json` with the new skills.

🧪 Verification

- Ran `scripts/tests/test_comprehensive_coverage.py` to verify all Microsoft skills are detected.
- Validated `generate_index.py` fixes by successfully indexing the new skills.
2026-02-11 20:36:09 +05:00

149 lines
6.0 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
Debug script to inspect Microsoft Skills repository structure - v2
Handles all skill locations including plugins
"""
import subprocess
import tempfile
from pathlib import Path
MS_REPO = "https://github.com/microsoft/skills.git"
def inspect_repo():
"""Inspect the Microsoft skills repository structure"""
print("🔍 Inspecting Microsoft Skills Repository Structure")
print("=" * 60)
with tempfile.TemporaryDirectory() as temp_dir:
temp_path = Path(temp_dir)
print("\n1⃣ Cloning repository...")
subprocess.run(
["git", "clone", "--depth", "1", MS_REPO, str(temp_path)],
check=True,
capture_output=True
)
print("\n2⃣ Repository structure:")
print("\nTop-level directories:")
for item in temp_path.iterdir():
if item.is_dir():
print(f" 📁 {item.name}/")
# Check .github/skills
github_skills = temp_path / ".github" / "skills"
if github_skills.exists():
skill_dirs = [d for d in github_skills.iterdir() if d.is_dir()]
print(f"\n3⃣ Found {len(skill_dirs)} directories in .github/skills/:")
for skill_dir in skill_dirs[:5]:
has_skill_md = (skill_dir / "SKILL.md").exists()
print(f" {'' if has_skill_md else ''} {skill_dir.name}")
if len(skill_dirs) > 5:
print(f" ... and {len(skill_dirs) - 5} more")
# Check .github/plugins
github_plugins = temp_path / ".github" / "plugins"
if github_plugins.exists():
plugin_skills = list(github_plugins.rglob("SKILL.md"))
print(f"\n🔌 Found {len(plugin_skills)} plugin skills in .github/plugins/:")
for skill_file in plugin_skills[:5]:
try:
rel_path = skill_file.relative_to(github_plugins)
print(f"{rel_path}")
except ValueError:
print(f"{skill_file.name}")
if len(plugin_skills) > 5:
print(f" ... and {len(plugin_skills) - 5} more")
# Check skills directory
skills_dir = temp_path / "skills"
if skills_dir.exists():
print(f"\n4⃣ Checking skills/ directory structure:")
# Count items
all_items = list(skills_dir.rglob("*"))
symlink_dirs = [s for s in all_items if s.is_symlink() and s.is_dir()]
symlink_files = [s for s in all_items if s.is_symlink() and not s.is_dir()]
regular_dirs = [s for s in all_items if s.is_dir() and not s.is_symlink()]
print(f" Total items: {len(all_items)}")
print(f" Regular directories: {len(regular_dirs)}")
print(f" Symlinked directories: {len(symlink_dirs)}")
print(f" Symlinked files: {len(symlink_files)}")
# Show directory structure
print(f"\n Top-level categories in skills/:")
for item in skills_dir.iterdir():
if item.is_dir():
# Count subdirs
subdirs = [d for d in item.iterdir() if d.is_dir()]
print(f" 📁 {item.name}/ ({len(subdirs)} items)")
if symlink_dirs:
print(f"\n Sample symlinked directories:")
for symlink in symlink_dirs[:5]:
try:
target = symlink.resolve()
relative = symlink.relative_to(skills_dir)
target_name = target.name if target.exists() else "broken"
print(f" {relative}{target_name}")
except:
pass
# Check for all SKILL.md files
print(f"\n5⃣ Comprehensive SKILL.md search:")
all_skill_mds = list(temp_path.rglob("SKILL.md"))
print(f" Total SKILL.md files found: {len(all_skill_mds)}")
# Categorize by location
locations = {}
for skill_md in all_skill_mds:
try:
if ".github/skills" in str(skill_md):
loc = ".github/skills"
elif ".github/plugins" in str(skill_md):
loc = ".github/plugins"
elif "/skills/" in str(skill_md):
loc = "skills/ (structure)"
else:
loc = "other"
locations[loc] = locations.get(loc, 0) + 1
except:
pass
print(f"\n Distribution by location:")
for loc, count in sorted(locations.items()):
print(f" {loc}: {count}")
# Show sample skills from each major category
print(f"\n6⃣ Sample skills by category:")
if skills_dir.exists():
for category in list(skills_dir.iterdir())[:3]:
if category.is_dir():
skills_in_cat = [s for s in category.rglob("*") if s.is_dir() and (s.is_symlink() or (s / "SKILL.md").exists())]
print(f"\n {category.name}/ ({len(skills_in_cat)} skills):")
for skill in skills_in_cat[:3]:
try:
rel = skill.relative_to(skills_dir)
print(f" - {rel}")
except:
pass
print("\n7⃣ Recommendations:")
print(" ✅ Preserve skills/ directory structure (Microsoft's organization)")
print(" ✅ Resolve symlinks to actual content in .github/skills/")
print(" ✅ Include plugin skills from .github/plugins/")
print(" ✅ This gives you the cleanest, most maintainable structure")
print("\n✨ Inspection complete!")
if __name__ == "__main__":
try:
inspect_repo()
except Exception as e:
print(f"\n❌ Error: {e}")
import traceback
traceback.print_exc()