# インフラ構成図

## 1. ランタイム構成（エンドユーザー環境）

serve-dがエディタから起動され、ローカルマシン上で動作する際の構成を示す。

```mermaid
graph TB
    subgraph "エンドユーザー ローカルマシン"
        subgraph "エディタプロセス"
            Editor["エディタ<br/>(VS Code / Vim / Emacs 等)"]
            Plugin["LSPクライアントプラグイン<br/>(code-d / ide-d 等)"]
        end

        subgraph "serve-d プロセス"
            App["app.d<br/>(エントリーポイント)"]
            ServerBase["serverbase<br/>(LSPサーバー基盤)"]
            JSONRPC["JSON-RPC<br/>(stdin/stdout通信)"]
            FiberMgr["FiberManager<br/>(軽量スレッド管理)"]
            LSP["lsp<br/>(プロトコル型定義)"]
            WorkspaceD["workspace-d<br/>(D言語コア機能)"]
            DCDClient["dcd<br/>(DCDクライアント)"]
            HTTP["http<br/>(ファイルダウンロード)"]
        end

        subgraph "外部ツール（ローカル）"
            DCDServer["DCD Server<br/>(コード補完デーモン)"]
            DScanner["D-Scanner<br/>(静的解析)"]
            Dfmt["dfmt<br/>(コードフォーマッタ)"]
        end

        Plugin -- "stdin/stdout<br/>JSON-RPC (LSP)" --> JSONRPC
        App --> ServerBase
        ServerBase --> JSONRPC
        ServerBase --> FiberMgr
        JSONRPC --> LSP
        ServerBase --> WorkspaceD
        WorkspaceD --> DCDClient
        WorkspaceD --> DScanner
        WorkspaceD --> Dfmt
        DCDClient -- "直接通信<br/>(プロセス間)" --> DCDServer
        HTTP -- "HTTPS" --> ExtDL["DUBレジストリ /<br/>GitHub Releases"]
    end

    Editor --> Plugin
```

## 2. CI/CD パイプライン構成

GitHub Actionsを利用したビルド・テスト・リリースのパイプライン構成を示す。

```mermaid
graph LR
    subgraph "GitHub"
        Repo["GitHub Repository<br/>(Pure-D/serve-d)"]
        Actions["GitHub Actions"]
        Releases["GitHub Releases"]
    end

    subgraph "ワークフロートリガー"
        Push["push (master)"]
        PR["pull_request"]
        Schedule["cron (UTC 02:00)"]
        Release["release published"]
        Manual["workflow_dispatch"]
    end

    Push --> UT["unittest.yml"]
    PR --> UT
    Schedule --> Nightly["nightly.yml"]
    Manual --> Nightly
    Release --> Rel["releases.yml"]

    subgraph "unittest.yml (テスト)"
        UT --> UT_Matrix["マトリクスビルド"]
        UT_Matrix --> UT_Linux["ubuntu-22.04<br/>(dmd-latest, ldc-latest)"]
        UT_Matrix --> UT_Mac["macos-latest<br/>(ldc-latest)"]
        UT_Matrix --> UT_Win["windows-latest<br/>(ldc-latest)"]
    end

    subgraph "nightly.yml (ナイトリー)"
        Nightly --> N_Matrix["マトリクスビルド"]
        N_Matrix --> N_Linux["ubuntu-22.04<br/>x86_64"]
        N_Matrix --> N_Mac_x86["macos-latest<br/>x86_64"]
        N_Matrix --> N_Mac_arm["macos-latest<br/>arm64 (cross)"]
        N_Matrix --> N_Win_64["windows-latest<br/>x86_64"]
        N_Matrix --> N_Win_32["windows-latest<br/>x86"]
    end

    subgraph "releases.yml (安定版)"
        Rel --> R_Matrix["マトリクスビルド"]
        R_Matrix --> R_Linux["ubuntu-22.04<br/>x86_64"]
        R_Matrix --> R_Mac_x86["macos-latest<br/>x86_64"]
        R_Matrix --> R_Mac_arm["macos-latest<br/>arm64 (cross)"]
        R_Matrix --> R_Win_64["windows-latest<br/>x86_64"]
        R_Matrix --> R_Win_32["windows-latest<br/>x86"]
    end

    N_Linux --> Releases
    N_Mac_x86 --> Releases
    N_Mac_arm --> Releases
    N_Win_64 --> Releases
    N_Win_32 --> Releases
    R_Linux --> Releases
    R_Mac_x86 --> Releases
    R_Mac_arm --> Releases
    R_Win_64 --> Releases
    R_Win_32 --> Releases
```

## 3. ビルド・リリースフロー

各プラットフォームにおけるビルドとパッケージングの処理フローを示す。

```mermaid
flowchart TD
    Start["ビルド開始"] --> Checkout["actions/checkout@v4"]
    Checkout --> SetupD["dlang-community/setup-dlang@v1<br/>(LDC latest)"]
    SetupD --> Test["dub test"]
    Test --> BuildDecision{OS判定}

    BuildDecision -->|Linux| LinuxBuild["ci/build.sh<br/>dub build --compiler=ldc2<br/>--build=BUILD --arch=ARCH"]
    BuildDecision -->|macOS| MacBuild["ci/build.sh<br/>MACOSX_DEPLOYMENT_TARGET=10.12<br/>dub build --compiler=ldc2"]
    BuildDecision -->|Windows| WinBuild["ci/build.bat<br/>dub build --compiler=ldc2"]

    LinuxBuild --> LinuxStrip["strip serve-d"]
    LinuxStrip --> LinuxPkg["tar cfJ serve-d.tar.xz<br/>tar czf serve-d.tar.gz"]

    MacBuild --> MacPkg["tar cfJ serve-d.tar.xz<br/>tar czf serve-d.tar.gz"]

    WinBuild --> WinPkg["7z a serve-d.zip<br/>(serve-d.exe + DLLs)"]

    LinuxPkg --> Deploy["GitHub Releases<br/>へアップロード"]
    MacPkg --> Deploy
    WinPkg --> Deploy

    Deploy --> Cache["WebFreak001/dub-upgrade@v0.1.0<br/>(依存関係キャッシュ保存)"]
```

## 4. serve-d プロセス内部構成

serve-dプロセス内のサブパッケージ依存関係を示す。

```mermaid
graph TD
    subgraph "serve-d メインパッケージ"
        Main["source/<br/>(LSPコマンドマッピング)"]
    end

    subgraph "サブパッケージ"
        HTTP["serve-d:http<br/>(HTTPダウンロード)"]
        LSP["serve-d:lsp<br/>(LSP型定義・JSON-RPC)"]
        ServerBase["serve-d:serverbase<br/>(LSPサーバー基盤)"]
        DCD["serve-d:dcd<br/>(DCDクライアント)"]
        WorkspaceD["serve-d:workspace-d<br/>(D言語コア機能)"]
        Protocol["serve-d:protocol<br/>(シリアライゼーション)"]
    end

    subgraph "外部依存ライブラリ"
        libddoc["libddoc 0.8.0"]
        rmrf["rm-rf 0.1.0"]
        dietcomplete["diet-complete 0.0.3"]
        emsi["emsi_containers 0.9.0"]
        fuzzymatch["fuzzymatch 1.0.0"]
        sdlfmt["sdlfmt 0.1.1"]
        dcdlib["dcd 0.16.2"]
        dscanner["dscanner 0.16.0-beta.5"]
        dfmt["dfmt 0.15.2"]
        libdparse["libdparse 0.25.1"]
        requests["requests 2.2.0"]
    end

    Main --> HTTP
    Main --> LSP
    Main --> ServerBase
    Main --> WorkspaceD
    Main --> libddoc
    Main --> rmrf
    Main --> dietcomplete
    Main --> emsi
    Main --> fuzzymatch
    Main --> sdlfmt

    ServerBase --> LSP
    WorkspaceD --> DCD
    WorkspaceD --> dcdlib
    WorkspaceD --> dscanner
    WorkspaceD --> dfmt
    WorkspaceD --> libdparse
    HTTP --> requests
end
```
