Maki commited on
Commit
ca2480e
·
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/issue-response-codex.yml ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ respond-to-issue:
16
+ runs-on: ubuntu-latest
17
+
18
+ steps:
19
+ - name: Checkout repository
20
+ uses: actions/checkout@v4
21
+
22
+ - name: Install OpenAI Codex
23
+ run: npm install -g @openai/codex@0.1.2504251709
24
+
25
+ - name: GitHub CLIをインストール
26
+ run: |
27
+ type -p curl >/dev/null || apt install curl -y
28
+ curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
29
+ && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
30
+ && 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 \
31
+ && sudo apt update \
32
+ && sudo apt install gh -y
33
+
34
+ - name: Post Initial Comment
35
+ env:
36
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
37
+ run: |
38
+ # 処理開始メッセージと折りたたみセクションでコード表示
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: Debug Information
59
+ env:
60
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
61
+ run: |
62
+ # コマンドを実行して結果を取得
63
+ echo "Codexの詳細情報を取得中..."
64
+
65
+ # 情報収集
66
+ SYSTEM_INFO=$(uname -a)
67
+ OS_INFO=$(cat /etc/os-release 2>/dev/null || lsb_release -a 2>/dev/null)
68
+ NODE_VERSION=$(node -v)
69
+ NPM_VERSION=$(npm -v)
70
+ CODEX_VERSION=$(codex --version 2>/dev/null || echo 'バージョン取得失敗')
71
+ CODEX_PATH=$(which codex 2>/dev/null || echo '場所不明')
72
+ CODEX_PACKAGE_INFO=$(npm list -g @openai/codex 2>/dev/null || echo '情報取得失敗')
73
+ NPM_VERSIONS=$(npm view @openai/codex versions --json 2>/dev/null || echo '[]')
74
+
75
+ # cgroup確認
76
+ if [ -f /proc/1/cgroup ]; then
77
+ CGROUP_EXISTS="✅ 存在します"
78
+ CGROUP_CONTENT=$(head -n 5 /proc/1/cgroup)
79
+ else
80
+ CGROUP_EXISTS="❌ 存在しません"
81
+ CGROUP_CONTENT=""
82
+ fi
83
+
84
+ # codexコマンドのヘルプ情報
85
+ CODEX_HELP=$(codex --help 2>&1 | head -n 20)
86
+
87
+ # 結果をファイルに保存
88
+ echo "環境情報をissueにコメントします"
89
+ {
90
+ echo "## 🔍 デバッグ情報"
91
+ echo "<details>"
92
+ echo "<summary>詳細情報(クリックして展開)</summary>"
93
+ echo ""
94
+ echo "サンドボックスエラー「Sandbox was mandated, but no sandbox is available!」のデバッグ情報:"
95
+ echo ""
96
+ echo "### システム環境"
97
+ echo "\`\`\`"
98
+ echo "$SYSTEM_INFO"
99
+ echo "$OS_INFO"
100
+ echo "\`\`\`"
101
+ echo ""
102
+ echo "### Node.js & npm 情報"
103
+ echo "\`\`\`"
104
+ echo "Node.js: $NODE_VERSION"
105
+ echo "npm: $NPM_VERSION"
106
+ echo "\`\`\`"
107
+ echo ""
108
+ echo "### Codex情報"
109
+ echo "\`\`\`"
110
+ echo "Version: $CODEX_VERSION"
111
+ echo "Path: $CODEX_PATH"
112
+ echo "Package info: "
113
+ echo "$CODEX_PACKAGE_INFO"
114
+ echo "\`\`\`"
115
+ echo ""
116
+ echo "### 利用可能なCodexバージョン"
117
+ echo "\`\`\`"
118
+ echo "$NPM_VERSIONS" | jq -r 'if type=="array" then .[-5:] else . end' 2>/dev/null || echo "$NPM_VERSIONS"
119
+ echo "\`\`\`"
120
+ echo ""
121
+ echo "### サンドボックス関連"
122
+ echo "/proc/1/cgroup ファイル: $CGROUP_EXISTS"
123
+ if [ -n "$CGROUP_CONTENT" ]; then
124
+ echo "\`\`\`"
125
+ echo "$CGROUP_CONTENT"
126
+ echo "\`\`\`"
127
+ fi
128
+ echo ""
129
+ echo "### Codexヘルプ情報"
130
+ echo "\`\`\`"
131
+ echo "$CODEX_HELP"
132
+ echo "\`\`\`"
133
+ echo ""
134
+ echo "### 対応策"
135
+ echo "1. \`--approval=auto\` または \`--approval=manual\` オプションを試す"
136
+ echo "2. 最新バージョンに更新: \`npm install -g @openai/codex@latest\`"
137
+ echo "3. 環境変数の設定: \`FORCE_DISABLE_SANDBOX=true codex ...\`"
138
+ echo "</details>"
139
+ } > debug_info.txt
140
+
141
+ # ファイル内容を表示(ログ用)
142
+ cat debug_info.txt
143
+
144
+ # Issueにコメント
145
+ gh issue comment ${{ github.event.issue.number }} --body-file debug_info.txt
146
+
147
+
148
+ - name: Analyze and Plan
149
+ env:
150
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
151
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
152
+ run: |
153
+ # Codexに計画を立てさせ、issueにコメントさせる
154
+ codex --full-auto --quiet "以下のissueに対する対応計画を立て、ghコマンドでコメントしてください:
155
+
156
+ Issue番号: #${{ github.event.issue.number }}
157
+ タイトル: ${{ github.event.issue.title }}
158
+ 内容: ${{ github.event.issue.body }}
159
+
160
+ 実行してください:
161
+ 1. issueを分析して対応方針を決定
162
+ 2. ghコマンドで計画をissueにコメント (例: gh issue comment #番号 --body '内容')
163
+ 3. 必要なコード修正やドキュメント更新を実施
164
+
165
+ # 重要:複雑な文字列を扱う際は、エスケープ問題を避けるために一時ファイルを使用してください。
166
+ # 例えば、gh issue comment や gh pr create コマンドでは --body よりも --body-file を使用してください。
167
+ #
168
+ # 以下のような方法で実装してください:
169
+ # 1. 本文内容をファイルに書き出す: echo '内容' > comment.txt
170
+ # 2. ファイルを参照: gh issue comment 番号 --body-file comment.txt
171
+ #
172
+ # 特に改行を含む複雑な文字列を扱う場合は必ずこの方法を使用してください。
173
+ # インラインでの複雑なエスケープ ($\' や \" の組み合わせ) は避けてください。"
174
+
175
+ - name: Create PR
176
+ env:
177
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
178
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
179
+ run: |
180
+ # タイムスタンプを生成 (YYYYMMDDHHmmss形式)
181
+ TIMESTAMP=$(date '+%Y%m%d%H%M%S')
182
+ BRANCH_NAME="fix-issue-${{ github.event.issue.number }}-$TIMESTAMP"
183
+
184
+ # 現在の状態を確認
185
+ git status
186
+
187
+ # 新しいブランチを作成
188
+ git checkout -b $BRANCH_NAME
189
+
190
+ # ブランチ切り替え後の状態を確認
191
+ git status
192
+
193
+ # Codexが作成したファイル変更を全て追加
194
+ git add .
195
+
196
+ # ステージング後の状態を確認
197
+ git status
198
+
199
+ # Codexにプルリクエストを作成させる
200
+ codex --full-auto --quiet $'以下の手順でプルリクエストを作成してください:
201
+
202
+ # 変更されたファイルをチェック
203
+ git status
204
+
205
+ # 適切なコミットメッセージで変更をコミット
206
+ # Issue番号とタイトルを参照し、変更の種類に応じて内容を調整してください
207
+ git commit -m "🔧 fix: #${{ github.event.issue.number }} ${{ github.event.issue.title }}" -m "🔍 問題: ${{ github.event.issue.body }}" -m "✅ 対応: 必要なファイルを追加・修正しました" -m "Issue: #${{ github.event.issue.number }}"
208
+
209
+ # ブランチをリモートにプッシュ
210
+ git push origin HEAD:$BRANCH_NAME
211
+
212
+ # 重要:PRやIssueコメントの作成時は、複雑な文字列処理を避けるために一時ファイルを使用してください
213
+ # PRの本文を一時ファイルに書き出す
214
+ echo "## 🚀 対応内容
215
+ ${{ github.event.issue.body }}
216
+
217
+ ### 🔍 問題と解決策
218
+ Issueの内容に基づいて適切な対応を実施しました。
219
+
220
+ ### 📝 変更内容
221
+ - 変更したファイルとその内容の説明
222
+
223
+ ### 🧪 テスト内容
224
+ - 動作確認方法と結果
225
+
226
+ Fixes #${{ github.event.issue.number }}" > pr_body.txt
227
+
228
+ # PRを作成 - 一時ファイルを参照
229
+ gh pr create \
230
+ --title "✨ fix: #${{ github.event.issue.number }} ${{ github.event.issue.title }}" \
231
+ --body-file pr_body.txt \
232
+ --base main \
233
+ --head $BRANCH_NAME
234
+
235
+ # PRのURLを取得
236
+ PR_URL=$(gh pr view --json url -q .url)
237
+
238
+ # Issueコメントの内容を一時ファイルに書き出す
239
+ echo "🎉 PR作成完了しました!
240
+
241
+ 👀 レビューをお願いします
242
+ 🔗 PR: $PR_URL
243
+
244
+ ### 📋 対応概要
245
+ ${{ github.event.issue.title }}に対応するPRを作成しました。レビューよろしくお願いします!" > comment.txt
246
+
247
+ # Issueにコメント - 一時ファイルを参照
248
+ gh issue comment ${{ github.event.issue.number }} --body-file comment.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:$HF_TOKEN@huggingface.co/spaces/MakiAi/gradio-mcp-minimal main || true
22
+ git push --force https://MakiAi:$HF_TOKEN@huggingface.co/spaces/MakiAi/gradio-mcp-minimal 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/a48bdf11-baf1-4e6d-8f4f-10bc33a68551)
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,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+
4
+ def letter_counter(text: str, letter: str) -> int:
5
+ """
6
+ Count the number of occurrences of a letter in a given text.
7
+
8
+ Args:
9
+ text (str): Text to search through.
10
+ letter (str): Letter to count.
11
+
12
+ Returns:
13
+ int: How many times `letter` appears in `text`.
14
+ """
15
+ return text.lower().count(letter.lower())
16
+
17
+ # --- Components -----------------------------------------------------------
18
+ # 明示的に label を指定して API 名を関数引数と一致させることで、
19
+ # MCP 経由の JSON キー不一致("text_1" 問題)を解消するよ ✨
20
+ text_input = gr.Textbox(
21
+ label="text",
22
+ placeholder="Enter text here"
23
+ )
24
+ letter_input = gr.Textbox(
25
+ label="letter",
26
+ placeholder="Enter a single letter",
27
+ max_lines=1
28
+ )
29
+ count_output = gr.Number(label="count")
30
+
31
+ # --- Interface ------------------------------------------------------------
32
+ demo = gr.Interface(
33
+ fn=letter_counter,
34
+ inputs=[text_input, letter_input],
35
+ outputs=count_output,
36
+ title="Letter Counter (MCP demo)",
37
+ description="Enter text & a letter – count occurrences. Launches with MCP automatically.",
38
+ api_name="letter_counter"
39
+ )
40
+
41
+ if __name__ == "__main__":
42
+ # mcp_server=True starts the SSE endpoint at /gradio_api/mcp/sse
43
+ # server_name="0.0.0.0" で全ネットワークインターフェースにバインドし、別PCからアクセス可能にするよ!
44
+ # PORT 環境変数があればそれを使い、無ければデフォルト 7860✨
45
+ demo.launch(
46
+ mcp_server=True,
47
+ server_name="0.0.0.0",
48
+ server_port=int(os.getenv("PORT", 7860)),
49
+ )
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ mcp
2
+ https://gradio-pypi-previews.s3.amazonaws.com/3b5cace94781b90993b596a83fb39fd1584d68ee/gradio-5.26.0-py3-none-any.whl