diff --git a/.gitignore b/.gitignore index 4e8ad964..6e46583a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,10 +8,8 @@ __pycache__/ # npm pack artifacts antigravity-awesome-skills-*.tgz -walkthrough.md .agent/rules/ .gemini/ -LOCAL_CONFIG.md data/node_modules # Temporary analysis and report files @@ -27,11 +25,11 @@ similar_skills_*.json remaining_*.json html_*.json -# Temporary analysis scripts -scripts/*voltagent*.py -scripts/*html*.py -scripts/*similar*.py -scripts/*count*.py +# Temporary analysis scripts (tools/scripts/) +tools/scripts/*voltagent*.py +tools/scripts/*html*.py +tools/scripts/*similar*.py +tools/scripts/*count*.py # Optional baseline for legacy JS validator (scripts/validate-skills.js) validation-baseline.json diff --git a/README.md b/README.md index ef70cec5..be8d95b1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - + # ๐ŸŒŒ Antigravity Awesome Skills: 1,206+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More > **The Ultimate Collection of 1,206+ Universal Agentic Skills for AI Coding Assistants โ€” Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** diff --git a/docs/users/walkthrough.md b/docs/users/walkthrough.md new file mode 100644 index 00000000..e46aa5b8 --- /dev/null +++ b/docs/users/walkthrough.md @@ -0,0 +1,185 @@ +# Walkthrough: Integration of PRs 35 & 36 (Release v3.5.0) + +## Overview + +Integrated **PR #35** (Translation) and **PR #36** (New Community Contributors), enhancing documentation and expanding the skill registry. + +## Changes Verified + +### 1. New Skills / Content + +- **PR #35**: Translated `daily-news-report` description to English. +- **PR #36**: Added `infinite-gratitude` and `claude-api-cost-optimization` to Community Contributors. + +### 2. Documentation Updates + +- **README.md**: + - Updated generic skill count to **256+**. + - Updated `## Repo Contributors` list (synced with `git shortlog`). + - Bumped version to **v3.5.0**. +- **CHANGELOG.md**: Added release notes for v3.5.0. + +### 3. Maintenance Protocols + +- **Validation Chain**: + - `validate_skills.py`: Verified (Note: Strict mode warns on legacy skills). + - `generate_index.py`: Regenerated `skills_index.json`. + - `update_readme.py`: Synced registry table. +- **Stats Check**: Confirmed 256 skills across `README.md` and `docs/GETTING_STARTED.md`. + +## Verification Results + +- **Functional**: Skills are indexed and visible. +- **Protocol**: `MAINTENANCE.md` followed (Validation + Sync + Release). + +## Next Steps + +- Release v3.5.0 is ready for deployment (`git push` & `git tag`). + +--- + +## Update 2026-01-28: Documentation Counts Sync + +## Overview + +Aligned documentation skill counts with the latest catalog total. + +## Changes Verified + +### 1. Documentation Updates + +- **README.md**: Updated headline/intro counts to **552+** and synced the browse section label. +- **docs/GETTING_STARTED.md**: Updated references to **552** skills and pointed the registry link to `CATALOG.md`. + +### 2. Consistency Checks + +- **TOC anchors**: Updated the browse anchor to match the new header. + +--- + +## Update 2026-01-28: Features Table & Repo Cleanup + +## Overview + +Added a precise category table in the README and reduced top-level clutter by moving onboarding docs into `docs/`. + +## Changes Verified + +### 1. Documentation Updates + +- **README.md**: Replaced the category bullet list with a detailed table and updated the Getting Started link path. +- **docs/FAQ.md**: Updated skill counts and catalog links. + +### 2. Repository Organization + +- Moved onboarding docs into `docs/`: + - `GETTING_STARTED.md` โ†’ `docs/GETTING_STARTED.md` + - `FAQ.md` โ†’ `docs/FAQ.md` + - `WALKTHROUGH.md` โ†’ `docs/WALKTHROUGH.md` +# Walkthrough: SEO Optimization for Multi-IDE Visibility + +## Obiettivo + +Ottimizzare il posizionamento SEO del repository `antigravity-awesome-skills` per apparire nelle ricerche di tutti i principali strumenti di AI coding. + +## Strumenti Target + +| Strumento | Badge | Status | +| --------------- | ----- | ----------- | +| Claude Code | ๐ŸŸฃ | โœ… Aggiunto | +| Gemini CLI | ๐Ÿ”ต | โœ… Aggiunto | +| Codex CLI | ๐ŸŸข | โœ… Aggiunto | +| Antigravity IDE | ๐Ÿ”ด | โœ… Aggiunto | +| GitHub Copilot | ๐Ÿฉต | โœ… Aggiunto | +| Cursor | ๐ŸŸ  | โœ… Aggiunto | +| OpenCode | โšช | โœ… Aggiunto | + +## Modifiche Effettuate + +### 1. Titolo Aggiornato + +**Prima:** + +``` +# ๐ŸŒŒ Antigravity Awesome Skills: The Ultimate Claude Code Skills Collection +``` + +**Dopo:** + +``` +# ๐ŸŒŒ Antigravity Awesome Skills: 130+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +``` + +### 2. Badge Aggiunti (7 totali) + +![Badges Preview](https://img.shields.io/badge/Claude%20Code-Anthropic-purple) +![Badges Preview](https://img.shields.io/badge/Gemini%20CLI-Google-blue) +![Badges Preview](https://img.shields.io/badge/Codex%20CLI-OpenAI-green) +![Badges Preview](https://img.shields.io/badge/Cursor-AI%20IDE-orange) +![Badges Preview](https://img.shields.io/badge/GitHub%20Copilot-VSCode-lightblue) +![Badges Preview](https://img.shields.io/badge/OpenCode-CLI-gray) +![Badges Preview](https://img.shields.io/badge/Antigravity-DeepMind-red) + +### 3. Nuova Sezione Compatibility + +Aggiunta tabella con percorsi di installazione per ogni strumento: + +| Tool | Type | Compatibility | Installation Path | +| --------------- | --------- | ------------- | ------------------- | +| Claude Code | CLI | โœ… Full | `.claude/skills/` | +| Gemini CLI | CLI | โœ… Full | `.gemini/skills/` | +| Codex CLI | CLI | โœ… Full | `.codex/skills/` | +| Antigravity IDE | IDE | โœ… Full | `.agent/skills/` | +| Cursor | IDE | โœ… Full | `.cursor/skills/` | +| GitHub Copilot | Extension | โš ๏ธ Partial | `.github/copilot/` | +| OpenCode | CLI | โœ… Full | `.opencode/skills/` | + +### 4. Keywords Ampliate + +**Prima:** + +``` +Claude Code, Antigravity, Agentic Skills, MCT, AI Agents, Autonomous Coding, Security Auditing, React Patterns. +``` + +**Dopo:** + +``` +Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, Agentic Skills, AI Coding Assistant, AI Agent Skills, MCP, MCT, AI Agents, Autonomous Coding, Security Auditing, React Patterns, LLM Tools, AI IDE, Coding AI, AI Pair Programming, Vibe Coding, Agentic Coding, AI Developer Tools. +``` + +## Validazione + +```bash +โœ… Found and checked 132 skills. +โœจ All skills passed basic validation! +``` + +## GitHub Topics (Azione Manuale) + +Vai su https://github.com/sickn33/antigravity-awesome-skills e aggiungi questi topics: + +```text +claude-code, gemini-cli, codex-cli, antigravity, cursor, github-copilot, opencode, +agentic-skills, ai-coding, llm-tools, ai-agents, autonomous-coding, mcp, +ai-developer-tools, ai-pair-programming, vibe-coding +``` + +## Commit + +``` +feat(SEO): optimize README for all AI coding tools (02fab35) +``` + +## Risultato Atteso + +Il repository dovrebbe ora apparire nelle ricerche GitHub per: + +- "gemini cli skills" +- "claude code skills" +- "cursor skills" +- "codex cli skills" +- "copilot skills" +- "opencode skills" +- "agentic skills" +- "ai coding tools" diff --git a/docs/walkthrough.md b/docs/walkthrough.md new file mode 100644 index 00000000..f2198714 --- /dev/null +++ b/docs/walkthrough.md @@ -0,0 +1,3 @@ +# Walkthrough + +This document moved to [`users/walkthrough.md`](users/walkthrough.md). diff --git a/scripts/sync_repo_metadata.py b/scripts/sync_repo_metadata.py deleted file mode 100644 index f2631432..00000000 --- a/scripts/sync_repo_metadata.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import json -import os -import re -import sys - -from update_readme import configure_utf8_output, find_repo_root, load_metadata, update_readme - - -ABOUT_DESCRIPTION_RE = re.compile(r'"description"\s*:\s*"([^"]*)"') - - -def update_package_description(base_dir: str, metadata: dict, dry_run: bool) -> bool: - package_path = os.path.join(base_dir, "package.json") - with open(package_path, "r", encoding="utf-8") as file: - content = file.read() - - new_description = ( - f"{metadata['total_skills_label']} agentic skills for Claude Code, Gemini CLI, " - "Cursor, Antigravity & more. Installer CLI." - ) - updated_content = ABOUT_DESCRIPTION_RE.sub( - f'"description": "{new_description}"', content, count=1 - ) - - if updated_content == content: - return False - - if dry_run: - print(f"[dry-run] Would update package description in {package_path}") - return True - - with open(package_path, "w", encoding="utf-8", newline="\n") as file: - file.write(updated_content) - print(f"โœ… Updated package description in {package_path}") - return True - - -def print_manual_github_about(metadata: dict) -> None: - description = ( - f"{metadata['total_skills_label']} curated SKILL.md files for Claude Code, " - "Cursor, Gemini CLI, Codex, Copilot, and Antigravity." - ) - print("\nManual GitHub repo settings update:") - print(f"- About description: {description}") - print("- Suggested topics: claude-code, cursor, gemini-cli, codex-cli, github-copilot, antigravity") - - -def parse_args() -> argparse.Namespace: - parser = argparse.ArgumentParser( - description="Synchronize repository metadata across README and package.json." - ) - parser.add_argument("--dry-run", action="store_true", help="Preview updates without writing files.") - return parser.parse_args() - - -def main() -> int: - args = parse_args() - base_dir = find_repo_root(os.path.dirname(__file__)) - metadata = load_metadata(base_dir) - - print("Repository metadata") - print(json.dumps(metadata, indent=2)) - - readme_metadata = update_readme(dry_run=args.dry_run) - package_updated = update_package_description(base_dir, metadata, args.dry_run) - print_manual_github_about(readme_metadata) - - if args.dry_run and not package_updated: - print("\n[dry-run] No package.json description changes required.") - - return 0 - - -if __name__ == "__main__": - configure_utf8_output() - sys.exit(main()) diff --git a/scripts/update_readme.py b/scripts/update_readme.py deleted file mode 100644 index 0dbf3c20..00000000 --- a/scripts/update_readme.py +++ /dev/null @@ -1,261 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import io -import json -import os -import re -import sys -import urllib.error -import urllib.request -from datetime import datetime, timezone - -GITHUB_REPO = "sickn33/antigravity-awesome-skills" -SYNC_COMMENT_RE = re.compile(r"") - - -def configure_utf8_output() -> None: - """Best-effort UTF-8 stdout/stderr on Windows without dropping diagnostics.""" - if sys.platform != "win32": - return - - for stream_name in ("stdout", "stderr"): - stream = getattr(sys, stream_name) - try: - stream.reconfigure(encoding="utf-8", errors="backslashreplace") - continue - except Exception: - pass - - buffer = getattr(stream, "buffer", None) - if buffer is not None: - setattr( - sys, - stream_name, - io.TextIOWrapper(buffer, encoding="utf-8", errors="backslashreplace"), - ) - - -def find_repo_root(start_path: str) -> str: - current = os.path.abspath(start_path) - while True: - if os.path.isfile(os.path.join(current, "package.json")) and os.path.isfile( - os.path.join(current, "README.md") - ): - return current - parent = os.path.dirname(current) - if parent == current: - raise FileNotFoundError("Could not locate repository root from script path.") - current = parent - - -def format_skill_count(total_skills: int) -> str: - return f"{total_skills:,}+" - - -def format_star_badge_count(stars: int) -> str: - if stars >= 1000: - rounded = int(round(stars / 1000.0)) - return f"{rounded}%2C000%2B" - return f"{stars}%2B" - - -def format_star_milestone(stars: int) -> str: - if stars >= 1000: - rounded = int(round(stars / 1000.0)) - return f"{rounded},000+" - return f"{stars}+" - - -def format_star_celebration(stars: int) -> str: - if stars >= 1000: - rounded = int(round(stars / 1000.0)) - return f"{rounded}k" - return str(stars) - - -def fetch_star_count(repo: str) -> int | None: - url = f"https://api.github.com/repos/{repo}" - request = urllib.request.Request( - url, - headers={ - "Accept": "application/vnd.github+json", - "User-Agent": "antigravity-awesome-skills-readme-sync", - }, - ) - try: - with urllib.request.urlopen(request, timeout=10) as response: - payload = json.load(response) - except (urllib.error.URLError, TimeoutError, json.JSONDecodeError): - return None - stars = payload.get("stargazers_count") - return int(stars) if isinstance(stars, int) else None - - -def load_metadata(base_dir: str, repo: str = GITHUB_REPO) -> dict: - readme_path = os.path.join(base_dir, "README.md") - package_path = os.path.join(base_dir, "package.json") - index_path = os.path.join(base_dir, "skills_index.json") - - with open(index_path, "r", encoding="utf-8") as file: - skills = json.load(file) - - with open(package_path, "r", encoding="utf-8") as file: - package = json.load(file) - - with open(readme_path, "r", encoding="utf-8") as file: - current_readme = file.read() - - current_star_match = re.search(r"โญ%20([\d%2C\+]+)%20Stars", current_readme) - current_stars = None - if current_star_match: - compact = current_star_match.group(1).replace("%2C", "").replace("%2B", "") - compact = compact.rstrip("+") - if compact.isdigit(): - current_stars = int(compact) - - live_stars = fetch_star_count(repo) - total_stars = live_stars if live_stars is not None else current_stars or 0 - - return { - "repo": repo, - "version": str(package.get("version", "0.0.0")), - "total_skills": len(skills), - "total_skills_label": format_skill_count(len(skills)), - "stars": total_stars, - "star_badge_count": format_star_badge_count(total_stars), - "star_milestone": format_star_milestone(total_stars), - "star_celebration": format_star_celebration(total_stars), - "updated_at": datetime.now(timezone.utc).replace(microsecond=0).isoformat(), - "used_live_star_count": live_stars is not None, - } - - -def apply_metadata(content: str, metadata: dict) -> str: - total_skills = metadata["total_skills"] - total_skills_label = metadata["total_skills_label"] - version = metadata["version"] - star_badge_count = metadata["star_badge_count"] - star_milestone = metadata["star_milestone"] - star_celebration = metadata["star_celebration"] - sync_comment = ( - f"" - ) - - content = re.sub( - r"^# ๐ŸŒŒ Antigravity Awesome Skills: .*?$", - ( - f"# ๐ŸŒŒ Antigravity Awesome Skills: {total_skills_label} " - "Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More" - ), - content, - count=1, - flags=re.MULTILINE, - ) - content = re.sub( - r"^> \*\*The Ultimate Collection of .*?\*\*$", - ( - f"> **The Ultimate Collection of {total_skills_label} Universal Agentic " - "Skills for AI Coding Assistants โ€” Claude Code, Gemini CLI, Codex CLI, " - "Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL**" - ), - content, - count=1, - flags=re.MULTILINE, - ) - content = re.sub( - r"https://img\.shields\.io/badge/โญ%20[\d%2C\+]+%20Stars-gold\?style=for-the-badge", - f"https://img.shields.io/badge/โญ%20{star_badge_count}%20Stars-gold?style=for-the-badge", - content, - count=1, - ) - content = re.sub( - r"^\*\*Antigravity Awesome Skills\*\* is a curated, battle-tested library of \*\*.*?\*\* designed", - ( - f"**Antigravity Awesome Skills** is a curated, battle-tested library of " - f"**{total_skills_label} high-performance agentic skills** designed" - ), - content, - count=1, - flags=re.MULTILINE, - ) - content = re.sub( - r"\[๐Ÿ“š Browse \d[\d,]*\+ Skills\]\(#browse-[^)]+\)", - f"[๐Ÿ“š Browse {total_skills_label} Skills](#browse-{total_skills}-skills)", - content, - count=1, - ) - content = re.sub( - r"\*\*Welcome to the V[\d.]+ .*? Stars Celebration Release!\*\*", - f"**Welcome to the V{version} {star_celebration} Stars Celebration Release!**", - content, - count=1, - ) - content = re.sub( - r"> \*\*๐ŸŒŸ .*? GitHub Stars Milestone!\*\*", - f"> **๐ŸŒŸ {star_milestone} GitHub Stars Milestone!**", - content, - count=1, - ) - content = re.sub( - r"\*\*Antigravity Awesome Skills\*\* \(Release [\d.]+\) is a massive upgrade to your AI's capabilities, now featuring \*\*.*?\*\* skills", - ( - f"**Antigravity Awesome Skills** (Release {version}) is a massive upgrade " - f"to your AI's capabilities, now featuring **{total_skills_label} skills**" - ), - content, - count=1, - ) - content = re.sub( - r"## Browse \d[\d,]*\+ Skills", - f"## Browse {total_skills_label} Skills", - content, - count=1, - ) - content = re.sub( - r"\n?", - "", - content, - count=1, - ) - return f"{sync_comment}\n{content.lstrip()}" - - -def update_readme(dry_run: bool = False) -> dict: - base_dir = find_repo_root(os.path.dirname(__file__)) - readme_path = os.path.join(base_dir, "README.md") - metadata = load_metadata(base_dir) - - print(f"๐Ÿ“– Reading README from: {readme_path}") - print(f"๐Ÿ”ข Total skills found: {metadata['total_skills']}") - print(f"๐Ÿท๏ธ Version found: {metadata['version']}") - if metadata["used_live_star_count"]: - print(f"โญ Live GitHub stars found: {metadata['stars']}") - else: - print(f"โญ Using existing README star count: {metadata['stars']}") - - with open(readme_path, "r", encoding="utf-8") as file: - content = file.read() - - updated_content = apply_metadata(content, metadata) - if dry_run: - print("๐Ÿงช Dry run enabled; README.md not written.") - return metadata - - with open(readme_path, "w", encoding="utf-8", newline="\n") as file: - file.write(updated_content) - - print("โœ… README.md updated successfully.") - return metadata - - -def parse_args() -> argparse.Namespace: - parser = argparse.ArgumentParser(description="Sync generated metadata into README.md.") - parser.add_argument("--dry-run", action="store_true", help="Compute metadata without writing files.") - return parser.parse_args() - - -if __name__ == "__main__": - configure_utf8_output() - args = parse_args() - update_readme(dry_run=args.dry_run)