SyncLink


NameSyncLink JSON
Version 0.1.2 PyPI version JSON
download
home_pageNone
SummaryA Modern way to sync files
upload_time2025-07-22 21:47:12
maintainerNone
docs_urlNone
authorTristan McBride Sr.
requires_python>=3.10
licenseNone
keywords ai agents skills productivity automation voice assistant chatbot llm large language model
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
---

# 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"
}
        
Elapsed time: 0.47020s