Maki
commited on
Commit
·
1fe9b6d
unverified
·
0
Parent(s):
Initial commit
Browse files- .SourceSageignore +54 -0
- .env.example +12 -0
- .github/beta-workflows/beta-code-review-codex.yml +81 -0
- .github/beta-workflows/beta-document-quality-check.yml +179 -0
- .github/beta-workflows/beta-readme-translation-codex.yml +79 -0
- .github/workflows/auto-release-notes.yml +131 -0
- .github/workflows/debug-info-codex.yml +142 -0
- .github/workflows/issue-auto-labeling.yml +65 -0
- .github/workflows/issue-response-codex.yml +178 -0
- .github/workflows/sync-to-hf.yml +22 -0
- .gitignore +7 -0
- README.md +138 -0
- app.py +107 -0
- requirements.txt +6 -0
.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 |
+

|
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
|