---
# SyncLink
**SyncLink** is a flexible Python utility for syncing code files (skills, scripts, or any directory content) from a folder in a GitHub repository to your local directory.
Supports public and private repos, selective file syncing, local-over-remote file protection, and easy integration.
---
## Features
* **Sync entire folders** or select specific files.
* **Skip or override** existing local files.
* **Supports private repos** (via GitHub token).
* **Branch selection**—sync from any branch, not just master/main.
* **Simple, readable code**—ready to drop into any project.
* **Preserves your local changes** by default.
---
## Installation
Simply copy `SyncLink` into your project, or package as you like.
Dependencies:
* Python 3.10+
* `requests`
---
## Usage
### **1. Basic Example (Sync All Files)**
```python
from SyncLink import SyncLink
syncer = SyncLink(
githubRepo='TristanMcBrideSr/SkillForge',
repoFolder='SkillForge',
syncDir='./skills'
)
syncer.startSync()
```
### **2. Sync Only Specific Files**
```python
syncer = SyncLink(
githubRepo='your-username/your-repo',
repoFolder='MySkills',
syncDir='./skills'
)
# Only sync 'weather.py' and 'research.py'
syncer.startSync(syncList=['weather', 'research'])
```
### **3. Override Existing Local Files**
```python
syncer = SyncLink(
githubRepo='TristanMcBrideSr/SkillForge',
repoFolder='SkillForge',
syncDir='./skills'
)
# Force override any local file with the downloaded version
syncer.startSync(override=True)
```
### **4. Sync From a Private Repo**
```python
syncer = SyncLink(
githubRepo='your-username/private-repo',
repoFolder='MySkills',
syncDir='./skills'
)
# Provide a GitHub token (classic or fine-grained with repo read access)
syncer.startSync(githubToken='YOUR_GITHUB_TOKEN')
```
### **5. Sync From a Different Branch**
```python
syncer = SyncLink(
githubRepo='TristanMcBrideSr/SkillForge',
repoFolder='SkillForge',
syncDir='./skills'
)
syncer.startSync(branch='dev') # Sync from 'dev' branch
```
---
## Parameters
### `SyncLink` constructor
* **githubRepo**: GitHub repo in the form `"owner/repo"` (required)
* **repoFolder**: Folder inside the repo to sync from (required)
* **syncDir**: Local directory to sync files to (required)
### `startSync(**kwargs)`
* **skillList** (`list`): Only these files will be synced (by name, `.py` optional).
* **override** (`bool`): If `True`, always overwrite existing local files.
* **githubToken** (`str`): Personal GitHub token for private repo access.
* **branch** (`str`): Branch to sync from (default `"master"`).
---
## How It Works
* Downloads a zip of the specified repo+branch.
* Extracts just the folder you specify.
* Copies each file:
* **By default:** only new files are copied (existing files are untouched).
* **With `override=True`:** always overwrites local files.
* Lets you pick which files to sync, or sync all.
---
## Error Handling
* Raises if folders/files are missing.
* Logs sync actions and errors to Python logger.
* Skips files that already exist locally, unless `override` is set.
---
## Example: Complete Workflow
```python
syncer = SyncLink(
githubRepo='my-org/myrepo',
repoFolder='skills',
syncDir='./skills'
)
syncer.startSync(
syncList=['my_skill', 'other_skill.py'],
override=False,
githubToken=os.getenv('GITHUB_TOKEN'), # If syncing from a private repo else you can omit this
branch='main'
)
```
---
## Code Examples
You can find code examples on my [GitHub repository](https://github.com/TristanMcBrideSr/TechBook).
---
## License
This project is licensed under the [Apache License, Version 2.0](LICENSE).
Copyright 2025 Tristan McBride Sr.
---
## Acknowledgements
Project by:
- Tristan McBride Sr.
- Sybil
Raw data
{
"_id": null,
"home_page": null,
"name": "SyncLink",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": "\"Tristan McBride Sr.\" <142635792+TristanMcBrideSr@users.noreply.github.com>",
"keywords": "AI, Agents, Skills, Productivity, Automation, Voice Assistant, Chatbot, LLM, Large Language Model",
"author": "Tristan McBride Sr.",
"author_email": "\"Tristan McBride Sr.\" <142635792+TristanMcBrideSr@users.noreply.github.com>",
"download_url": "https://files.pythonhosted.org/packages/ec/44/5dae334ac4e321b86694797ec805595d35ae18c9bf51e16bfc98fc2eab72/synclink-0.1.2.tar.gz",
"platform": null,
"description": "\ufeff\r\n---\r\n\r\n# SyncLink\r\n\r\n**SyncLink** is a flexible Python utility for syncing code files (skills, scripts, or any directory content) from a folder in a GitHub repository to your local directory.\r\nSupports public and private repos, selective file syncing, local-over-remote file protection, and easy integration.\r\n\r\n---\r\n\r\n## Features\r\n\r\n* **Sync entire folders** or select specific files.\r\n* **Skip or override** existing local files.\r\n* **Supports private repos** (via GitHub token).\r\n* **Branch selection**\u2014sync from any branch, not just master/main.\r\n* **Simple, readable code**\u2014ready to drop into any project.\r\n* **Preserves your local changes** by default.\r\n\r\n---\r\n\r\n## Installation\r\n\r\nSimply copy `SyncLink` into your project, or package as you like.\r\n\r\nDependencies:\r\n\r\n* Python 3.10+\r\n* `requests`\r\n\r\n---\r\n\r\n## Usage\r\n\r\n### **1. Basic Example (Sync All Files)**\r\n\r\n```python\r\nfrom SyncLink import SyncLink\r\n\r\nsyncer = SyncLink(\r\n githubRepo='TristanMcBrideSr/SkillForge',\r\n repoFolder='SkillForge',\r\n syncDir='./skills'\r\n)\r\nsyncer.startSync()\r\n```\r\n\r\n### **2. Sync Only Specific Files**\r\n\r\n```python\r\nsyncer = SyncLink(\r\n githubRepo='your-username/your-repo',\r\n repoFolder='MySkills',\r\n syncDir='./skills'\r\n)\r\n# Only sync 'weather.py' and 'research.py'\r\nsyncer.startSync(syncList=['weather', 'research'])\r\n```\r\n\r\n### **3. Override Existing Local Files**\r\n\r\n```python\r\nsyncer = SyncLink(\r\n githubRepo='TristanMcBrideSr/SkillForge',\r\n repoFolder='SkillForge',\r\n syncDir='./skills'\r\n)\r\n# Force override any local file with the downloaded version\r\nsyncer.startSync(override=True)\r\n```\r\n\r\n### **4. Sync From a Private Repo**\r\n\r\n```python\r\nsyncer = SyncLink(\r\n githubRepo='your-username/private-repo',\r\n repoFolder='MySkills',\r\n syncDir='./skills'\r\n)\r\n# Provide a GitHub token (classic or fine-grained with repo read access)\r\nsyncer.startSync(githubToken='YOUR_GITHUB_TOKEN')\r\n```\r\n\r\n### **5. Sync From a Different Branch**\r\n\r\n```python\r\nsyncer = SyncLink(\r\n githubRepo='TristanMcBrideSr/SkillForge',\r\n repoFolder='SkillForge',\r\n syncDir='./skills'\r\n)\r\nsyncer.startSync(branch='dev') # Sync from 'dev' branch\r\n```\r\n\r\n---\r\n\r\n## Parameters\r\n\r\n### `SyncLink` constructor\r\n\r\n* **githubRepo**: GitHub repo in the form `\"owner/repo\"` (required)\r\n* **repoFolder**: Folder inside the repo to sync from (required)\r\n* **syncDir**: Local directory to sync files to (required)\r\n\r\n### `startSync(**kwargs)`\r\n\r\n* **skillList** (`list`): Only these files will be synced (by name, `.py` optional).\r\n* **override** (`bool`): If `True`, always overwrite existing local files.\r\n* **githubToken** (`str`): Personal GitHub token for private repo access.\r\n* **branch** (`str`): Branch to sync from (default `\"master\"`).\r\n\r\n---\r\n\r\n## How It Works\r\n\r\n* Downloads a zip of the specified repo+branch.\r\n* Extracts just the folder you specify.\r\n* Copies each file:\r\n\r\n * **By default:** only new files are copied (existing files are untouched).\r\n * **With `override=True`:** always overwrites local files.\r\n* Lets you pick which files to sync, or sync all.\r\n\r\n---\r\n\r\n## Error Handling\r\n\r\n* Raises if folders/files are missing.\r\n* Logs sync actions and errors to Python logger.\r\n* Skips files that already exist locally, unless `override` is set.\r\n\r\n---\r\n\r\n## Example: Complete Workflow\r\n\r\n```python\r\nsyncer = SyncLink(\r\n githubRepo='my-org/myrepo',\r\n repoFolder='skills',\r\n syncDir='./skills'\r\n)\r\nsyncer.startSync(\r\n syncList=['my_skill', 'other_skill.py'],\r\n override=False,\r\n githubToken=os.getenv('GITHUB_TOKEN'), # If syncing from a private repo else you can omit this\r\n branch='main'\r\n)\r\n```\r\n\r\n---\r\n\r\n## Code Examples\r\n\r\nYou can find code examples on my [GitHub repository](https://github.com/TristanMcBrideSr/TechBook).\r\n\r\n---\r\n\r\n## License\r\n\r\nThis project is licensed under the [Apache License, Version 2.0](LICENSE).\r\nCopyright 2025 Tristan McBride Sr.\r\n\r\n---\r\n\r\n## Acknowledgements\r\n\r\nProject by:\r\n- Tristan McBride Sr.\r\n- Sybil\r\n\r\n",
"bugtrack_url": null,
"license": null,
"summary": "A Modern way to sync files",
"version": "0.1.2",
"project_urls": {
"Homepage": "https://github.com/TristanMcBrideSr"
},
"split_keywords": [
"ai",
" agents",
" skills",
" productivity",
" automation",
" voice assistant",
" chatbot",
" llm",
" large language model"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "6c24d2f7ea208254acf4581e65432c8b40a62ccdd5902bd9c3d43e7e40af3d00",
"md5": "550cb1b86d1447e5082a39d4c81406e7",
"sha256": "aecfad57cdbd915f9116cc822a7af7084d2b2500edd49674db705c5ebbb3cda5"
},
"downloads": -1,
"filename": "synclink-0.1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "550cb1b86d1447e5082a39d4c81406e7",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 4593,
"upload_time": "2025-07-22T21:47:11",
"upload_time_iso_8601": "2025-07-22T21:47:11.701323Z",
"url": "https://files.pythonhosted.org/packages/6c/24/d2f7ea208254acf4581e65432c8b40a62ccdd5902bd9c3d43e7e40af3d00/synclink-0.1.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ec445dae334ac4e321b86694797ec805595d35ae18c9bf51e16bfc98fc2eab72",
"md5": "5f693b6677822cef7628ba88a6a142f5",
"sha256": "09e71dec4f715e57b78b4714beb37c9beed85888c50e1b1d9ba7ca28d214c601"
},
"downloads": -1,
"filename": "synclink-0.1.2.tar.gz",
"has_sig": false,
"md5_digest": "5f693b6677822cef7628ba88a6a142f5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 4649,
"upload_time": "2025-07-22T21:47:12",
"upload_time_iso_8601": "2025-07-22T21:47:12.447887Z",
"url": "https://files.pythonhosted.org/packages/ec/44/5dae334ac4e321b86694797ec805595d35ae18c9bf51e16bfc98fc2eab72/synclink-0.1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-22 21:47:12",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "synclink"
}