Interactive

GitHub Actions

GitHub Actionsを使用して、ClaudeCodeの設定ファイルやドキュメントを複数のリポジトリに同期できます。弊社では、以下のような設定ファイルを用いて、システムプロンプトを各リポジトリに同期しています。

テンプレートは以下のページで公開しています。

https://github.com/interactive-inc/open-prompt/blob/main/github.workflows/sync-sample.ymlhttps://github.com/interactive-inc/open-prompt/blob/main/github.workflows/sync-sample.yml

弊社の推奨ルール

  • 1つのリポジトリで設定ファイルを一元管理し複数の開発リポジトリへ同期する
  • ClaudeCode関連ファイル(agents、commands、output-styles)を共有する
  • GitHub Instructionsで共通のプロンプトを管理する
  • 仕様書は開発リポジトリと相互に同期する

同期するファイルの種類

  • 共通の設定ファイル(editorconfigなど)
  • GitHubの共通ファイル(Issueのテンプレートなど)
  • Copilot
    • prompts - .github/prompts
    • instructions - .github/instructions
  • ClaudeCode
    • agents - .claude/agents
    • commands - .claude/commands
    • output-styles - .claude/output-styles
  • 社内MCPサーバ - mcp
  • 仕様書ディレクトリ - .docs

設定ファイルの構成

システムプロンプトと仕様書とMCPサーバの全てを同期する場合は以下のような構成になります。

name: Sync sample

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - ".github/workflows/sample.yml"
      - "github.prompts/*"
      - "claude.commands/*"
      - "docs/sample/**"

jobs:
  sync:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target_repo:
          - RyukyuInteractive/sample
    env:
      GIT_USER_NAME: RyukyuInteractive
      GIT_USER_EMAIL: <>
      GIT_COMMIT_MESSAGE: "from RyukyuInteractive/inta"
      DOCS_FROM: docs
      DOCS_TO: docs/sample
      GITHUB_INSTRUCTIONS_FROM: github.instructions
      GITHUB_INSTRUCTIONS: |
        core.instructions.md
        ts.instructions.md
      GITHUB_PROMPTS_FROM: github.prompts
      GITHUB_PROMPTS: |
        app.md
        api.md
      CLAUDE_AGENTS_FROM: claude.agents
      CLAUDE_AGENTS: |
        biome-errors-checker.md
      CLAUDE_COMMANDS_FROM: claude.commands
      CLAUDE_COMMANDS: |
        instructions.md
      CLAUDE_OUTPUT_STYLES_FROM: claude.output-styles
      CLAUDE_OUTPUT_STYLES: |
        docs.md
    steps:
      - name: 💪 Checkout source repository
        uses: actions/checkout@v3
        with:
          path: FROM
      - name: 💪 Checkout target repository
        uses: actions/checkout@v3
        with:
          repository: ${{ matrix.target_repo }}
          path: TO
          token: ${{ secrets.PAT_TOKEN }}
      - name: ⚙️ Sync config files
      - name: 🐙 Sync .github
      - name: 🐙 Sync .github/instructions
      - name: 🐙 Sync .github/prompts
      - name: ✴️ Sync .claude/agents
      - name: ✴️ Sync .claude/commands
      - name: ✴️ Sync .claude/output-styles
      - name: 📁 Sync .docs
      - name: 🚀 Commit and push changes

環境変数(env)の役割

ドキュメントの同期設定

DOCS_FROM: docs         # ターゲットリポジトリでの配置先ディレクトリ
DOCS_TO: docs/sample     # ソースリポジトリ内のドキュメント元ディレクトリ

リポジトリでは仕様書をdocsディレクトリで管理しています。
コピー先のDOCS_TOでは必要なドキュメントのサブディレクトリで指定しています。

GitHub Instructionsの同期設定

GITHUB_INSTRUCTIONS_FROM: github.instructions  # ソースリポジトリのディレクトリ
GITHUB_INSTRUCTIONS: |                         # 同期するファイルのリスト
  core.instructions.md
  docs.instructions.md
  ts.instructions.md

_FROMはソースリポジトリ内のディレクトリを指定し、ファイル名のみの変数(GITHUB_INSTRUCTIONS)は同期するファイルをパイプ文字(|)で複数行リストとして定義します。

環境変数の命名規則

  • _FROMサフィックス: ソースリポジトリ内の設定ファイルの場所
  • ファイル名のみの変数: 同期するファイルのリスト(複数行で記述)
  • DOCS_FROM/DOCS_TO: 特殊な命名(FROMがターゲット側、TOがソース側)

チェックアウト

ソースリポジトリをFROMディレクトリに、ターゲットリポジトリをTOディレクトリにチェックアウトします。

steps:
  - name: 💪 Checkout source repository
    uses: actions/checkout@v3
    with:
      path: FROM
  - name: 💪 Checkout target repository
    uses: actions/checkout@v3
    with:
      repository: ${{ matrix.target_repo }}
      path: TO
      token: ${{ secrets.PAT_TOKEN }}

同期処理の詳細

設定ファイルの同期

- name: ⚙️ Sync config files
  run: |
    cp "FROM/.editorconfig" "TO/.editorconfig"

GitHub Prompts

GitHub Instructions

GitHubのInstructionsを同期します。

- name: 🐙 Sync .github/instructions
  run: |
    rm -rf TO/.github/instructions
    mkdir -p TO/.github
    mkdir -p TO/.github/instructions
    echo "$GITHUB_INSTRUCTIONS" | xargs -I {} cp "FROM/$GITHUB_INSTRUCTIONS_FROM/{}" "TO/.github/instructions/{}"

サブディレクトリを使用する場合(既存ファイルを保持)

弊社では、プロジェクト固有の設定を保持したい場合、サブディレクトリを使用します。_:などの記号をディレクトリ名に使用することで、共通設定と固有設定を分離します。

# agents: "_"サブディレクトリに共通設定を配置
- name: ✴️ Sync .claude/agents
  run: |
    rm -rf TO/.claude/agents/_
    mkdir -p TO/.claude/agents
    mkdir -p TO/.claude/agents/_
    echo "$CLAUDE_AGENTS" | xargs -I {} cp "FROM/$CLAUDE_AGENTS_FROM/{}" "TO/.claude/agents/_/{}"

# commands: ":"サブディレクトリに共通設定を配置  
- name: ✴️ Sync .claude/commands
  run: |
    rm -rf TO/.claude/commands/:
    mkdir -p TO/.claude/commands
    mkdir -p TO/.claude/commands/:
    echo "$CLAUDE_COMMANDS" | xargs -I {} cp "FROM/$CLAUDE_COMMANDS_FROM/{}" "TO/.claude/commands/:/{}"

この方法により、以下のようなディレクトリ構造になります:

.claude/
├── agents/
│   ├── _/                    # 共通設定(同期される)
│   │   └── biome-errors-checker.md
│   └── project-specific.md   # プロジェクト固有(保持される)
├── commands/
│   ├── :/                    # 共通設定(同期される)
│   │   └── instructions.md
│   └── custom-command.md     # プロジェクト固有(保持される)
└── output-styles/
    ├── _/                    # 共通設定(同期される)
    │   └── docs.md
    └── project-style.md      # プロジェクト固有(保持される)

MCPサーバーの同期

ディレクトリごと同期します。

- name: 🍎 Sync mcp
  run: |
    rm -rf TO/mcp
    cp -r FROM/mcp TO/mcp

ファイルパス

ソースリポジトリの構造はこのようになっています。

FROM/ (source-repo)
├── .editorconfig          # 共通設定ファイル
├── .github/
│   └── PULL_REQUEST_TEMPLATE.md
├── github.prompts/        # Copilot用(envのGITHUB_PROMPTS_FROM)
│   ├── app.md
│   └── api.md
├── github.instructions/   # ClaudeCode instructions用(envのGITHUB_INSTRUCTIONS_FROM)
│   ├── core.instructions.md
│   └── ts.instructions.md
├── claude.agents/         # ClaudeCode agents用(envのCLAUDE_AGENTS_FROM)
│   ├── biome-errors-checker.md
│   └── ts-errors.md
├── claude.commands/       # ClaudeCode commands用(envのCLAUDE_COMMANDS_FROM)
│   └── instructions.md
├── claude.output-styles/  # ClaudeCode output-styles用(envのCLAUDE_OUTPUT_STYLES_FROM)
│   └── docs.md
├── docs/sample/           # ドキュメント(envのDOCS_TO)
│   └── README.md
└── mcp/                   # MCPサーバー設定

同期先のリポジトリではこのように配置されます。

TO/ (target-repo)
├── .editorconfig          # FROM/.editorconfigからコピー
├── .github/
│   ├── PULL_REQUEST_TEMPLATE.md  # FROM/.github/からコピー
│   ├── prompts/           # Copilotが読み込む場所
│   │   ├── app.md         # FROM/github.prompts/からコピー
│   │   └── api.md
│   └── instructions/      # ClaudeCodeが読み込む場所
│       ├── core.instructions.md  # FROM/github.instructions/からコピー
│       └── ts.instructions.md
├── .claude/
│   ├── agents/            # ClaudeCode agentsが読み込む場所
│   │   ├── biome-errors-checker.md  # FROM/claude.agents/からコピー
│   │   └── ts-errors.md
│   ├── commands/          # ClaudeCode commandsが読み込む場所
│   │   └── instructions.md          # FROM/claude.commands/からコピー
│   └── output-styles/     # ClaudeCode output-stylesが読み込む場所
│       └── docs.md                  # FROM/claude.output-styles/からコピー
├── .docs/                 # ドキュメント(envのDOCS_FROM)
│   └── README.md          # FROM/docs/sample/からコピー
└── mcp/                   # MCPサーバー設定