Maki commited on
Commit
1fe9b6d
·
unverified ·
0 Parent(s):

Initial commit

Browse files
.SourceSageignore ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # バージョン管理システム関連
2
+ .git/
3
+ .gitignore
4
+
5
+ # キャッシュファイル
6
+ __pycache__/
7
+ .pytest_cache/
8
+ **/__pycache__/**
9
+ *.pyc
10
+
11
+ # ビルド・配布関連
12
+ build/
13
+ dist/
14
+ *.egg-info/
15
+
16
+ # 一時ファイル・出力
17
+ output/
18
+ output.md
19
+ test_output/
20
+ .SourceSageAssets/
21
+ .SourceSageAssetsDemo/
22
+
23
+ # アセット
24
+ *.png
25
+ *.svg
26
+ *.jpg
27
+ *.jepg
28
+ assets/
29
+
30
+ # その他
31
+ LICENSE
32
+ example/
33
+ package-lock.json
34
+ .DS_Store
35
+
36
+ # 特定のディレクトリを除外
37
+ tests/temp/
38
+ docs/drafts/
39
+
40
+ # パターンの例外(除外対象から除外)
41
+ !docs/important.md
42
+ !.github/workflows/
43
+ repository_summary.md
44
+
45
+ # Terraform関連
46
+ .terraform
47
+ *.terraform.lock.hcl
48
+ *.backup
49
+ *.tfstate
50
+
51
+ # Python仮想環境
52
+ venv
53
+ .venv
54
+
.env.example ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### .env.example
2
+ # 環境変数のサンプルファイル
3
+
4
+ # OpenAI APIキー
5
+ OPENAI_API_KEY=your_openai_api_key
6
+
7
+ # GitHub APIトークン(省略可: GitHub Actionsでは自動で提供されます)
8
+ GITHUB_TOKEN=your_github_token
9
+
10
+ # Codex挙動の設定
11
+ # 静粛モード: 1 に設定すると余分なログ出力を抑制
12
+ CODEX_QUIET_MODE=1
.github/beta-workflows/beta-code-review-codex.yml ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Code Review Bot (Codex)
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: write
10
+ pull-requests: write
11
+
12
+ jobs:
13
+ code-review:
14
+ runs-on: ubuntu-latest
15
+
16
+ steps:
17
+ - name: Checkout repository
18
+ uses: actions/checkout@v3
19
+ with:
20
+ fetch-depth: 0 # 完全な履歴を取得
21
+
22
+ - name: Setup Node.js
23
+ uses: actions/setup-node@v3
24
+ with:
25
+ node-version: '20'
26
+
27
+ - name: Install OpenAI Codex
28
+ run: |
29
+ npm install -g codex
30
+
31
+ - name: Review PR with Codex
32
+ env:
33
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
34
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
35
+ CODEX_QUIET_MODE: "1"
36
+ run: |
37
+ # PRの差分を取得
38
+ git fetch origin ${{ github.base_ref }}
39
+ git diff origin/${{ github.base_ref }}...${{ github.head_ref }} > pr_diff.txt
40
+
41
+ # Codexを使ってコードレビュー
42
+ codex -a auto-edit "$(cat << 'EOF'
43
+ プルリクエストのコードレビューを実施してください。
44
+
45
+ PR番号: #${{ github.event.pull_request.number }}
46
+ タイトル: ${{ github.event.pull_request.title }}
47
+
48
+ 以下の観点でレビューしてください:
49
+
50
+ 1. コード品質
51
+ - 命名規則が一貫しているか
52
+ - 未使用のコードやコメントアウトされたコードがないか
53
+ - コードの重複が最小限か
54
+
55
+ 2. セキュリティ
56
+ - APIキーやパスワードなどの機密情報が含まれていないか
57
+ - 適切なエラーハンドリングがされているか
58
+
59
+ 3. パフォーマンス
60
+ - 効率的なアルゴリズムが使用されているか
61
+ - 不要な処理がないか
62
+
63
+ 4. ドキュメント
64
+ - 適切なコメントが付けられているか
65
+ - READMEが更新されているか(必要な場合)
66
+
67
+ レビュー結果は以下の形式で出力してください:
68
+ 1. PRにコメントを投稿
69
+ 2. 改善が必要な場合は、新しいブランチを作成して修正プルリクエストを作成
70
+
71
+ 重要: GitHubのトークンは環境変数 GITHUB_TOKEN で利用可能です。
72
+ 差分は pr_diff.txt として保存されています。
73
+ EOF
74
+ )"
75
+
76
+ - name: Post review comments
77
+ if: always()
78
+ run: |
79
+ if [ -f "review_comments.txt" ]; then
80
+ gh pr comment ${{ github.event.pull_request.number }} --body-file review_comments.txt
81
+ fi
.github/beta-workflows/beta-document-quality-check.yml ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Document Quality Check (Codex)
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ paths:
8
+ - '**.md'
9
+ pull_request:
10
+ paths:
11
+ - '**.md'
12
+ workflow_dispatch:
13
+
14
+ permissions:
15
+ contents: write
16
+ pull-requests: write
17
+
18
+ jobs:
19
+ check-docs:
20
+ runs-on: ubuntu-latest
21
+
22
+ steps:
23
+ - name: Checkout repository
24
+ uses: actions/checkout@v3
25
+
26
+ - name: Setup Node.js
27
+ uses: actions/setup-node@v3
28
+ with:
29
+ node-version: '20'
30
+
31
+ - name: Install OpenAI Codex
32
+ run: |
33
+ npm install -g @openai/codex
34
+
35
+ - name: Check documentation quality with Codex
36
+ env:
37
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
38
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
39
+ CODEX_QUIET_MODE: "1"
40
+ run: |
41
+ # Codexを使ってドキュメントの品質をチェック
42
+ codex -a auto-edit --quiet "
43
+ リポジトリのドキュメントを品質チェックしてください。
44
+
45
+ 以下のチェックリストに従って確認し、必要に応じて修正してください:
46
+
47
+ ====
48
+
49
+ # リポジトリ品質確認プロンプト V2
50
+
51
+ あなたは優れたコードレビューとリポジトリ構造分析の専門家です。以下のチェックリストに沿って、リポジトリ全体の品質確認を行ってください。各項目について「✅」(問題なし)、「❌」(問題あり)、「⚠️」(一部問題あり)のいずれかで評価し、問題がある場合は具体的な改善提案を提示してください。
52
+
53
+ ## チェックリスト
54
+
55
+ ### 📝 README.md の品質確認
56
+ - [ ] タイトルは中央揃えになっているか
57
+ - [ ] ヘッダー画像は中央揃えになっているか(既にヘッダー画像がある場合はそれを使用すること)
58
+ - [ ] 技術スタックのバッジが適切に配置され、中央揃えになっているか
59
+ - [ ] 各セクションに絵文字が活用され、可読性が向上しているか
60
+ - [ ] ドキュメントは適切に分割されて、それぞれに適切にリンクされているか
61
+ - [ ] インストール手順が明確に記載されているか
62
+ - [ ] 使用方法が明確に記載されているか
63
+ - [ ] スクリーンショットや図が適切に使用されているか
64
+
65
+ ### 📚 ドキュメンテーション全体の一貫性
66
+ - [ ] 各階層に README.md が存在するか(なければ作成が必要)
67
+ - [ ] 各階層の README.md が適切に上位階層の README.md を参照しているか
68
+ - [ ] 各 README.md の内容が重複せず、適切に分割されているか
69
+ - [ ] 各 README.md が重くなりすぎていないか、適切にファイル分割されているか
70
+ - [ ] 分割されたファイルに適切にリンクが貼られているか
71
+ - [ ] 全てのドキュメントで一貫した用語が使用されているか
72
+ - [ ] リポジトリ全体でのドキュメントの構造が論理的か
73
+
74
+ ### 🔒 環境設定とセキュリティ
75
+ - [ ] `.env` や環境変数が適切に使用されているか
76
+ - [ ] 直接コード内にAPIキーやパスワードなどの機密情報が記載されていないか(`.env`にはOK)
77
+ - [ ] `.gitignore` ファイルに `.env` が適切に記載されているか
78
+ - [ ] `.env.example` が存在し、必要な環境変数の例が記載されているか
79
+
80
+ ### 💻 コード品質
81
+ - [ ] コードコメントは適切に記載されているか
82
+ - [ ] 命名規則が一貫しているか
83
+ - [ ] 未使用のコードやコメントアウトされたコードが放置されていないか
84
+
85
+ ### 📂 プロジェクト構造
86
+ - [ ] フォルダ構造が論理的で理解しやすいか
87
+ - [ ] 依存関係が適切に管理されているか
88
+
89
+ ## 出力形式
90
+
91
+ 以下のような形式でチェックリストの結果を出力してください:
92
+
93
+ ### 📝 README.md の品質確認
94
+ - [✅/❌/⚠️] タイトルは中央揃えになっているか
95
+ - 問題点と改善提案(問題がある場合)
96
+ - [✅/❌/⚠️] ヘッダー画像は中央揃えになっているか
97
+ - 問題点と改善提案(問題がある場合)
98
+ - ...(以下同様)
99
+
100
+ ### 📚 ドキュメンテーション全体の一貫性
101
+ - [✅/❌/⚠️] 各階層に README.md が存在するか
102
+ - 問題点と改善提案(問題がある場合)
103
+ - [✅/❌/⚠️] 各階層の README.md が適切に上位階層の README.md を参照しているか
104
+ - 問題点と改善提案(問題がある場合)
105
+ - ...(以下同様)
106
+
107
+ (他のセクションも同様の形式で)
108
+
109
+ ### 🔍 総評
110
+ リポジトリの現在の状態に関する簡潔な総評と、優先して対応すべき最重要の改善点3つを提示してください。
111
+
112
+ ### 📝 具体的な修正例
113
+ 最も重要な改善点について、具体的なコードやマークダウンの修正例を提示してください。
114
+
115
+ #### README.md 階層構造確認
116
+ 以下の点を特に注意して確認してください:
117
+ 1. 各ディレクトリに README.md があるか確認し、なければ作成を提案する
118
+ 2. 各 README.md が上位の README.md を適切に参照しているか確認し、重複を避ける
119
+ 3. README.md が長すぎる場合は、適切なファイル分割とリンク設定を提案する
120
+
121
+ ---
122
+
123
+ このチェックリストに沿って、リポジトリ全体を分析し、開発サイクルのクロージング処理として必要な改善点を明確にしてください。
124
+
125
+ 問題がある場合は自動的に修正し、新しいブランチを作成してプルリクエストを作成してください。
126
+
127
+ 重要: GitHubのトークンは環境変数 GITHUB_TOKEN で利用可能です。
128
+ "
129
+
130
+ - name: Check if develop branch exists
131
+ id: check-develop
132
+ run: |
133
+ if git ls-remote --heads origin develop | grep develop; then
134
+ echo "develop_exists=true" >> $GITHUB_OUTPUT
135
+ else
136
+ echo "develop_exists=false" >> $GITHUB_OUTPUT
137
+ fi
138
+
139
+ - name: Create develop branch if it doesn't exist
140
+ if: ${{ steps.check-develop.outputs.develop_exists == 'false' }}
141
+ env:
142
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
143
+ run: |
144
+ git config --local user.email "github-actions[bot]@users.noreply.github.com"
145
+ git config --local user.name "github-actions[bot]"
146
+ git checkout -b develop
147
+ git push origin develop
148
+ echo "Created new develop branch"
149
+
150
+ - name: Commit changes to temporary branch
151
+ if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
152
+ env:
153
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
154
+ run: |
155
+ git config --local user.email "github-actions[bot]@users.noreply.github.com"
156
+ git config --local user.name "github-actions[bot]"
157
+
158
+ if [[ -n $(git status -s) ]]; then
159
+ TIMESTAMP=$(date +%Y%m%d-%H%M%S)
160
+ BRANCH_NAME="docs/quality-improvement-${TIMESTAMP}"
161
+ git checkout -b $BRANCH_NAME
162
+ git add .
163
+ git commit -m "🫐 docs: ドキュメント品質の自動改善"
164
+ git push origin $BRANCH_NAME
165
+ echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
166
+ else
167
+ echo "No changes to commit"
168
+ fi
169
+
170
+ - name: Create PR to develop
171
+ if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && env.BRANCH_NAME != '' }}
172
+ env:
173
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
174
+ run: |
175
+ # Create PR to develop branch
176
+ gh pr create --title "🫐 docs: ドキュメント品質の自動改善" \
177
+ --body "Codexによるドキュメント品質チェックを実行し、いくつかの改善を行いました。mainブランチからの変更をdevelopブランチにマージします。" \
178
+ --base develop \
179
+ --head $BRANCH_NAME
.github/beta-workflows/beta-readme-translation-codex.yml ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: README Translation Bot (Codex)
2
+
3
+ on:
4
+ push:
5
+ paths:
6
+ - 'README.md'
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: write
11
+ pull-requests: write
12
+
13
+ jobs:
14
+ translate-readme:
15
+ runs-on: ubuntu-latest
16
+
17
+ steps:
18
+ - name: Checkout repository
19
+ uses: actions/checkout@v3
20
+
21
+ - name: Setup Node.js
22
+ uses: actions/setup-node@v3
23
+ with:
24
+ node-version: '20'
25
+
26
+ - name: Install OpenAI Codex
27
+ run: |
28
+ npm install -g @openai/codex
29
+
30
+ - name: Translate README with Codex
31
+ env:
32
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
33
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
34
+ CODEX_QUIET_MODE: "1"
35
+ run: |
36
+ # READMEを英語に翻訳するためにCodexを使用
37
+ codex -a auto-edit --quiet "
38
+ README.mdを英語に翻訳してください。
39
+
40
+ 以下の要件に従って翻訳してください:
41
+
42
+ 1. 元のマークダウン形式を維持
43
+ 2. 技術用語は適切な英語で表現
44
+ 3. 絵文字はそのまま維持
45
+ 4. バッジやリンクは変更しない
46
+ 5. コードブロックの内容は翻訳しない
47
+
48
+ 翻訳後のファイルは README.en.md として保存してください。
49
+ その後、以下の作業を行ってください:
50
+
51
+ 1. 新しいブランチを作成
52
+ 2. README.en.md をコミット
53
+ 3. プルリクエストを作成
54
+ 4. PRの説明文に翻訳の品質に関する簡単なサマリーを記載
55
+
56
+ 重要: GitHubのトークンは環境変数 GITHUB_TOKEN で利用可能です。
57
+ "
58
+
59
+ - name: Create PR if translation is created
60
+ env:
61
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
62
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
63
+ CODEX_QUIET_MODE: "1"
64
+ run: |
65
+ git config --local user.email "github-actions[bot]@users.noreply.github.com"
66
+ git config --local user.name "github-actions[bot]"
67
+
68
+ if [ -f "README.en.md" ]; then
69
+ BRANCH_NAME="docs/translate-readme-en-$(date +%Y%m%d-%H%M%S)"
70
+ git checkout -b $BRANCH_NAME
71
+ git add README.en.md
72
+ git commit -m "docs: READMEを英語に翻訳"
73
+ git push origin $BRANCH_NAME
74
+
75
+ gh pr create --title "📄 docs: READMEを英語に翻訳" \
76
+ --body "CodexによってREADMEを英語に翻訳しました。" \
77
+ --base develop \
78
+ --head $BRANCH_NAME
79
+ fi
.github/workflows/auto-release-notes.yml ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Auto Release Notes with Codex
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ create-release-notes:
13
+ runs-on: ubuntu-latest
14
+
15
+ steps:
16
+ - name: Checkout repository
17
+ uses: actions/checkout@v4
18
+ with:
19
+ fetch-depth: 0
20
+
21
+ - name: Install OpenAI Codex
22
+ run: npm install -g @openai/codex
23
+
24
+ - name: Generate Diff File
25
+ env:
26
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
27
+ run: |
28
+ # 現在のタグと前のタグを取得
29
+ CURRENT_TAG=${GITHUB_REF#refs/tags/}
30
+ PREVIOUS_TAG=$(git describe --tags --abbrev=0 ${CURRENT_TAG}^ 2>/dev/null || echo "")
31
+
32
+ # タグ間の差分を生成してファイルに保存
33
+ if [ -n "$PREVIOUS_TAG" ]; then
34
+ echo "タグ間の差分を生成中: ${PREVIOUS_TAG}..${CURRENT_TAG}"
35
+ git diff ${PREVIOUS_TAG}..${CURRENT_TAG} > diff.txt
36
+ echo "コミットログを生成中: ${PREVIOUS_TAG}..${CURRENT_TAG}"
37
+ git log ${PREVIOUS_TAG}..${CURRENT_TAG} --pretty=format:"%h - %s%n%b%n" > commits.txt
38
+ else
39
+ echo "初回リリース: すべての変更を含めます"
40
+ git diff $(git rev-list --max-parents=0 HEAD)..HEAD > diff.txt
41
+ git log --pretty=format:"%h - %s%n%b%n" > commits.txt
42
+ fi
43
+
44
+ # 変更されたファイルのリストを生成
45
+ if [ -n "$PREVIOUS_TAG" ]; then
46
+ git diff --name-status ${PREVIOUS_TAG}..${CURRENT_TAG} > changed_files.txt
47
+ else
48
+ git diff --name-status $(git rev-list --max-parents=0 HEAD)..HEAD > changed_files.txt
49
+ fi
50
+
51
+ - name: Generate Release Notes
52
+ env:
53
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
54
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
55
+ CODEX_QUIET_MODE: "1"
56
+ CODEX_NO_TTY: "1"
57
+ run: |
58
+ # 現在のタグと前のタグを取得
59
+ CURRENT_TAG=${GITHUB_REF#refs/tags/}
60
+ PREVIOUS_TAG=$(git describe --tags --abbrev=0 ${CURRENT_TAG}^ 2>/dev/null || echo "")
61
+
62
+ # Codexにリリースノートの生成を指示
63
+ codex -a auto-edit --quiet "以下の情報を使ってリリースノートを作成し、release_notes.mdファイルに保存してください:
64
+
65
+ 現在のタグ: ${CURRENT_TAG}
66
+ 前回のタグ: ${PREVIOUS_TAG}
67
+
68
+ 実行してください:
69
+ 1. 以下のファイルを読み込んで分析してください:
70
+ - diff.txt: 2つのタグ間のコード差分
71
+ - commits.txt: コミットログ
72
+ - changed_files.txt: 変更されたファイルのリスト
73
+
74
+ 2. これらのファイルを分析して、以下を含むリリースノートを作成:
75
+ - 新機能
76
+ - バグ修正
77
+ - 破壊的変更
78
+ - その他の改善
79
+
80
+ 3. リリースノートをrelease_notes.mdファイルに保存
81
+
82
+ リリースノートは以下の形式でフォーマットしてください:
83
+ # Release ${CURRENT_TAG}: [リリースノートのタイトルをここに記入]
84
+
85
+ ## 🚀 新機能
86
+ - 機能の説明
87
+
88
+ ## 🐛 バグ修正
89
+ - 修正内容の説明
90
+
91
+ ## ⚠️ 破壊的変更
92
+ - 変更内容の説明
93
+
94
+ 前回のタグが存在しない場合は、初回リリースとして適切なメッセージを作成してください。
95
+
96
+ ファイルの作成は以下のように実行してください:
97
+ echo '# Release ${CURRENT_TAG}' > release_notes.md
98
+ echo '' >> release_notes.md
99
+ # ... (他の内容) ...
100
+ "
101
+
102
+ # デバッグ用にリリースノートの内容を表示
103
+ if [ -f release_notes.md ]; then
104
+ echo "生成されたリリースノート:"
105
+ cat release_notes.md
106
+ else
107
+ echo "リリースノートの生成に失敗しました"
108
+ fi
109
+
110
+ - name: Create Release
111
+ env:
112
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
113
+ run: |
114
+ CURRENT_TAG=${GITHUB_REF#refs/tags/}
115
+ # release_notes.mdが存在する場合はそれを使用
116
+ if [ -f release_notes.md ]; then
117
+ gh release create ${CURRENT_TAG} --title "🚀 Release ${CURRENT_TAG}" --notes-file release_notes.md
118
+ else
119
+ # Codexが失敗した場合のフォールバック
120
+ echo "# Release ${CURRENT_TAG}" > fallback_notes.md
121
+ echo "" >> fallback_notes.md
122
+ PREVIOUS_TAG=$(git describe --tags --abbrev=0 ${CURRENT_TAG}^ 2>/dev/null || echo "")
123
+ if [ -n "$PREVIOUS_TAG" ]; then
124
+ echo "## コミット一覧" >> fallback_notes.md
125
+ git log ${PREVIOUS_TAG}..${CURRENT_TAG} --pretty=format:"- %s" >> fallback_notes.md
126
+ else
127
+ echo "## 初回リリース" >> fallback_notes.md
128
+ echo "このリポジトリの初回リリースです。" >> fallback_notes.md
129
+ fi
130
+ gh release create ${CURRENT_TAG} --title "🌟 Release ${CURRENT_TAG}" --notes-file fallback_notes.md
131
+ fi
.github/workflows/debug-info-codex.yml ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Debug Information
2
+
3
+ on:
4
+ workflow_dispatch: # 手動実行
5
+ inputs:
6
+ issue_number:
7
+ description: 'Issue番号'
8
+ required: true
9
+ type: string
10
+ issues: # issueが開いたときに自動実行
11
+ types: [opened]
12
+ workflow_call: # 他のワークフローから呼び出し可能
13
+ inputs:
14
+ issue_number:
15
+ required: true
16
+ type: string
17
+
18
+ permissions:
19
+ issues: write
20
+ contents: read
21
+
22
+ jobs:
23
+ debug-info:
24
+ runs-on: ubuntu-latest
25
+
26
+ steps:
27
+ - name: Set Issue Number
28
+ id: issue
29
+ run: |
30
+ # issue_numberを設定:手動実行、issue開封、または他のワークフローからの呼び出し
31
+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
32
+ echo "issue_number=${{ github.event.inputs.issue_number }}" >> $GITHUB_OUTPUT
33
+ elif [ "${{ github.event_name }}" = "issues" ]; then
34
+ echo "issue_number=${{ github.event.issue.number }}" >> $GITHUB_OUTPUT
35
+ else
36
+ echo "issue_number=${{ inputs.issue_number }}" >> $GITHUB_OUTPUT
37
+ fi
38
+
39
+ - name: Checkout repository
40
+ uses: actions/checkout@v4
41
+
42
+ - name: Install OpenAI Codex
43
+ run: npm install -g @openai/[email protected]
44
+
45
+ - name: GitHub CLIをインストール
46
+ run: |
47
+ type -p curl >/dev/null || apt install curl -y
48
+ curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
49
+ && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
50
+ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
51
+ && sudo apt update \
52
+ && sudo apt install gh -y
53
+
54
+ - name: Debug Information
55
+ env:
56
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
57
+ ISSUE_NUMBER: ${{ steps.issue.outputs.issue_number }}
58
+ run: |
59
+ # コマンドを実行して結果を取得
60
+ echo "Codexの詳細情報を取得中..."
61
+
62
+ # 情報収集
63
+ SYSTEM_INFO=$(uname -a)
64
+ OS_INFO=$(cat /etc/os-release 2>/dev/null || lsb_release -a 2>/dev/null)
65
+ NODE_VERSION=$(node -v)
66
+ NPM_VERSION=$(npm -v)
67
+ CODEX_VERSION=$(codex --version 2>/dev/null || echo 'バージョン取得失敗')
68
+ CODEX_PATH=$(which codex 2>/dev/null || echo '場所不明')
69
+ CODEX_PACKAGE_INFO=$(npm list -g @openai/codex 2>/dev/null || echo '情報取得失敗')
70
+ NPM_VERSIONS=$(npm view @openai/codex versions --json 2>/dev/null || echo '[]')
71
+
72
+ # cgroup確認
73
+ if [ -f /proc/1/cgroup ]; then
74
+ CGROUP_EXISTS="✅ 存在します"
75
+ CGROUP_CONTENT=$(head -n 5 /proc/1/cgroup)
76
+ else
77
+ CGROUP_EXISTS="❌ 存在しません"
78
+ CGROUP_CONTENT=""
79
+ fi
80
+
81
+ # codexコマンドのヘルプ情報
82
+ CODEX_HELP=$(codex --help 2>&1 | head -n 20)
83
+
84
+ # 結果をファイルに保存
85
+ echo "環境情報をissueにコメントします"
86
+ {
87
+ echo "## 🔍 デバッグ情報"
88
+ echo "<details>"
89
+ echo "<summary>詳細情報(クリックして展開)</summary>"
90
+ echo ""
91
+ echo "サンドボックスエラー「Sandbox was mandated, but no sandbox is available!」のデバッグ情報:"
92
+ echo ""
93
+ echo "### システム環境"
94
+ echo "\`\`\`"
95
+ echo "$SYSTEM_INFO"
96
+ echo "$OS_INFO"
97
+ echo "\`\`\`"
98
+ echo ""
99
+ echo "### Node.js & npm 情報"
100
+ echo "\`\`\`"
101
+ echo "Node.js: $NODE_VERSION"
102
+ echo "npm: $NPM_VERSION"
103
+ echo "\`\`\`"
104
+ echo ""
105
+ echo "### Codex情報"
106
+ echo "\`\`\`"
107
+ echo "Version: $CODEX_VERSION"
108
+ echo "Path: $CODEX_PATH"
109
+ echo "Package info: "
110
+ echo "$CODEX_PACKAGE_INFO"
111
+ echo "\`\`\`"
112
+ echo ""
113
+ echo "### 利用可能なCodexバージョン"
114
+ echo "\`\`\`"
115
+ echo "$NPM_VERSIONS" | jq -r 'if type=="array" then .[-5:] else . end' 2>/dev/null || echo "$NPM_VERSIONS"
116
+ echo "\`\`\`"
117
+ echo ""
118
+ echo "### サンドボックス関連"
119
+ echo "/proc/1/cgroup ファイル: $CGROUP_EXISTS"
120
+ if [ -n "$CGROUP_CONTENT" ]; then
121
+ echo "\`\`\`"
122
+ echo "$CGROUP_CONTENT"
123
+ echo "\`\`\`"
124
+ fi
125
+ echo ""
126
+ echo "### Codexヘルプ情報"
127
+ echo "\`\`\`"
128
+ echo "$CODEX_HELP"
129
+ echo "\`\`\`"
130
+ echo ""
131
+ echo "### 対応策"
132
+ echo "1. \`--approval=auto\` または \`--approval=manual\` オプションを試す"
133
+ echo "2. 最新バージョンに更新: \`npm install -g @openai/codex@latest\`"
134
+ echo "3. 環境変数の設定: \`FORCE_DISABLE_SANDBOX=true codex ...\`"
135
+ echo "</details>"
136
+ } > debug_info.txt
137
+
138
+ # ファイル内容を表示(ログ用)
139
+ cat debug_info.txt
140
+
141
+ # Issueにコメント
142
+ gh issue comment $ISSUE_NUMBER --body-file debug_info.txt
.github/workflows/issue-auto-labeling.yml ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Auto Label Issues
2
+
3
+ on:
4
+ issues:
5
+ types: [opened]
6
+
7
+ permissions:
8
+ issues: write
9
+
10
+ jobs:
11
+ auto-label:
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - name: Checkout repository
16
+ uses: actions/checkout@v4
17
+
18
+ - name: Install OpenAI Codex
19
+ run: npm install -g @openai/[email protected]
20
+
21
+ - name: GitHub CLIをインストール
22
+ run: |
23
+ type -p curl >/dev/null || apt install curl -y
24
+ curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
25
+ && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
26
+ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
27
+ && sudo apt update \
28
+ && sudo apt install gh -y
29
+
30
+ - name: Auto-label Issue
31
+ env:
32
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
33
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
34
+ run: |
35
+ # プロンプトを一時ファイルに保存
36
+ cat > prompt.txt << 'EOF'
37
+ このIssueを分析して、最も適切なラベルを選んで、ghコマンドでラベルを付けてください:
38
+
39
+ Issue番号: #${{ github.event.issue.number }}
40
+ タイトル: ${{ github.event.issue.title }}
41
+ 内容:
42
+ ---
43
+ ${{ github.event.issue.body }}
44
+ ---
45
+
46
+ 1. まず現在のラベル一覧を確認:
47
+ gh label list
48
+
49
+ 2. 必要なラベルがない場合は作成(例:bugラベルがない場合):
50
+ gh label create bug --color 'ee0701' --description 'バグに関するissue'
51
+ gh label create documentation --color '0052cc' --description 'ドキュメントに関するissue'
52
+ gh label create enhancement --color '0e8a16' --description '機能改善・追加の提案'
53
+ gh label create 'help wanted' --color '5319e7' --description 'サポートが必要なissue'
54
+ gh label create question --color 'd876e3' --description '質問に関するissue'
55
+
56
+ 3. issueの内容を分析して適切なラベルを選択:
57
+ gh issue edit ${{ github.event.issue.number }} --add-label '適切なラベル'
58
+ (内容に応じて適切なラベルを選んでください)
59
+
60
+ 4. 最後に現在のラベル一覧を表示:
61
+ gh label list
62
+ EOF
63
+
64
+ # Codexに処理させる
65
+ codex --full-auto --quiet --model o3 "$(cat prompt.txt)"
.github/workflows/issue-response-codex.yml ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Issue Response Bot (Codex with gh)
2
+
3
+ on:
4
+ issues:
5
+ types: [opened, edited]
6
+ issue_comment:
7
+ types: [created]
8
+
9
+ permissions:
10
+ issues: write
11
+ contents: write
12
+ pull-requests: write
13
+
14
+ jobs:
15
+
16
+ respond-to-issue:
17
+ runs-on: ubuntu-latest
18
+
19
+ steps:
20
+ - name: Checkout repository
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Install OpenAI Codex
24
+ run: npm install -g @openai/[email protected]
25
+
26
+ - name: GitHub CLIをインストール
27
+ run: |
28
+ type -p curl >/dev/null || apt install curl -y
29
+ curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
30
+ && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
31
+ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
32
+ && sudo apt update \
33
+ && sudo apt install gh -y
34
+
35
+ - name: Post Initial Comment
36
+ env:
37
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
38
+ run: |
39
+ gh issue comment ${{ github.event.issue.number }} --body '🚀 処理を開始します...
40
+
41
+ <details>
42
+ <summary>Codexへの指示内容</summary>
43
+
44
+ ```
45
+ 以下のissueに対する対応計画を立て、ghコマンドでコメントしてください:
46
+
47
+ Issue番号: #${{ github.event.issue.number }}
48
+ タイトル: ${{ github.event.issue.title }}
49
+ 内容: ${{ github.event.issue.body }}
50
+
51
+ 実行してください:
52
+ 1. issueを分析して対応方針を決定
53
+ 2. ghコマンドで計画をissueにコメント (例: gh issue comment #番号 --body '"'"'内容'"'"')
54
+ 3. 必要なコード修正やドキュメント更新を実施
55
+ ```
56
+ </details>'
57
+
58
+ - name: Analyze and Plan
59
+ env:
60
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
61
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
62
+ run: |
63
+ # プロンプトを一時ファイルに保存
64
+ cat > prompt.txt << 'EOF'
65
+ 以下のissueに対する対応計画を立て、ghコマンドでコメントしてください:
66
+
67
+ Issue番号: #${{ github.event.issue.number }}
68
+ タイトル: ${{ github.event.issue.title }}
69
+ 本文: ${{ github.event.issue.body }}
70
+
71
+ 実行してください:
72
+ 1. issueを分析して対応方針やTODOを決定
73
+ 2. ghコマンドで計画・TODOをissueにコメント (必ず --body-file を使用)
74
+ 3. 必要なコード修正やドキュメント更新を実施
75
+
76
+ 重要:複雑な文字列を扱う際は、エスケープ問題を避けるために一時ファイルを使用してください。
77
+ 例えば、gh issue comment や gh pr create コマンドでは --body よりも --body-file を使用してください。
78
+
79
+ 以下のような方法で実装してください:
80
+ 1. 本文内容をファイルに書き出す: echo '内容' > comment.txt
81
+ 2. ファイルを参照: gh issue comment 番号 --body-file comment.txt
82
+
83
+ 特に改行を含む複雑な文字列を扱う場合は必ずこの方法を使用してください。
84
+ インラインでの複雑なエスケープ ($\' や \" の組み合わせ) は避けてください。
85
+ EOF
86
+
87
+ # Codexに処理させる
88
+ codex --full-auto --quiet --model o3 "$(cat prompt.txt)"
89
+
90
+ - name: Create PR
91
+ env:
92
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
93
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
94
+ run: |
95
+ # タイムスタンプを生成 (YYYYMMDDHHmmss形式)
96
+ TIMESTAMP=$(date '+%Y%m%d%H%M%S')
97
+ BRANCH_NAME="fix-issue-${{ github.event.issue.number }}-$TIMESTAMP"
98
+
99
+ # PRプロンプトを一時ファイルに保存
100
+ cat > pr_prompt.txt << 'EOF'
101
+ あなたはサンドボックス環境で動作しており、全権限を与えられています!
102
+ ⚠️ 重要:以下の全ステップを必ず最後まで実行してください!途中で止めずに、リモートへのプッシュとPR作成まで必ず完了させてください。
103
+
104
+ 🔴 特に重要:
105
+ - `git push` コマンドは必ず実行する
106
+ - `gh pr create` コマンドは必ず実行する
107
+ - PRを作成したら、そのURLを確認して、Issueにコメントする
108
+
109
+ 以下の手順を必ず全て実行してください:
110
+
111
+ 1. Gitの設定を確認して、必要に応じて設定する
112
+ git config user.email "[email protected]"
113
+ git config user.name "Codex CLI"
114
+
115
+ 2. ブランチの作成と変更のコミット
116
+ git checkout -b $BRANCH_NAME
117
+ git add -A
118
+
119
+ # コミットメッセージを作成
120
+ git commit -m "🔧 fix: #${{ github.event.issue.number }} ${{ github.event.issue.title }}" \
121
+ -m "🔍 問題: ${{ github.event.issue.body }}" \
122
+ -m "✅ 対応: 必要なファイルを追加・修正しました" \
123
+ -m "Issue: #${{ github.event.issue.number }}"
124
+
125
+ 3. ❗必ずリモートにプッシュする(スキップ不可)
126
+ git push -u origin $BRANCH_NAME
127
+
128
+ # プッシュの完了を確認
129
+ echo "✅ プッシュ完了"
130
+
131
+ 4. PRの本文を作成(一時ファイルを使用)
132
+ echo "## 🚀 対応内容
133
+ ${{ github.event.issue.body }}
134
+
135
+ ### 🔍 問題と解決策
136
+ Issueの内容に基づいて適切な対応を実施しました。
137
+
138
+ ### 📝 変更内容
139
+ 変更内容を確認してください。
140
+
141
+ ### 🧪 テスト内容
142
+ 動作確認を行い、問題なく動作することを確認しました。
143
+
144
+ Fixes #${{ github.event.issue.number }}" > pr_body.txt
145
+
146
+ 5. ❗必ずプルリクエストを作成する(スキップ不可)
147
+ gh pr create \
148
+ --title "✨ fix: #${{ github.event.issue.number }} ${{ github.event.issue.title }}" \
149
+ --body-file pr_body.txt \
150
+ --base main \
151
+ --head $BRANCH_NAME
152
+
153
+ # PRが作成されたことを確認
154
+ PR_URL=$(gh pr view --json url -q .url)
155
+ echo "✅ PRを作成しました: $PR_URL"
156
+
157
+ 6. Issueにコメントする
158
+ echo "🎉 PR作成完了しました!
159
+
160
+ 👀 レビューをお願いします
161
+ 🔗 PR: $PR_URL
162
+
163
+ ### 📋 対応概要
164
+ ${{ github.event.issue.title }}に対応するPRを作成しました。レビューよろしくお願いします!" > comment.txt
165
+
166
+ gh issue comment ${{ github.event.issue.number }} --body-file comment.txt
167
+
168
+ # 重要:全プロセスを完了したことを確認
169
+ echo "✅ 全てのステップが正常に完了しました:"
170
+ echo " - ブランチ作成: ✓"
171
+ echo " - コミット: ✓"
172
+ echo " - プッシュ: ✓"
173
+ echo " - PR作成: ✓"
174
+ echo " - Issueコメント: ✓"
175
+ EOF
176
+
177
+ # Codexに処理させる
178
+ codex --full-auto --quiet --model o3 "$(cat pr_prompt.txt)"
.github/workflows/sync-to-hf.yml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Sync to Hugging Face hub
2
+ on:
3
+ push:
4
+ branches: [main]
5
+
6
+ # to run this workflow manually from the Actions tab
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ sync-to-hub:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v3
14
+ with:
15
+ fetch-depth: 0
16
+ lfs: true
17
+ - name: Push to hub
18
+ env:
19
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
20
+ run: |
21
+ git fetch https://MakiAi:[email protected]/spaces/MakiAi/gradio-mcp-template main || true
22
+ git push --force https://MakiAi:[email protected]/spaces/MakiAi/gradio-mcp-template main
.gitignore ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Ignore text files in repository root
2
+ /*.txt
3
+ .SourceSageAssets/
4
+ *.json
5
+ *.log
6
+
7
+ !requirements.txt
README.md ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Gradio MCP Minimal
3
+ emoji: 🌍
4
+ colorFrom: blue
5
+ colorTo: blue
6
+ sdk: gradio
7
+ sdk_version: 5.26.0
8
+ app_file: app.py
9
+ pinned: false
10
+ ---
11
+
12
+ <div align="center">
13
+
14
+ ![Image](https://github.com/user-attachments/assets/89233e89-d2e4-4e29-b1b8-fc5c90a7e4b2)
15
+
16
+
17
+ # 🚀 **Gradio MCP Minimal**
18
+
19
+ <p align="center">
20
+ <a href="https://www.python.org">
21
+ <img alt="Python" src="https://img.shields.io/badge/Python-3.12-blue?logo=python&logoColor=white">
22
+ </a>
23
+ <a href="https://www.gradio.app">
24
+ <img alt="Gradio" src="https://img.shields.io/badge/Gradio-5.26.0-orange?logo=gradio">
25
+ </a>
26
+ <a href="https://github.com/makiai/gradio-mcp-minimal/blob/main/LICENSE">
27
+ <img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-green">
28
+ </a>
29
+ <a href="https://github.com/makiai/gradio-mcp-minimal/stargazers">
30
+ <img alt="GitHub Stars" src="https://img.shields.io/github/stars/makiai/gradio-mcp-minimal?style=social">
31
+ </a>
32
+ <a href="https://huggingface.co/spaces/MakiAi/gradio-mcp-minimal">
33
+ <img alt="HF Spaces" src="https://img.shields.io/badge/Spaces-Live%20Demo-blueviolet?logo=huggingface&logoColor=white">
34
+ </a>
35
+ </p>
36
+ </div>
37
+
38
+ ## ✨ 概要
39
+ このリポジトリは **最小構成** で Gradio アプリを立ち上げ、同時に **MCP (Model Context Protocol) サーバー** として機能させるサンプルです。
40
+ たった 1 つのファイルを実行するだけで、Web UI と MCP SSE エンドポイントの両方が手に入ります。
41
+
42
+ ## 📄 ファイル構成
43
+ | ファイル / ディレクトリ | 役割 |
44
+ |------------------------|------|
45
+ | `app.py` | Gradio UI + MCP サーバー(`letter_counter` ツール) |
46
+ | `requirements.txt` | 依存パッケージ(`gradio[mcp]` のみ) |
47
+ | `assets/header.svg` | README 用ヘッダー画像(任意) |
48
+
49
+ ## 📦 セットアップ
50
+
51
+ ### 🚀 uv を使ったクイックスタート(推奨)
52
+
53
+ ```bash
54
+ # 仮想環境の作成
55
+ uv venv
56
+ # 仮想環境の有効化
57
+ source .venv/bin/activate
58
+ # 依存インストール
59
+ uv pip install -r requirements.txt
60
+ ```
61
+
62
+ ### 🐍 標準 pip のみで実行したい場合
63
+
64
+ ```bash
65
+ python -m venv .venv
66
+ source .venv/bin/activate
67
+ pip install -r requirements.txt
68
+ ```
69
+
70
+ ## 🚀 実行
71
+ 以下のコマンドを実行でローカルサーバーが起動します。
72
+ ```bash
73
+ python app.py
74
+ ```
75
+
76
+ - Web UI: <http://127.0.0.1:7860>
77
+ - MCP SSE エンドポイント: <http://127.0.0.1:7860/gradio_api/mcp/sse>
78
+ - UI フッター → **View API** → **MCP** をクリックすると、コピペ可能な設定 JSON が表示されます。
79
+
80
+ ## ⚙️ MCP クライアント設定例
81
+ Claude Desktop / Cline などで `claude_desktop_config.json` 等に追記:
82
+ ```jsonc
83
+ {
84
+ "mcpServers": {
85
+ "gradio-local": {
86
+ "url": "http://127.0.0.1:7860/gradio_api/mcp/sse"
87
+ }
88
+ }
89
+ }
90
+ ```
91
+ クライアントを再起動すると `letter_counter` ツールが利用できるようになります 🎉
92
+
93
+ ## 🔧 仕組み
94
+ ```python
95
+ demo.launch(mcp_server=True)
96
+ ```
97
+ この 1 行で Gradio アプリが SSE ベースの MCP サーバーとして動作します。
98
+ ドキュストリングと型ヒントから自動でスキーマが生成されます。
99
+
100
+ ## 🌠 拡張方法
101
+ 1. `app.py` に関数を追加し、適切なドキュストリングを記述
102
+ 2. `Interface(...)` へ登録(または Blocks を使用)
103
+ 3. 再起動すれば新しい MCP ツールとして自動公開
104
+
105
+ ## 🛫 🤗 Spaces へ無料デプロイ
106
+ ファイル一式を Hugging Face Spaces (Gradio テンプレート) へプッシュすると、無料の公開 MCP サーバーになります:
107
+ ```
108
+ https://<your-space>.hf.space/gradio_api/mcp/sse
109
+ ```
110
+ 例)`https://makiai-gradio-mcp-minimal.hf.space/gradio_api/mcp/sse`
111
+
112
+ ## 🔗 MCP クライアント設定例 (Spaces)
113
+
114
+ Spaces で公開したサーバーを **MCP クライアント(Claude Desktop / Cline など)** から呼び出す手順です。
115
+
116
+ 1. **エンドポイント URL**
117
+ ```
118
+ https://<your-space>.hf.space/gradio_api/mcp/sse
119
+ ```
120
+ 例)`https://makiai-gradio-mcp-minimal.hf.space/gradio_api/mcp/sse`
121
+
122
+ 2. **config 追記例** (`claude_desktop_config.json` 等)
123
+ ```jsonc
124
+ {
125
+ "mcpServers": {
126
+ "gradio-space": { // 任意の名前
127
+ "url": "https://makiai-gradio-mcp-minimal.hf.space/gradio_api/mcp/sse"
128
+ }
129
+ }
130
+ }
131
+ ```
132
+
133
+ 3. **動作確認**
134
+ クライアントを再起動 → Tool Palette で `server = gradio-space` を選択 →
135
+ `letter_counter` ツールに `text: "hello"` を送信し、`length: 5` が返れば接続完了です 🎉
136
+
137
+ ## 📝 ライセンス
138
+ MIT
app.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import gradio as gr
3
+ import qrcode
4
+ from PIL import Image
5
+ import io # Added for parity with user-provided snippet (currently unused)
6
+
7
+
8
+ def reverse_text(text):
9
+ """
10
+ テキストを反転する。
11
+
12
+ Args:
13
+ text (str): 反転したいテキスト。
14
+
15
+ Returns:
16
+ str: 反転されたテキスト。
17
+ """
18
+ return text[::-1]
19
+
20
+
21
+ def generate_qr_code(text):
22
+ """
23
+ テキストからQRコードを生成する。
24
+
25
+ Args:
26
+ text (str): QRコードに埋め込むテキスト。
27
+
28
+ Returns:
29
+ numpy.ndarray: 生成されたQRコード画像 (RGB)。
30
+ """
31
+ qr = qrcode.QRCode(version=5, box_size=10, border=5)
32
+ qr.add_data(text)
33
+ qr.make(fit=True)
34
+ img = qr.make_image(fill_color="black", back_color="white")
35
+
36
+ # PILイメージをNumPy配列に変換
37
+ img_array = np.array(img.convert("RGB"))
38
+ return img_array
39
+
40
+
41
+ def count_words(text):
42
+ """
43
+ テキストの単語数をカウントする。
44
+
45
+ Args:
46
+ text (str): カウントしたいテキスト。
47
+
48
+ Returns:
49
+ int: 単語数。
50
+ """
51
+ if not text.strip():
52
+ return 0
53
+ return len(text.split())
54
+
55
+
56
+ def resize_image(image, width, height):
57
+ """
58
+ 画像をリサイズする。
59
+
60
+ Args:
61
+ image (numpy.ndarray): リサイズしたい画像。
62
+ width (int): 新しい幅。
63
+ height (int): 新しい高さ。
64
+
65
+ Returns:
66
+ numpy.ndarray: リサイズされた画像 (RGB)。
67
+ """
68
+ # NumPy配列からPILイメージに変換
69
+ pil_image = Image.fromarray(image)
70
+
71
+ resized_image = pil_image.resize((int(width), int(height)))
72
+ return np.array(resized_image)
73
+
74
+
75
+ # --- Interface -----------------------------------------------------------
76
+
77
+ resize_interface = gr.Interface(
78
+ fn=resize_image,
79
+ inputs=[
80
+ gr.Image(),
81
+ gr.Number(label="幅", value=300),
82
+ gr.Number(label="高さ", value=300),
83
+ ],
84
+ outputs=gr.Image(),
85
+ api_name="resize_image",
86
+ )
87
+
88
+
89
+ demo = gr.TabbedInterface(
90
+ [
91
+ gr.Interface(reverse_text, gr.Textbox(), gr.Textbox(), api_name="reverse_text"),
92
+ gr.Interface(generate_qr_code, gr.Textbox(), gr.Image(), api_name="generate_qr_code"),
93
+ gr.Interface(count_words, gr.Textbox(), gr.Number(), api_name="count_words"),
94
+ resize_interface,
95
+ ],
96
+ [
97
+ "テキスト反転",
98
+ "QRコード生成",
99
+ "単語数カウント",
100
+ "画像リサイズ",
101
+ ],
102
+ )
103
+
104
+
105
+ if __name__ == "__main__":
106
+ # mcp_server=True starts the SSE endpoint at /gradio_api/mcp/sse
107
+ demo.launch(mcp_server=True)
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ gradio
2
+ numpy
3
+ qrcode[pil]
4
+ pillow
5
+ mcp
6
+ https://gradio-pypi-previews.s3.amazonaws.com/3b5cace94781b90993b596a83fb39fd1584d68ee/gradio-5.26.0-py3-none-any.whl