link skill script
This commit is contained in:
Executable
+80
@@ -0,0 +1,80 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Create directory and symlink for Copilot skills."""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def add_skill(markdown_path: str) -> None:
|
||||||
|
"""Add a skill by creating symlink in ~/.copilot/skills/.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
markdown_path: Path to the markdown file (relative or absolute)
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
FileNotFoundError: If markdown file doesn't exist
|
||||||
|
RuntimeError: If symlink creation fails
|
||||||
|
"""
|
||||||
|
md_file = Path(markdown_path)
|
||||||
|
|
||||||
|
if not md_file.exists():
|
||||||
|
raise FileNotFoundError(f"Markdown file not found: {markdown_path}")
|
||||||
|
|
||||||
|
# Get absolute path
|
||||||
|
abs_md_path = md_file.resolve()
|
||||||
|
|
||||||
|
# Extract skill name from filename (without .md extension)
|
||||||
|
skill_name = md_file.stem
|
||||||
|
|
||||||
|
# Create skill directory
|
||||||
|
skills_dir = Path.home() / ".copilot" / "skills" / skill_name
|
||||||
|
skills_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# Create symlink
|
||||||
|
symlink_path = skills_dir / "SKILL.md"
|
||||||
|
|
||||||
|
# Remove existing symlink if it exists
|
||||||
|
if symlink_path.exists() or symlink_path.is_symlink():
|
||||||
|
symlink_path.unlink()
|
||||||
|
|
||||||
|
# Create the symlink using ln -s for compatibility
|
||||||
|
result = subprocess.run(
|
||||||
|
["ln", "-s", str(abs_md_path), str(symlink_path)],
|
||||||
|
capture_output=True,
|
||||||
|
check=False,
|
||||||
|
text=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
if result.returncode != 0:
|
||||||
|
raise RuntimeError(f"Failed to create symlink: {result.stderr}")
|
||||||
|
|
||||||
|
print(f"✓ Created skill link: {symlink_path} -> {abs_md_path}")
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
"""Main entry point."""
|
||||||
|
parser = argparse.ArgumentParser(description="Create directory and symlink for Copilot skills")
|
||||||
|
subparsers = parser.add_subparsers(dest="command", help="Command to run")
|
||||||
|
|
||||||
|
# Add subcommand
|
||||||
|
add_parser = subparsers.add_parser("add", help="Add a skill")
|
||||||
|
add_parser.add_argument("markdown", help="Path to markdown skill file")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if not args.command:
|
||||||
|
parser.print_help()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if args.command == "add":
|
||||||
|
try:
|
||||||
|
add_skill(args.markdown)
|
||||||
|
except (FileNotFoundError, RuntimeError, OSError) as e:
|
||||||
|
print(f"✗ Error: {e}", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user