Skip to main content

CLI tool for syncing documentation from multiple repositories for Docusaurus

Project description

๐Ÿ“š DocuSync

Effortlessly sync documentation from multiple repositories into your Docusaurus site

Python Version License: MIT Code style: black

Features โ€ข Installation โ€ข Quick Start โ€ข Usage โ€ข Configuration


๐ŸŽฏ Overview

DocuSync is a powerful CLI tool designed specifically for Docusaurus projects that need to aggregate documentation from multiple GitHub repositories. It automatically clones, organizes, and generates the proper category structure for your multi-repository documentation setup.

Perfect for:

  • ๐Ÿข Microservices architectures - Centralize docs from multiple services
  • ๐Ÿ“ฆ Monorepo projects - Sync docs from different packages
  • ๐Ÿ”ง SDK ecosystems - Aggregate documentation from multiple SDKs
  • ๐ŸŒ Multi-team projects - Combine docs from different teams

โœจ Features

  • ๐Ÿš€ Fast & Efficient - Shallow cloning with configurable depth
  • ๐ŸŽจ Docusaurus Integration - Auto-generates _category_.json files
  • ๐Ÿ“‹ Multi-Repository Support - Sync from unlimited GitHub repositories
  • ๐Ÿ”ง Flexible Configuration - JSON-based configuration with validation
  • ๐Ÿ” Multiple Auth Methods - Support for SSH keys and HTTPS with Personal Access Tokens
  • ๐Ÿ“Š Beautiful Output - Rich console interface with progress indicators
  • ๐Ÿงน Clean & Safe - Automatic cleanup of temporary files
  • โœ… Type-Safe - Built with Pydantic for robust configuration
  • ๐ŸŽฏ Selective Sync - Sync all repos or just one
  • ๐Ÿ”จ MD/MDX Fixer - Automatically fix common Markdown/MDX issues that cause Docusaurus build failures

๐Ÿ“ฆ Installation

Using uv (Recommended)

uv add docusync

Using pip

pip install docusync

For Development

git clone https://github.com/Roman505050/docusync.git
cd docusync
uv sync --all-groups

๐Ÿš€ Quick Start

  1. Initialize configuration
docusync init
  1. Edit docusync.json with your repositories

  2. Sync your documentation

docusync sync
  1. Run Docusaurus
npm run start

That's it! Your documentation is now synced and ready to go! ๐ŸŽ‰

๐Ÿ“– Usage

Sync All Repositories

docusync sync

With verbose output:

docusync sync -v

Keep temporary files for debugging:

docusync sync --no-cleanup

Automatically fix MD/MDX issues after sync:

docusync sync --fix-md

Sync Single Repository

docusync sync-one <repository-name>

Example:

docusync sync-one api-gateway

With automatic MD/MDX fixing:

docusync sync-one api-gateway --fix-md

Fix Markdown/MDX Files

Fix common MDX/Markdown issues that cause Docusaurus build failures:

# Fix all .md files in a directory
docusync fix docs/

# Fix a single file
docusync fix docs/my-file.md

# Preview changes without applying them
docusync fix docs/ --dry-run

# Fix only files in the target directory (non-recursive)
docusync fix docs/ --no-recursive

What the fixer fixes:

  • โŒ Invalid JSX tag names (e.g., <1something> โ†’ &lt;1something&gt;)
  • โŒ HTML comments in MDX context (e.g., <!-- comment --> โ†’ {/* comment */})
  • โŒ Unclosed void elements (e.g., <br> โ†’ <br />)
  • โŒ Invalid HTML attributes (e.g., class= โ†’ className=, for= โ†’ htmlFor=)
  • โŒ Self-closing tag spacing (e.g., <tag/> โ†’ <tag />)
  • โŒ Malformed numeric entities (e.g., &#123 โ†’ &#123;)

List Configured Repositories

docusync list

Initialize Configuration

docusync init

With custom config path:

docusync init -c custom-config.json

โš™๏ธ Configuration

Basic Configuration

Create a docusync.json file in your Docusaurus project root:

{
  "repositories": [
    {
      "github_path": "acme-corp/api-gateway",
      "docs_path": "docs",
      "display_name": "API Gateway",
      "position": 1,
      "description": "Central API gateway documentation"
    },
    {
      "github_path": "acme-corp/user-service",
      "docs_path": "documentation",
      "display_name": "User Service",
      "position": 2,
      "description": "User management and authentication service"
    },
    {
      "github_path": "acme-corp/payment-processor",
      "docs_path": "docs",
      "display_name": "Payment Processor",
      "position": 3,
      "description": "Payment processing and billing documentation"
    }
  ],
  "paths": {
    "temp_dir": ".temp-repos",
    "docs_dir": "docs"
  },
  "git": {
    "clone_depth": 1,
    "default_branches": ["main", "master"]
  }
}

Configuration Options

repositories (required)

Array of repositories to sync:

Field Type Description
github_path string GitHub repository path (owner/repo)
docs_path string Path to documentation within the repository
display_name string Display name for the category
position integer Sidebar position (must be unique)
description string Category description for Docusaurus
protocol string (Optional) Clone protocol: "ssh" or "https"
pat_token_env string (Optional) Environment variable with PAT token for this repo
ssh_key_path string (Optional) Path to SSH private key for this repo

paths (required)

Field Type Description
temp_dir string Directory for temporary clones (auto-deleted)
docs_dir string Target directory for documentation

git (required)

Field Type Description
clone_depth integer Git clone depth (1 for shallow clone)
default_branches array Default branches to try cloning
default_protocol string Clone protocol: "ssh" or "https" (default: "ssh")
default_ssh_key_path string Default SSH private key path (optional, e.g., ~/.ssh/id_ed25519)
default_pat_token_env string Default environment variable name containing GitHub Personal Access Token (optional)

Authentication & Protocols

SSH Authentication (default):

  • Uses git@github.com:owner/repo.git format
  • Requires SSH key setup with GitHub
  • Best for local development
  • Supports custom SSH keys per repository

HTTPS with PAT Token:

  • Uses https://github.com/owner/repo.git format
  • Requires GitHub Personal Access Token
  • Best for CI/CD pipelines
  • Token is read from environment variable
  • Supports different tokens per repository

Example with HTTPS:

{
  "git": {
    "clone_depth": 1,
    "default_branches": ["main", "master"],
    "default_protocol": "https",
    "default_pat_token_env": "GITHUB_PAT_TOKEN"
  }
}

Then set your token:

export GITHUB_PAT_TOKEN="ghp_your_token_here"

Example with custom SSH keys:

{
  "repositories": [
    {
      "github_path": "acme-corp/api-docs",
      "protocol": "ssh",
      "ssh_key_path": "~/.ssh/acme_corp_key",
      ...
    },
    {
      "github_path": "partner-org/service-docs",
      "protocol": "ssh",
      "ssh_key_path": "~/.ssh/partner_org_key",
      ...
    }
  ],
  "git": {
    "default_protocol": "ssh",
    "default_ssh_key_path": "~/.ssh/id_ed25519"
  }
}

Per-repository protocol override:

{
  "repositories": [
    {
      "github_path": "acme-corp/payment-processor",
      "docs_path": "docs",
      "display_name": "Payment Processor",
      "position": 3,
      "description": "Payment processing documentation",
      "protocol": "https"
    }
  ]
}

Multiple organizations with different authentication:

{
  "repositories": [
    {
      "github_path": "acme-corp/api-docs",
      "display_name": "ACME API",
      "protocol": "ssh",
      "ssh_key_path": "~/.ssh/acme_corp_key",
      ...
    },
    {
      "github_path": "partner-org/service-docs",
      "display_name": "Partner Service",
      "protocol": "https",
      "pat_token_env": "PARTNER_ORG_PAT_TOKEN",
      ...
    },
    {
      "github_path": "contractor/integration-docs",
      "display_name": "Integration",
      "protocol": "https",
      "pat_token_env": "CONTRACTOR_PAT_TOKEN",
      ...
    }
  ],
  "git": {
    "default_protocol": "ssh",
    "default_ssh_key_path": "~/.ssh/id_ed25519",
    "default_pat_token_env": "GITHUB_PAT_TOKEN"
  }
}

Then set individual credentials:

# For HTTPS repositories
export PARTNER_ORG_PAT_TOKEN="ghp_partner_token"
export CONTRACTOR_PAT_TOKEN="ghp_contractor_token"
export GITHUB_PAT_TOKEN="ghp_default_token"

Priority for authentication:

  • SSH: Repository ssh_key_path โ†’ Global default_ssh_key_path โ†’ System default
  • HTTPS: Repository pat_token_env โ†’ Global default_pat_token_env โ†’ No token

๐ŸŽจ Docusaurus Integration

Automatic _category_.json Generation

DocuSync automatically creates _category_.json files in each synced documentation directory, following the Docusaurus category format:

{
  "label": "API Gateway",
  "position": 1,
  "link": {
    "type": "generated-index",
    "description": "Central API gateway documentation"
  }
}

This enables Docusaurus to:

  • โœ… Automatically generate index pages for each category
  • โœ… Properly order documentation in the sidebar
  • โœ… Display category descriptions on index pages
  • โœ… Create a beautiful, organized documentation structure

Project Structure After Sync

your-docusaurus-project/
โ”œโ”€โ”€ docusaurus.config.js
โ”œโ”€โ”€ docusync.json
โ”œโ”€โ”€ docs/
โ”‚   โ”œโ”€โ”€ api-gateway/
โ”‚   โ”‚   โ”œโ”€โ”€ _category_.json      # Auto-generated โœจ
โ”‚   โ”‚   โ”œโ”€โ”€ intro.md
โ”‚   โ”‚   โ”œโ”€โ”€ getting-started.md
โ”‚   โ”‚   โ””โ”€โ”€ api-reference.md
โ”‚   โ”œโ”€โ”€ user-service/
โ”‚   โ”‚   โ”œโ”€โ”€ _category_.json      # Auto-generated โœจ
โ”‚   โ”‚   โ”œโ”€โ”€ overview.md
โ”‚   โ”‚   โ””โ”€โ”€ configuration.md
โ”‚   โ””โ”€โ”€ payment-processor/
โ”‚       โ”œโ”€โ”€ _category_.json      # Auto-generated โœจ
โ”‚       โ”œโ”€โ”€ setup.md
โ”‚       โ””โ”€โ”€ webhooks.md
โ””โ”€โ”€ .temp-repos/                 # Cleaned up after sync

๐Ÿ” Real-World Example

Here's a complete workflow for a microservices documentation setup:

# 1. Initialize your Docusaurus project
npx create-docusaurus@latest my-docs classic

# 2. Navigate to your project
cd my-docs

# 3. Initialize DocuSync
docusync init

# 4. Configure your repositories in docusync.json
cat > docusync.json << 'EOF'
{
  "repositories": [
    {
      "github_path": "your-org/auth-service",
      "docs_path": "docs",
      "display_name": "Authentication Service",
      "position": 1,
      "description": "User authentication and authorization"
    },
    {
      "github_path": "your-org/billing-service",
      "docs_path": "docs",
      "display_name": "Billing Service",
      "position": 2,
      "description": "Payment processing and billing management"
    }
  ],
  "paths": {
    "temp_dir": ".temp-repos",
    "docs_dir": "docs"
  },
  "git": {
    "clone_depth": 1,
    "default_branches": ["main", "master"]
  }
}
EOF

# 5. Sync documentation
docusync sync -v

# 6. Start Docusaurus
npm run start

๐Ÿ› ๏ธ Development

Setup Development Environment

# Clone the repository
git clone https://github.com/Roman505050/docusync.git
cd docusync

# Install dependencies
uv sync --all-groups

Code Quality

# Format code
uv run black src/
uv run isort src/

# Lint
uv run flake8 src/

# Type check
uv run mypy src/

Running Tests

# Run all tests
uv run pytest

# With coverage
uv run pytest --cov=docusync --cov-report=html

๐Ÿ“‹ Requirements

  • Python 3.12 or higher
  • Git installed on your system
  • GitHub Access: Either SSH keys configured OR Personal Access Token for HTTPS
  • Docusaurus 2.x or higher (for the target project)

๐Ÿค Contributing

Contributions are welcome! Here's how you can help:

  1. ๐Ÿด Fork the repository
  2. ๐Ÿ”ง Create a feature branch (git checkout -b feature/amazing-feature)
  3. โœ… Commit your changes (git commit -m 'Add amazing feature')
  4. ๐Ÿ“ค Push to the branch (git push origin feature/amazing-feature)
  5. ๐ŸŽ‰ Open a Pull Request

Please make sure to:

  • Add tests for new features
  • Update documentation as needed
  • Follow the existing code style
  • Run linters before submitting

๐Ÿ“ License

This project is licensed under the MIT License - see the LICENSE file for details.

๐Ÿ™ Acknowledgments

  • Click - Beautiful CLI framework
  • Rich - Rich text and formatting in the terminal
  • Pydantic - Data validation using Python type hints
  • Docusaurus - The documentation framework this tool was built for

๐Ÿ“ง Support

๐ŸŒŸ Show Your Support

If you find DocuSync helpful, please consider giving it a โญ๏ธ on GitHub!


Made with โค๏ธ for the Docusaurus community

Report Bug โ€ข Request Feature

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

docusync-2.2.0.tar.gz (50.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

docusync-2.2.0-py3-none-any.whl (26.7 kB view details)

Uploaded Python 3

File details

Details for the file docusync-2.2.0.tar.gz.

File metadata

  • Download URL: docusync-2.2.0.tar.gz
  • Upload date:
  • Size: 50.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for docusync-2.2.0.tar.gz
Algorithm Hash digest
SHA256 fa29a5a9d479154b61b05bfb35dc0e44bf932a50434a8aaa5db616ed69b0127a
MD5 0469ff6cffbc0d450bcc9869c1940338
BLAKE2b-256 da13b983b5749156b0a6279c381d988cae082c72c55772fc12b6068546eba7d7

See more details on using hashes here.

File details

Details for the file docusync-2.2.0-py3-none-any.whl.

File metadata

  • Download URL: docusync-2.2.0-py3-none-any.whl
  • Upload date:
  • Size: 26.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for docusync-2.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7cdc135ac97dee5dd12daa69378009d630a02712b5db872e22e197fdcf696cc4
MD5 11788355eed515591ef650ba19e24d4e
BLAKE2b-256 74c128f0863d6630016168516a08412644b2e6bc9d428a34528ee2097192a4d2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page