{"id":48226973,"url":"https://github.com/wan-huiyan/skill-sync","last_synced_at":"2026-04-04T19:24:17.544Z","repository":{"id":348760574,"uuid":"1199439448","full_name":"wan-huiyan/skill-sync","owner":"wan-huiyan","description":"Keep locally installed Claude Code skills in sync with their GitHub repos","archived":false,"fork":false,"pushed_at":"2026-04-02T18:50:57.000Z","size":29,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-03T05:31:27.893Z","etag":null,"topics":["claude-code","claude-code-skill","devtools","git-sync","skill-management"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wan-huiyan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-02T10:53:32.000Z","updated_at":"2026-04-02T18:51:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/wan-huiyan/skill-sync","commit_stats":null,"previous_names":["wan-huiyan/skill-sync"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/wan-huiyan/skill-sync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wan-huiyan%2Fskill-sync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wan-huiyan%2Fskill-sync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wan-huiyan%2Fskill-sync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wan-huiyan%2Fskill-sync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wan-huiyan","download_url":"https://codeload.github.com/wan-huiyan/skill-sync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wan-huiyan%2Fskill-sync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31410411,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","claude-code-skill","devtools","git-sync","skill-management"],"created_at":"2026-04-04T19:24:17.038Z","updated_at":"2026-04-04T19:24:17.534Z","avatar_url":"https://github.com/wan-huiyan.png","language":"JavaScript","readme":"# skill-sync\n[![GitHub release](https://img.shields.io/github/v/release/wan-huiyan/skill-sync)](https://github.com/wan-huiyan/skill-sync/releases) [![Claude Code](https://img.shields.io/badge/Claude_Code-skill-orange)](https://claude.com/claude-code) [![license](https://img.shields.io/github/license/wan-huiyan/skill-sync)](LICENSE) [![last commit](https://img.shields.io/github/last-commit/wan-huiyan/skill-sync)](https://github.com/wan-huiyan/skill-sync/commits)\n\nAfter improving skills locally across multiple sessions, pushing changes back to GitHub means cloning, diffing, and copying files for every skill. This skill automates that for your entire published portfolio at once.\n\n## Quick Start\n\n```\nYou: /skill-sync\nClaude: Scanning 18 registered skills...\n\nSkill                    Repo                              Type      Status\n---\ncausal-impact-campaign   wan-huiyan/causal-impact-campaign  authored  IN SYNC\npermutation-validation   wan-huiyan/permutation-validation  authored  DIRTY (SKILL.md)\nfield-notes              wan-huiyan/field-notes             fork      IN SYNC\n\nYou: /skill-sync push permutation-validation\nClaude: Cloning wan-huiyan/permutation-validation...\n        Copying SKILL.md...\n        Committed and pushed: \"docs: sync permutation-validation from local skill updates\"\n```\n\n## Why a Claude Code Skill?\n\nThe sync workflow involves cloning repos, diffing tracked files, copying to correct paths (root AND nested `skills/` copy), checking the version bump checklist, and pushing — across every dirty skill at once. Claude also handles the judgment calls: which files to track, whether a diff is meaningful, and whether a version bump is needed before pushing. A shell script can clone and copy; it can't read a SKILL.md and decide whether the version number needs bumping.\n\n## Installation\n\n**Claude Code:**\n```bash\ngit clone https://github.com/wan-huiyan/skill-sync.git ~/.claude/skills/skill-sync\n```\n\n**Cursor:**\n```bash\ngit clone https://github.com/wan-huiyan/skill-sync.git ~/.cursor/skills/skill-sync\n```\n\n## What You Get\n\n| Command | What it does |\n|---|---|\n| `/skill-sync` | Scan all registered skills, show sync status table |\n| `/skill-sync init` | Populate registry by matching `gh repo list` against local `~/.claude/skills/` |\n| `/skill-sync push` | Push all dirty authored skills to their GitHub repos |\n| `/skill-sync push \u003cname\u003e` | Push a single skill |\n\n## How It Works\n\n1. **Registry** (`~/.claude/skill-sync-registry.json`) maps local skill directories to GitHub repos\n2. **Init** scans your GitHub repos via `gh repo list`, matches against installed skills, detects forks vs authored\n3. **Status** clones each repo to `/tmp`, diffs tracked files against local copies\n4. **Push** copies local files to cloned repo, commits, pushes, cleans up\n\n## Companion Skills\n\n- **[publish-skill](https://github.com/wan-huiyan/publish-skill)** — First-time publishing (repo creation, README, screenshots, awesome-list). After publishing, run `/skill-sync init` to register.\n- **[schliff](https://github.com/Zandereins/schliff)** — Score and improve skill quality before syncing.\n- **[skill-anonymizer](https://github.com/wan-huiyan/skill-anonymizer)** — Scan for client-identifying data before pushing. New content added locally may introduce client names, amounts, or domain-specific details.\n- **[data-provenance-verifier](https://github.com/wan-huiyan/data-provenance-verifier)** — Verify any new data files have provenance documentation before pushing.\n\n## Key Design Decisions\n\n- **Registry over auto-detection**: A JSON registry is explicit and editable, vs scanning `.git/config` or `plugin.json` which may be stale or missing\n- **Clone-copy-push over local git**: Skills installed via `git clone` may have dirty working trees, detached HEADs, or stale remotes. Cloning fresh to `/tmp` avoids all git state issues\n- **Authored vs fork distinction**: Forks get a warning (\"consider opening an upstream PR\") instead of silent pushes that diverge from upstream\n- **Version bump checklist absorbed from publish-skill**: Keeps all update-related guidance in one place instead of split across two skills\n\n## Limitations\n\n- Requires `gh` CLI authenticated with push access to your repos\n- Does not auto-detect new skills — run `/skill-sync init` after using `/publish-skill`\n- Does not handle merge conflicts — if the remote has changes not in your local copy, push will fail and you'll need manual resolution\n- Registry is per-machine — not synced across devices\n\n## Dependencies\n\n- **Required:** `gh` CLI (GitHub CLI) — for repo listing, cloning, pushing\n- **Required:** `git` — for clone, diff, commit, push operations\n- **Optional:** `jq` — for registry JSON manipulation (falls back to Python)\n\n\u003cdetails\u003e\n\u003csummary\u003eQuality Checklist\u003c/summary\u003e\n\n- [x] Detects all skills with matching GitHub repos\n- [x] Distinguishes authored vs forked skills\n- [x] Shows per-file diff status (not just \"dirty\")\n- [x] Copies to both root and `skills/{name}/` paths in repo\n- [x] Includes version bump checklist for major updates\n- [x] Warns about upstream PRs for forked skills\n- [x] Cleans up `/tmp` clones after operations\n\u003c/details\u003e\n\n## Related Skills\n\n- [publish-skill](https://github.com/wan-huiyan/publish-skill) — First-time skill publishing (skill-sync is its companion for ongoing maintenance)\n- [schliff](https://github.com/Zandereins/schliff) — Score and improve skill quality before syncing\n- [skill-anonymizer](https://github.com/wan-huiyan/skill-anonymizer) — Scan for client-identifying data before pushing updates\n- [data-provenance-verifier](https://github.com/wan-huiyan/data-provenance-verifier) — Verify data files have provenance documentation\n\n## Version History\n\n| Version | Date | Changes |\n|---|---|---|\n| 1.0.0 | 2026-04-02 | Initial release: init, status, push commands. Registry format. Version bump checklist absorbed from publish-skill. |\n\n## License\n\nMIT\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwan-huiyan%2Fskill-sync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwan-huiyan%2Fskill-sync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwan-huiyan%2Fskill-sync/lists"}