soba-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.claude/commands/osoba/add-backlog.md +173 -0
- data/.claude/commands/osoba/implement.md +151 -0
- data/.claude/commands/osoba/plan.md +217 -0
- data/.claude/commands/osoba/review.md +133 -0
- data/.claude/commands/osoba/revise.md +176 -0
- data/.claude/commands/soba/implement.md +88 -0
- data/.claude/commands/soba/plan.md +93 -0
- data/.claude/commands/soba/review.md +91 -0
- data/.claude/commands/soba/revise.md +76 -0
- data/.devcontainer/.env +2 -0
- data/.devcontainer/Dockerfile +3 -0
- data/.devcontainer/LICENSE +21 -0
- data/.devcontainer/README.md +85 -0
- data/.devcontainer/bin/devcontainer-common.sh +50 -0
- data/.devcontainer/bin/down +35 -0
- data/.devcontainer/bin/rebuild +10 -0
- data/.devcontainer/bin/up +11 -0
- data/.devcontainer/compose.yaml +28 -0
- data/.devcontainer/devcontainer.json +53 -0
- data/.devcontainer/post-attach.sh +29 -0
- data/.devcontainer/post-create.sh +62 -0
- data/.devcontainer/setup/01-os-package.sh +19 -0
- data/.devcontainer/setup/02-npm-package.sh +22 -0
- data/.devcontainer/setup/03-mcp-server.sh +33 -0
- data/.devcontainer/setup/04-tool.sh +17 -0
- data/.devcontainer/setup/05-soba-setup.sh +66 -0
- data/.devcontainer/setup/scripts/functions/install_apt.sh +77 -0
- data/.devcontainer/setup/scripts/functions/install_npm.sh +71 -0
- data/.devcontainer/setup/scripts/functions/mcp_config.sh +14 -0
- data/.devcontainer/setup/scripts/functions/print_message.sh +59 -0
- data/.devcontainer/setup/scripts/setup/mcp-markdownify.sh +39 -0
- data/.devcontainer/sync-envs.sh +58 -0
- data/.envrc.sample +7 -0
- data/.rspec +4 -0
- data/.rubocop.yml +70 -0
- data/.rubocop_airbnb.yml +2 -0
- data/.rubocop_todo.yml +74 -0
- data/.tool-versions +1 -0
- data/CLAUDE.md +20 -0
- data/LICENSE +21 -0
- data/README.md +384 -0
- data/README_ja.md +384 -0
- data/Rakefile +18 -0
- data/bin/soba +120 -0
- data/config/config.yml.example +36 -0
- data/docs/business/INDEX.md +6 -0
- data/docs/business/overview.md +42 -0
- data/docs/business/workflow.md +143 -0
- data/docs/development/INDEX.md +10 -0
- data/docs/development/architecture.md +69 -0
- data/docs/development/coding-standards.md +152 -0
- data/docs/development/distribution.md +26 -0
- data/docs/development/implementation-guide.md +103 -0
- data/docs/development/testing-strategy.md +128 -0
- data/docs/development/tmux-management.md +253 -0
- data/docs/document_system.md +58 -0
- data/lib/soba/commands/config/show.rb +63 -0
- data/lib/soba/commands/init.rb +778 -0
- data/lib/soba/commands/open.rb +144 -0
- data/lib/soba/commands/start.rb +442 -0
- data/lib/soba/commands/status.rb +175 -0
- data/lib/soba/commands/stop.rb +147 -0
- data/lib/soba/config_loader.rb +32 -0
- data/lib/soba/configuration.rb +268 -0
- data/lib/soba/container.rb +48 -0
- data/lib/soba/domain/issue.rb +38 -0
- data/lib/soba/domain/phase_strategy.rb +74 -0
- data/lib/soba/infrastructure/errors.rb +23 -0
- data/lib/soba/infrastructure/github_client.rb +399 -0
- data/lib/soba/infrastructure/lock_manager.rb +129 -0
- data/lib/soba/infrastructure/tmux_client.rb +331 -0
- data/lib/soba/services/ansi_processor.rb +92 -0
- data/lib/soba/services/auto_merge_service.rb +133 -0
- data/lib/soba/services/closed_issue_window_cleaner.rb +96 -0
- data/lib/soba/services/daemon_service.rb +83 -0
- data/lib/soba/services/git_workspace_manager.rb +102 -0
- data/lib/soba/services/issue_monitor.rb +29 -0
- data/lib/soba/services/issue_processor.rb +215 -0
- data/lib/soba/services/issue_watcher.rb +193 -0
- data/lib/soba/services/pid_manager.rb +87 -0
- data/lib/soba/services/process_info.rb +58 -0
- data/lib/soba/services/queueing_service.rb +98 -0
- data/lib/soba/services/session_logger.rb +111 -0
- data/lib/soba/services/session_resolver.rb +72 -0
- data/lib/soba/services/slack_notifier.rb +121 -0
- data/lib/soba/services/status_manager.rb +74 -0
- data/lib/soba/services/test_process_manager.rb +84 -0
- data/lib/soba/services/tmux_session_manager.rb +251 -0
- data/lib/soba/services/workflow_blocking_checker.rb +73 -0
- data/lib/soba/services/workflow_executor.rb +256 -0
- data/lib/soba/services/workflow_integrity_checker.rb +151 -0
- data/lib/soba/templates/claude_commands/implement.md +88 -0
- data/lib/soba/templates/claude_commands/plan.md +93 -0
- data/lib/soba/templates/claude_commands/review.md +91 -0
- data/lib/soba/templates/claude_commands/revise.md +76 -0
- data/lib/soba/version.rb +5 -0
- data/lib/soba.rb +44 -0
- data/lib/tasks/gem.rake +75 -0
- data/soba-cli.gemspec +59 -0
- metadata +430 -0
data/README_ja.md
ADDED
@@ -0,0 +1,384 @@
|
|
1
|
+
# soba CLI
|
2
|
+
|
3
|
+
[](https://github.com/douhashi/soba-cli/releases)
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
5
|
+
[](https://www.ruby-lang.org/)
|
6
|
+
|
7
|
+
[English version](README.md)
|
8
|
+
|
9
|
+
GitHub IssueとClaude Codeを連携させる自律的ワークフロー実行CLIツール。AI駆動の開発サイクルを実現します。
|
10
|
+
|
11
|
+
## 概要
|
12
|
+
|
13
|
+
soba CLIは、Issueの作成からプルリクエストのマージまで、開発ワークフロー全体を自動化します。GitHub Issueを監視し、Claude Code AIの支援により計画、実装、レビュー、マージの各フェーズを自動的に処理します。
|
14
|
+
|
15
|
+
## 主な機能
|
16
|
+
|
17
|
+
- 🤖 **自律ワークフロー**: Issue作成からマージまで完全自動化
|
18
|
+
- 🏷️ **ラベル駆動の状態管理**: GitHubラベルによる進捗追跡
|
19
|
+
- 🔄 **継続的処理**: 自動ポーリングとフェーズ遷移
|
20
|
+
- 🎯 **優先順位管理**: Issue番号による順次処理
|
21
|
+
- 🪟 **Tmux統合**: AIプロセスの可視化監視
|
22
|
+
- 🔀 **Git Worktreeサポート**: 独立したブランチ管理
|
23
|
+
- 🚀 **自動マージ**: 承認後の自動PRマージ
|
24
|
+
|
25
|
+
## ワークフロー
|
26
|
+
|
27
|
+
```mermaid
|
28
|
+
graph TD
|
29
|
+
A[複数のsoba:todo] -->|soba: 優先度判定| B[1つをsoba:queued]
|
30
|
+
B -->|soba: 即座に| C[soba:planning]
|
31
|
+
C -->|Claude: 計画策定| D[soba:ready]
|
32
|
+
D -->|soba: 自動検出| E[soba:doing]
|
33
|
+
E -->|Claude: 実装・PR作成| F[soba:review-requested]
|
34
|
+
F -->|soba: 自動検出| G[soba:reviewing]
|
35
|
+
G -->|Claude: レビュー承認| H[soba:done + PR:soba:lgtm]
|
36
|
+
G -->|Claude: 修正要求| I[soba:requires-changes]
|
37
|
+
I -->|soba: 自動検出| K[soba:revising]
|
38
|
+
K -->|Claude: 修正対応| F
|
39
|
+
H -->|soba: 自動マージ| J[soba:merged]
|
40
|
+
J -->|次のキューイング| A
|
41
|
+
```
|
42
|
+
|
43
|
+
## インストール
|
44
|
+
|
45
|
+
### Ruby Gemとして
|
46
|
+
|
47
|
+
```bash
|
48
|
+
gem install soba-cli
|
49
|
+
```
|
50
|
+
|
51
|
+
### ソースから
|
52
|
+
|
53
|
+
```bash
|
54
|
+
# リポジトリのクローン
|
55
|
+
git clone https://github.com/douhashi/soba-cli.git
|
56
|
+
cd soba-cli
|
57
|
+
|
58
|
+
# 依存関係のインストール
|
59
|
+
bundle install
|
60
|
+
|
61
|
+
# ソースから実行
|
62
|
+
bin/soba --help
|
63
|
+
```
|
64
|
+
|
65
|
+
## クイックスタート
|
66
|
+
|
67
|
+
### ⚠ 重要な注意 ⚠
|
68
|
+
|
69
|
+
soba はAIによる自律的な開発を支援するため、デフォルトの設定で `--dangerously-skip-permissions` を使用します。(設定ファイルで無効化することができます)
|
70
|
+
|
71
|
+
デフォルト設定で利用する場合、devcontainerの利用や外部アクセスの制限など、可能な限りの保全作業を行ったうえで使用してください。
|
72
|
+
|
73
|
+
---
|
74
|
+
|
75
|
+
1. **設定の初期化**
|
76
|
+
```bash
|
77
|
+
soba init
|
78
|
+
```
|
79
|
+
|
80
|
+
2. **設定ファイルの編集**
|
81
|
+
`.soba/config.yml`を編集:
|
82
|
+
```yaml
|
83
|
+
github:
|
84
|
+
token: ${GITHUB_TOKEN}
|
85
|
+
repository: owner/repo
|
86
|
+
```
|
87
|
+
|
88
|
+
3. **自動化の開始**
|
89
|
+
```bash
|
90
|
+
soba start
|
91
|
+
```
|
92
|
+
|
93
|
+
4. **ラベル付きIssueの作成**
|
94
|
+
GitHub Issueに`soba:todo`ラベルを付けて自動処理を開始。
|
95
|
+
|
96
|
+
## 設定
|
97
|
+
|
98
|
+
設定ファイルの場所: `.soba/config.yml`(プロジェクトルート)
|
99
|
+
|
100
|
+
### 完全な設定例
|
101
|
+
|
102
|
+
```yaml
|
103
|
+
# GitHub設定
|
104
|
+
github:
|
105
|
+
# Personal Access Token(環境変数可)
|
106
|
+
token: ${GITHUB_TOKEN}
|
107
|
+
# ターゲットリポジトリ(形式: owner/repo)
|
108
|
+
repository: douhashi/soba-cli
|
109
|
+
|
110
|
+
# ワークフロー設定
|
111
|
+
workflow:
|
112
|
+
# Issueポーリング間隔(秒)(デフォルト: 20)
|
113
|
+
interval: 20
|
114
|
+
# Claude実行にtmuxを使用(デフォルト: true)
|
115
|
+
use_tmux: true
|
116
|
+
# 自動PRマージ有効化(デフォルト: true)
|
117
|
+
auto_merge_enabled: true
|
118
|
+
# クローズ済みIssueのtmuxウィンドウクリーンアップ(デフォルト: true)
|
119
|
+
closed_issue_cleanup_enabled: true
|
120
|
+
# クリーンアップ間隔(秒)(デフォルト: 300)
|
121
|
+
closed_issue_cleanup_interval: 300
|
122
|
+
# tmuxペインへのコマンド遅延(秒)(デフォルト: 3)
|
123
|
+
tmux_command_delay: 3
|
124
|
+
|
125
|
+
# Slack通知設定
|
126
|
+
slack:
|
127
|
+
# Slack通知用のWebhook URL
|
128
|
+
# Webhook URLの取得方法: https://api.slack.com/messaging/webhooks
|
129
|
+
webhook_url: ${SLACK_WEBHOOK_URL}
|
130
|
+
# フェーズ開始時の通知を有効化(デフォルト: false)
|
131
|
+
notifications_enabled: false
|
132
|
+
|
133
|
+
# Git設定
|
134
|
+
git:
|
135
|
+
# git worktreeのベースパス
|
136
|
+
worktree_base_path: .git/soba/worktrees
|
137
|
+
# フェーズ開始時の自動ワークスペース設定(デフォルト: true)
|
138
|
+
setup_workspace: true
|
139
|
+
|
140
|
+
# フェーズコマンド(オプション - カスタムClaudeコマンド用)
|
141
|
+
phase:
|
142
|
+
plan:
|
143
|
+
command: claude
|
144
|
+
options:
|
145
|
+
- --dangerously-skip-permissions
|
146
|
+
parameter: '/soba:plan {{issue-number}}'
|
147
|
+
implement:
|
148
|
+
command: claude
|
149
|
+
options:
|
150
|
+
- --dangerously-skip-permissions
|
151
|
+
parameter: '/soba:implement {{issue-number}}'
|
152
|
+
review:
|
153
|
+
command: claude
|
154
|
+
options:
|
155
|
+
- --dangerously-skip-permissions
|
156
|
+
parameter: '/soba:review {{issue-number}}'
|
157
|
+
revise:
|
158
|
+
command: claude
|
159
|
+
options:
|
160
|
+
- --dangerously-skip-permissions
|
161
|
+
parameter: '/soba:revise {{issue-number}}'
|
162
|
+
```
|
163
|
+
|
164
|
+
### 環境変数
|
165
|
+
|
166
|
+
| 変数名 | 説明 | 必須 |
|
167
|
+
|--------|------|------|
|
168
|
+
| `GITHUB_TOKEN` | repo/read:org/write:discussion スコープを持つGitHub Personal Access Token | はい |
|
169
|
+
| `SLACK_WEBHOOK_URL` | SlackのWebhookURL | いいえ |
|
170
|
+
|
171
|
+
### Claudeコマンドテンプレート
|
172
|
+
|
173
|
+
Sobaは初期化時に自動的にClaudeコマンドテンプレートを `.claude/commands/soba/` に展開します。これらのテンプレートは各フェーズのワークフロー自動化コマンドを定義します:
|
174
|
+
|
175
|
+
|
176
|
+
- **plan.md** - Issue計画フェーズテンプレート
|
177
|
+
- **implement.md** - 実装フェーズテンプレート
|
178
|
+
- **review.md** - PRレビューフェーズテンプレート
|
179
|
+
- **revise.md** - 修正フェーズテンプレート
|
180
|
+
|
181
|
+
これらのテンプレートはgemパッケージに含まれており、以下で確認できます:
|
182
|
+
[lib/soba/templates/claude_commands/](lib/soba/templates/claude_commands/)
|
183
|
+
|
184
|
+
## コマンド
|
185
|
+
|
186
|
+
### `soba init`
|
187
|
+
現在のプロジェクトでsoba設定を初期化。
|
188
|
+
|
189
|
+
```bash
|
190
|
+
# 基本的な初期化
|
191
|
+
soba init
|
192
|
+
|
193
|
+
# インタラクティブモード
|
194
|
+
soba init --interactive
|
195
|
+
```
|
196
|
+
|
197
|
+
### `soba start`
|
198
|
+
ワークフロー自動化デーモンを開始。
|
199
|
+
|
200
|
+
```bash
|
201
|
+
# デーモンモード(バックグラウンド)で開始
|
202
|
+
soba start
|
203
|
+
|
204
|
+
# デーモンモードで開始
|
205
|
+
soba start --daemon
|
206
|
+
|
207
|
+
# 特定のIssueを指定して開始
|
208
|
+
soba start 123
|
209
|
+
|
210
|
+
# tmuxなしで開始
|
211
|
+
soba start --no-tmux
|
212
|
+
```
|
213
|
+
|
214
|
+
### `soba status`
|
215
|
+
デーモンのステータスと最近のログを表示。
|
216
|
+
|
217
|
+
```bash
|
218
|
+
# 基本ステータス
|
219
|
+
soba status
|
220
|
+
|
221
|
+
# より多くのログ行を表示
|
222
|
+
soba status --log 50
|
223
|
+
|
224
|
+
# JSON形式で出力
|
225
|
+
soba status --json
|
226
|
+
```
|
227
|
+
|
228
|
+
### `soba stop`
|
229
|
+
実行中のデーモンを停止。
|
230
|
+
|
231
|
+
```bash
|
232
|
+
# 正常停止
|
233
|
+
soba stop
|
234
|
+
|
235
|
+
# 即座に強制停止
|
236
|
+
soba stop --force
|
237
|
+
|
238
|
+
# カスタムタイムアウト
|
239
|
+
soba stop --timeout 60
|
240
|
+
```
|
241
|
+
|
242
|
+
### `soba open`
|
243
|
+
タスクのtmuxセッションを開くまたは一覧表示。
|
244
|
+
|
245
|
+
```bash
|
246
|
+
# tmuxセッションを開く
|
247
|
+
soba open
|
248
|
+
|
249
|
+
# すべてのアクティブなセッションを一覧表示
|
250
|
+
soba open --list
|
251
|
+
```
|
252
|
+
|
253
|
+
### `soba config`
|
254
|
+
現在の設定を表示。
|
255
|
+
|
256
|
+
```bash
|
257
|
+
# 設定を表示
|
258
|
+
soba config
|
259
|
+
|
260
|
+
# 特定の設定ファイルを使用
|
261
|
+
soba --config /path/to/config.yml config
|
262
|
+
```
|
263
|
+
|
264
|
+
## ラベルシステム
|
265
|
+
|
266
|
+
### Issueラベル(状態管理)
|
267
|
+
|
268
|
+
| ラベル | 状態 | 説明 |
|
269
|
+
|--------|------|------|
|
270
|
+
| `soba:todo` | 待機 | 新規Issue、処理待ち |
|
271
|
+
| `soba:queued` | キュー選択 | 処理対象として選択済み |
|
272
|
+
| `soba:planning` | 計画中 | Claudeが実装計画を策定中 |
|
273
|
+
| `soba:ready` | 準備完了 | 計画完了、実装待ち |
|
274
|
+
| `soba:doing` | 実装中 | Claudeが実装作業中 |
|
275
|
+
| `soba:review-requested` | レビュー待ち | PR作成済み、レビュー待ち |
|
276
|
+
| `soba:reviewing` | レビュー中 | ClaudeがPRをレビュー中 |
|
277
|
+
| `soba:done` | 完了 | レビュー承認済み、マージ可能 |
|
278
|
+
| `soba:requires-changes` | 修正要求 | レビューで修正が必要と判断 |
|
279
|
+
| `soba:revising` | 修正中 | Claudeが修正対応中 |
|
280
|
+
| `soba:merged` | マージ済み | PRマージ済み、Issueクローズ済み |
|
281
|
+
|
282
|
+
### PRラベル
|
283
|
+
|
284
|
+
| ラベル | 説明 |
|
285
|
+
|--------|------|
|
286
|
+
| `soba:lgtm` | レビュー承認済み、自動マージ対象 |
|
287
|
+
|
288
|
+
## 開発
|
289
|
+
|
290
|
+
### ディレクトリ構造
|
291
|
+
|
292
|
+
```
|
293
|
+
lib/
|
294
|
+
├── soba/
|
295
|
+
│ ├── cli/ # CLIフレームワーク設定
|
296
|
+
│ ├── commands/ # コマンド実装
|
297
|
+
│ ├── domain/ # ドメインモデル
|
298
|
+
│ ├── services/ # ビジネスロジック
|
299
|
+
│ └── infrastructure/ # 外部連携
|
300
|
+
```
|
301
|
+
|
302
|
+
### テストの実行
|
303
|
+
|
304
|
+
```bash
|
305
|
+
# 全テスト実行
|
306
|
+
bundle exec rspec
|
307
|
+
|
308
|
+
# カバレッジ付きテスト
|
309
|
+
bundle exec rake coverage
|
310
|
+
|
311
|
+
# 特定のテストスイート実行
|
312
|
+
bundle exec rspec spec/unit/
|
313
|
+
```
|
314
|
+
|
315
|
+
### コード品質
|
316
|
+
|
317
|
+
```bash
|
318
|
+
# Rubocop実行(Airbnbスタイル)
|
319
|
+
bundle exec rubocop
|
320
|
+
|
321
|
+
# 自動修正
|
322
|
+
bundle exec rubocop -a
|
323
|
+
|
324
|
+
# セキュリティ監査
|
325
|
+
bundle exec bundler-audit
|
326
|
+
```
|
327
|
+
|
328
|
+
### Gitフック
|
329
|
+
|
330
|
+
プロジェクトはコード品質のためのpre-commitフックを使用:
|
331
|
+
- 自動的なRubocop修正
|
332
|
+
- 自動修正後の再ステージング
|
333
|
+
- 手動修正が必要な場合のコミットブロック
|
334
|
+
|
335
|
+
フックのセットアップ:
|
336
|
+
```bash
|
337
|
+
./scripts/setup-hooks.sh
|
338
|
+
```
|
339
|
+
|
340
|
+
## 要件
|
341
|
+
|
342
|
+
- Ruby >= 3.0
|
343
|
+
- Git
|
344
|
+
- tmux(オプション、推奨)
|
345
|
+
- GitHub Personal Access Token
|
346
|
+
- Claude Code CLI(`claude`コマンド)
|
347
|
+
|
348
|
+
## アーキテクチャ
|
349
|
+
|
350
|
+
soba CLIはレイヤードアーキテクチャに従っています:
|
351
|
+
- **Commandsレイヤー**: CLIコマンド定義と解析
|
352
|
+
- **Domainレイヤー**: コアビジネスモデルとロジック
|
353
|
+
- **Servicesレイヤー**: ワークフローオーケストレーションと状態管理
|
354
|
+
- **Infrastructureレイヤー**: GitHub APIと外部ツール統合
|
355
|
+
|
356
|
+
詳細なアーキテクチャドキュメントは[docs/development/architecture.md](docs/development/architecture.md)を参照。
|
357
|
+
|
358
|
+
## コントリビューション
|
359
|
+
|
360
|
+
1. リポジトリをフォーク
|
361
|
+
2. フィーチャーブランチを作成(`git checkout -b feature/amazing-feature`)
|
362
|
+
3. 変更をコミット(`git commit -m 'Add amazing feature'`)
|
363
|
+
4. ブランチにプッシュ(`git push origin feature/amazing-feature`)
|
364
|
+
5. プルリクエストを開く
|
365
|
+
|
366
|
+
以下を確認してください:
|
367
|
+
- すべてのテストがパス(`bundle exec rspec`)
|
368
|
+
- Rubocopチェックがパス(`bundle exec rubocop`)
|
369
|
+
- 高いコードカバレッジを維持
|
370
|
+
|
371
|
+
## ライセンス
|
372
|
+
|
373
|
+
このプロジェクトはMITライセンスの下でライセンスされています - 詳細は[LICENSE](LICENSE)ファイルを参照。
|
374
|
+
|
375
|
+
## サポート
|
376
|
+
|
377
|
+
- **Issues**: [GitHub Issues](https://github.com/douhashi/soba-cli/issues)
|
378
|
+
- **Discussions**: [GitHub Discussions](https://github.com/douhashi/soba-cli/discussions)
|
379
|
+
|
380
|
+
## 謝辞
|
381
|
+
|
382
|
+
- AI駆動開発を実現する[Claude Code](https://claude.ai/code)
|
383
|
+
- CLIフレームワーク[GLI](https://github.com/davetron5000/gli)
|
384
|
+
- [Airbnb Ruby Style Guide](https://github.com/airbnb/ruby)によるスタイリング
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rspec/core/rake_task"
|
4
|
+
require "rubocop/rake_task"
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
RuboCop::RakeTask.new
|
8
|
+
|
9
|
+
# Load custom rake tasks
|
10
|
+
Dir.glob('lib/tasks/*.rake').each { |r| import r }
|
11
|
+
|
12
|
+
task default: [:rubocop, :spec]
|
13
|
+
|
14
|
+
desc "Run tests with coverage"
|
15
|
+
task :coverage do
|
16
|
+
ENV["COVERAGE"] = "true"
|
17
|
+
Rake::Task["spec"].invoke
|
18
|
+
end
|
data/bin/soba
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "bundler/setup"
|
5
|
+
require "gli"
|
6
|
+
require_relative "../lib/soba"
|
7
|
+
|
8
|
+
include GLI::App
|
9
|
+
|
10
|
+
program_desc "GitHub to Claude Code workflow automation"
|
11
|
+
version Soba::VERSION
|
12
|
+
|
13
|
+
desc "Configuration file path"
|
14
|
+
flag [:c, :config]
|
15
|
+
|
16
|
+
desc "Verbose output"
|
17
|
+
switch [:v, :verbose]
|
18
|
+
|
19
|
+
desc "Initialize soba configuration"
|
20
|
+
command :init do |c|
|
21
|
+
c.desc "Interactive mode for configuration"
|
22
|
+
c.switch [:i, :interactive]
|
23
|
+
|
24
|
+
c.action do |global_options, options, _args|
|
25
|
+
require_relative "../lib/soba/commands/init"
|
26
|
+
Soba::Commands::Init.new(interactive: options[:interactive]).execute
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Show configuration"
|
31
|
+
command :config do |c|
|
32
|
+
c.action do |global_options, _options, _args|
|
33
|
+
require_relative "../lib/soba/commands/config/show"
|
34
|
+
Soba::Commands::Config::Show.new.execute(
|
35
|
+
config_path: global_options[:config],
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "Start workflow automation"
|
41
|
+
command :start do |c|
|
42
|
+
c.desc "Issue number to process (optional)"
|
43
|
+
c.arg_name "[issue_number]"
|
44
|
+
|
45
|
+
c.desc "Disable tmux execution"
|
46
|
+
c.switch ["no-tmux"]
|
47
|
+
|
48
|
+
c.desc "Run in daemon mode (default is foreground mode)"
|
49
|
+
c.switch [:d, :daemon]
|
50
|
+
|
51
|
+
c.desc "[DEPRECATED] Run in foreground mode (now default)"
|
52
|
+
c.switch [:f, :foreground]
|
53
|
+
|
54
|
+
c.action do |global_options, options, args|
|
55
|
+
require_relative "../lib/soba/commands/start"
|
56
|
+
result = Soba::Commands::Start.new.execute(global_options, options, args)
|
57
|
+
if result.is_a?(Integer) && result != 0
|
58
|
+
exit(result)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
desc "Show daemon status"
|
64
|
+
command :status do |c|
|
65
|
+
c.flag [:l, :log], desc: "Number of log lines to display", type: Integer, default_value: 10
|
66
|
+
c.switch [:j, :json], desc: "Output in JSON format", negatable: false
|
67
|
+
|
68
|
+
c.action do |global_options, options, args|
|
69
|
+
require_relative "../lib/soba/commands/status"
|
70
|
+
result = Soba::Commands::Status.new.execute(global_options, options, args)
|
71
|
+
if result.is_a?(Integer) && result != 0
|
72
|
+
exit(result)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
desc "Stop daemon"
|
78
|
+
command :stop do |c|
|
79
|
+
c.switch [:f, :force], desc: "Force kill immediately without waiting", negatable: false
|
80
|
+
c.flag [:t, :timeout], desc: "Timeout in seconds", type: Integer, default_value: 30
|
81
|
+
|
82
|
+
c.action do |global_options, options, args|
|
83
|
+
require_relative "../lib/soba/commands/stop"
|
84
|
+
result = Soba::Commands::Stop.new.execute(global_options, options, args)
|
85
|
+
if result.is_a?(Integer) && result != 0
|
86
|
+
exit(result)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
desc "Open tmux session for a task"
|
92
|
+
command :open do |c|
|
93
|
+
c.desc "Task number to open"
|
94
|
+
c.arg_name "[task_number]"
|
95
|
+
|
96
|
+
c.desc "List active task sessions"
|
97
|
+
c.switch [:l, :list]
|
98
|
+
|
99
|
+
c.action do |global_options, options, args|
|
100
|
+
require_relative "../lib/soba/commands/open"
|
101
|
+
command = Soba::Commands::Open.new
|
102
|
+
issue_number = args[0] unless args.empty?
|
103
|
+
command.execute(issue_number, list: options[:list])
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
pre do |global, _command, _options, _args|
|
108
|
+
if global[:verbose]
|
109
|
+
Soba.logger.level = :debug
|
110
|
+
end
|
111
|
+
true
|
112
|
+
end
|
113
|
+
|
114
|
+
on_error do |exception|
|
115
|
+
Soba.logger.error(exception.message)
|
116
|
+
Soba.logger.debug(exception.backtrace.join("\n")) if Soba.logger.debug?
|
117
|
+
false
|
118
|
+
end
|
119
|
+
|
120
|
+
exit run(ARGV)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# soba CLI configuration example
|
2
|
+
github:
|
3
|
+
# GitHub Personal Access Token
|
4
|
+
# Generate at: https://github.com/settings/tokens
|
5
|
+
token: ${GITHUB_TOKEN}
|
6
|
+
|
7
|
+
# Default repository to monitor (owner/repo format)
|
8
|
+
repository: owner/repo
|
9
|
+
|
10
|
+
claude:
|
11
|
+
# Claude API Key
|
12
|
+
api_key: ${CLAUDE_API_KEY}
|
13
|
+
|
14
|
+
# Model to use (optional)
|
15
|
+
model: claude-3-opus-20240229
|
16
|
+
|
17
|
+
workflow:
|
18
|
+
# Polling interval in seconds
|
19
|
+
interval: 60
|
20
|
+
|
21
|
+
# Use tmux for Claude execution (default: true)
|
22
|
+
# Set to false for CI/CD environments or debugging
|
23
|
+
use_tmux: true
|
24
|
+
|
25
|
+
# Maximum concurrent workflows
|
26
|
+
max_concurrent: 3
|
27
|
+
|
28
|
+
# Workflow timeout in seconds
|
29
|
+
timeout: 3600
|
30
|
+
|
31
|
+
logging:
|
32
|
+
# Log level: debug, info, warn, error
|
33
|
+
level: info
|
34
|
+
|
35
|
+
# Log file path (optional)
|
36
|
+
file: ~/.soba/logs/soba.log
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# soba CLI プロジェクト概要
|
2
|
+
|
3
|
+
## プロジェクトの目的
|
4
|
+
|
5
|
+
soba CLIは、GitHub IssueをデータソースとしてClaude Codeによる自律的なワークフローを実現するコマンドラインツールです。開発者の作業を自動化し、効率的なイシュー管理とコード生成を支援します。
|
6
|
+
|
7
|
+
## 主要機能
|
8
|
+
|
9
|
+
### 1. Issue監視機能
|
10
|
+
- GitHub Issueの定期的な監視
|
11
|
+
- 新規・更新Issueの自動検出
|
12
|
+
- カスタマイズ可能な監視間隔
|
13
|
+
|
14
|
+
### 2. 自律的ワークフロー実行
|
15
|
+
- Issue検出時のClaude Code自動起動
|
16
|
+
- Issueコンテンツに基づいた適切な処理実行
|
17
|
+
- コード生成、修正、テスト実行の自動化
|
18
|
+
|
19
|
+
### 3. Claude Code最適化
|
20
|
+
- 専用コマンド群の提供
|
21
|
+
- AIエージェントテンプレート
|
22
|
+
- ワークフロー最適化ツール
|
23
|
+
|
24
|
+
## ターゲットユーザー
|
25
|
+
|
26
|
+
- 個人開発者
|
27
|
+
- 小規模開発チーム
|
28
|
+
- AIアシスタントを活用した開発プロセスの自動化を求める組織
|
29
|
+
|
30
|
+
## 提供価値
|
31
|
+
|
32
|
+
1. **開発効率の向上**: 繰り返し作業の自動化
|
33
|
+
2. **品質向上**: 一貫性のあるコード生成
|
34
|
+
3. **迅速な対応**: Issue検出から実装までの時間短縮
|
35
|
+
4. **柔軟性**: カスタマイズ可能なワークフロー
|
36
|
+
|
37
|
+
## 技術スタック
|
38
|
+
|
39
|
+
- **実装言語**: Ruby
|
40
|
+
- **配布方式**: Tebako(スタンドアロンバイナリ)
|
41
|
+
- **対象プラットフォーム**: Linux, macOS, Windows
|
42
|
+
- **依存関係**: GitHub API, Claude Code API
|