rufio 0.60.0 → 0.62.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.
data/README_ja.md ADDED
@@ -0,0 +1,331 @@
1
+ # rufio
2
+
3
+ **Runtime Unified Flow I/O Operator**
4
+
5
+ ファイルを起点に、ツールとスクリプトを実行・連携させるTUIファイルマネージャー。
6
+ Ruby/Python/PowerShellに対応し、開発ワークフローを一箇所に統合します。
7
+
8
+ A TUI file manager as a unified runtime environment for tools and scripts.
9
+
10
+ **日本語** | [English](./README.md)
11
+
12
+ ## コンセプト
13
+
14
+ rufioは単なるファイルマネージャーではありません。**ツールランタイム実行環境**です。
15
+
16
+ ```
17
+ ┌─────────────────────────────────────────────────────────┐
18
+ │ rufio │
19
+ │ Runtime Unified Flow I/O Operator │
20
+ ├─────────────────────────────────────────────────────────┤
21
+ │ Files ──→ Scripts ──→ Tools ──→ Output │
22
+ │ ↑ │ │
23
+ │ └───────────── Feedback ────────────┘ │
24
+ └─────────────────────────────────────────────────────────┘
25
+ ```
26
+
27
+ - **ファイル操作**: 従来のファイルマネージャー機能
28
+ - **スクリプト実行**: Ruby/Python/PowerShellスクリプトをファイルコンテキストで実行
29
+ - **ツール連携**: 外部ツール(git, fzf, rga等)とのシームレスな統合
30
+ - **統一I/O**: すべての入出力を単一のフローで管理
31
+
32
+ ## 特徴
33
+
34
+ ### ツールランタイムとして
35
+
36
+ - **マルチ言語スクリプト対応**: Ruby, Python, PowerShell
37
+ - **スクリプトパス管理**: 複数のスクリプトディレクトリを登録・管理
38
+ - **コマンド補完**: `@`プレフィックスでスクリプトをTab補完
39
+ - **ジョブ管理**: バックグラウンドでスクリプト/コマンドを実行
40
+ - **実行ログ**: すべての実行結果を自動記録
41
+
42
+ ### ファイルマネージャーとして
43
+
44
+ - **Vimライクなキーバインド**: 直感的なナビゲーション
45
+ - **リアルタイムプレビュー**: ファイル内容を即座に表示
46
+ - **高速検索**: fzf/rgaとの連携
47
+ - **ブックマーク**: よく使うディレクトリに素早くアクセス
48
+ - **zoxide連携**: スマートなディレクトリ履歴
49
+
50
+ ### クロスプラットフォーム
51
+
52
+ - **macOS**: ネイティブサポート
53
+ - **Linux**: ネイティブサポート
54
+ - **Windows**: PowerShellスクリプト対応
55
+
56
+ ## インストール
57
+
58
+ ```bash
59
+ gem install rufio
60
+ ```
61
+
62
+ または、Gemfileに追加:
63
+
64
+ ```ruby
65
+ gem 'rufio'
66
+ ```
67
+
68
+ ## クイックスタート
69
+
70
+ ### 1. 起動
71
+
72
+ ```bash
73
+ rufio # カレントディレクトリで起動
74
+ rufio /path/to # 指定したディレクトリで起動
75
+ ```
76
+
77
+ ### 2. スクリプトパスを登録
78
+
79
+ 1. スクリプトを配置したいディレクトリに移動
80
+ 2. `B` → `2` でスクリプトパスに追加
81
+
82
+ ### 3. スクリプトを実行
83
+
84
+ 1. `:` でコマンドモードを起動
85
+ 2. `@` + スクリプト名の一部を入力
86
+ 3. `Tab` で補完
87
+ 4. `Enter` で実行
88
+
89
+ ## キーバインド
90
+
91
+ ### 基本操作
92
+
93
+ | キー | 機能 |
94
+ |------|------|
95
+ | `j/k` | 上下移動 |
96
+ | `h/l` | 親/子ディレクトリ |
97
+ | `g/G` | 先頭/末尾 |
98
+ | `Enter` | ディレクトリに入る/ファイルを開く |
99
+ | `q` | 終了 |
100
+
101
+ ### ファイル操作
102
+
103
+ | キー | 機能 |
104
+ |------|------|
105
+ | `Space` | 選択/選択解除 |
106
+ | `o` | 外部エディタで開く |
107
+ | `a/A` | ファイル/ディレクトリ作成 |
108
+ | `r` | リネーム |
109
+ | `d` | 削除 |
110
+ | `m/c/x` | 移動/コピー/削除(選択済み) |
111
+
112
+ ### 検索・フィルター
113
+
114
+ | キー | 機能 |
115
+ |------|------|
116
+ | `f` | フィルターモード |
117
+ | `s` | fzfでファイル検索 |
118
+ | `F` | rgaでファイル内容検索 |
119
+
120
+ ### ナビゲーション
121
+
122
+ | キー | 機能 |
123
+ |------|------|
124
+ | `b` | ブックマーク追加 |
125
+ | `B` | ブックマークメニュー |
126
+ | `0` | 起動ディレクトリに戻る |
127
+ | `1-9` | ブックマークにジャンプ |
128
+ | `z` | zoxide履歴 |
129
+
130
+ ### ツールランタイム
131
+
132
+ | キー | 機能 |
133
+ |------|------|
134
+ | `:` | コマンドモード |
135
+ | `J` | ジョブモード |
136
+ | `L` | 実行ログ表示 |
137
+ | `?` | ヘルプ |
138
+
139
+ ## コマンドモード
140
+
141
+ `:` でコマンドモードを起動し、様々なコマンドを実行できます。
142
+
143
+ ### スクリプト実行
144
+
145
+ ```
146
+ :@build # @で始まるとスクリプト補完
147
+ :@deploy.rb # 登録済みスクリプトを実行
148
+ ```
149
+
150
+ ### シェルコマンド
151
+
152
+ ```
153
+ :!git status # !で始まるとシェルコマンド
154
+ :!ls -la # バックグラウンドで実行
155
+ ```
156
+
157
+ ### 組み込みコマンド
158
+
159
+ ```
160
+ :hello # 挨拶メッセージ
161
+ :stop # rufioを終了
162
+ ```
163
+
164
+ ## スクリプトパス
165
+
166
+ ### スクリプトパスとは
167
+
168
+ スクリプトファイルを配置するディレクトリを登録する機能です。登録したディレクトリ内のスクリプトは、コマンドモードで `@` プレフィックスを使って実行できます。
169
+
170
+ ### 管理方法
171
+
172
+ `B` → `3` でスクリプトパス管理メニューを開きます:
173
+
174
+ - 登録済みパスの一覧表示
175
+ - `d`: パスを削除
176
+ - `Enter`: ディレクトリにジャンプ
177
+ - `ESC`: メニューを閉じる
178
+
179
+ ### 対応スクリプト
180
+
181
+ | 拡張子 | 言語 |
182
+ |--------|------|
183
+ | `.rb` | Ruby |
184
+ | `.py` | Python |
185
+ | `.ps1` | PowerShell |
186
+ | `.sh` | Shell (bash/zsh) |
187
+
188
+ ## DSLコマンド
189
+
190
+ `~/.config/rufio/commands.rb` でカスタムコマンドを定義できます:
191
+
192
+ ```ruby
193
+ command "hello" do
194
+ ruby { "Hello from rufio!" }
195
+ description "挨拶コマンド"
196
+ end
197
+
198
+ command "status" do
199
+ shell "git status"
200
+ description "Gitステータス"
201
+ end
202
+
203
+ command "build" do
204
+ script "~/.config/rufio/scripts/build.rb"
205
+ description "ビルド実行"
206
+ end
207
+ ```
208
+
209
+ ## 設定
210
+
211
+ ### 設定ファイル構成
212
+
213
+ ```
214
+ ~/.config/rufio/
215
+ ├── config.rb # メイン設定(スクリプトパス、カラー等)
216
+ ├── commands.rb # DSLコマンド定義
217
+ ├── bookmarks.json # ブックマーク
218
+ ├── scripts/ # スクリプトファイル
219
+ └── logs/ # 実行ログ
220
+ ```
221
+
222
+ ### 設定例
223
+
224
+ ```ruby
225
+ # ~/.config/rufio/config.rb
226
+
227
+ # スクリプトパス - スクリプトを配置するディレクトリ
228
+ SCRIPT_PATHS = [
229
+ '~/.config/rufio/scripts',
230
+ '~/my-scripts',
231
+ './scripts'
232
+ ].freeze
233
+
234
+ # カラー設定(HSL形式推奨)
235
+ COLORS = {
236
+ directory: { hsl: [220, 80, 60] },
237
+ file: { hsl: [0, 0, 90] },
238
+ executable: { hsl: [120, 70, 50] },
239
+ selected: { hsl: [50, 90, 70] },
240
+ preview: { hsl: [180, 60, 65] }
241
+ }.freeze
242
+ ```
243
+
244
+ ### ローカル設定
245
+
246
+ プロジェクトルートに `rufio.rb` を配置すると、そのプロジェクト専用のスクリプトパスを設定できます:
247
+
248
+ ```ruby
249
+ # ./rufio.rb(プロジェクトルート)
250
+ SCRIPT_PATHS = [
251
+ './scripts',
252
+ './bin'
253
+ ].freeze
254
+ ```
255
+
256
+ ## 外部ツール連携
257
+
258
+ rufioは以下の外部ツールと連携して機能を拡張します:
259
+
260
+ | ツール | 用途 | キー |
261
+ |--------|------|------|
262
+ | fzf | ファイル名検索 | `s` |
263
+ | rga | ファイル内容検索 | `F` |
264
+ | zoxide | ディレクトリ履歴 | `z` |
265
+
266
+ ### インストール
267
+
268
+ ```bash
269
+ # macOS
270
+ brew install fzf rga zoxide
271
+
272
+ # Ubuntu/Debian
273
+ apt install fzf zoxide
274
+ # rgaは別途インストール: https://github.com/phiresky/ripgrep-all
275
+ ```
276
+
277
+ ## 高度な機能
278
+
279
+ ### ネイティブスキャナー(実験的)
280
+
281
+ 高速なディレクトリスキャンのためのネイティブ実装をサポート:
282
+
283
+ ```bash
284
+ rufio --native # 自動検出
285
+ rufio --native=zig # Zig実装
286
+ ```
287
+
288
+ ### JITコンパイラ
289
+
290
+ ```bash
291
+ rufio --yjit # Ruby 3.1+ YJIT
292
+ rufio --zjit # Ruby 3.4+ ZJIT
293
+ ```
294
+
295
+ ### ヘルスチェック
296
+
297
+ ```bash
298
+ rufio -c # システム依存関係をチェック
299
+ rufio --check-health # 同上
300
+ ```
301
+
302
+ ## 開発
303
+
304
+ ### 必要な環境
305
+
306
+ - Ruby 2.7.0以上
307
+ - io-console, pastel, tty-cursor, tty-screen gems
308
+
309
+ ### 開発版の実行
310
+
311
+ ```bash
312
+ git clone https://github.com/masisz/rufio
313
+ cd rufio
314
+ bundle install
315
+ ./bin/rufio
316
+ ```
317
+
318
+ ### テスト
319
+
320
+ ```bash
321
+ bundle exec rake test
322
+ ```
323
+
324
+ ## ライセンス
325
+
326
+ MIT License
327
+
328
+ ## 貢献
329
+
330
+ バグ報告や機能リクエストは [GitHub Issues](https://github.com/masisz/rufio/issues) でお願いします。
331
+ プルリクエストも歓迎です!
@@ -0,0 +1,14 @@
1
+ # ~/.config/rufio/bookmarks.yml
2
+ # List of bookmarks
3
+ #
4
+ # Press 1-9 keys to jump directly to bookmarks.
5
+ # Press B key to open bookmark menu for add/remove operations.
6
+
7
+ - path: ~/Documents
8
+ name: Documents
9
+ - path: ~/Downloads
10
+ name: Downloads
11
+ - path: ~/projects
12
+ name: Projects
13
+ - path: ~/.config
14
+ name: Config
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ~/.config/rufio/config.rb
4
+ # rufio DSL Configuration File
5
+ #
6
+ # This file defines the configuration for rufio.
7
+ # Script paths and bookmarks are managed in separate YAML files.
8
+
9
+ # ========================================
10
+ # Language Setting
11
+ # ========================================
12
+ # 'en' (English) or 'ja' (Japanese)
13
+ LANGUAGE = 'ja'
14
+
15
+ # ========================================
16
+ # Color Settings
17
+ # ========================================
18
+ # HSL format: [hue(0-360), saturation(0-100), lightness(0-100)]
19
+ COLORS = {
20
+ directory: { hsl: [220, 80, 60] }, # Blue
21
+ file: { hsl: [0, 0, 90] }, # White
22
+ executable: { hsl: [120, 70, 50] }, # Green
23
+ selected: { hsl: [50, 90, 70] }, # Yellow
24
+ preview: { hsl: [180, 60, 65] } # Cyan
25
+ }.freeze
26
+
27
+ # ========================================
28
+ # Keybind Settings
29
+ # ========================================
30
+ KEYBINDS = {
31
+ quit: %w[q ESC],
32
+ up: %w[k UP],
33
+ down: %w[j DOWN],
34
+ left: %w[h LEFT],
35
+ right: %w[l RIGHT ENTER],
36
+ top: %w[g],
37
+ bottom: %w[G],
38
+ refresh: %w[r],
39
+ search: %w[/],
40
+ open_file: %w[o SPACE]
41
+ }.freeze
42
+
43
+ # ========================================
44
+ # Application Associations
45
+ # ========================================
46
+ # Specify which application to open for each file extension
47
+ APPLICATIONS = {
48
+ %w[txt md rb py js html css json xml yaml yml] => 'code',
49
+ %w[jpg jpeg png gif bmp svg webp] => 'open',
50
+ %w[mp4 avi mkv mov wmv] => 'open',
51
+ %w[pdf] => 'open',
52
+ %w[doc docx xls xlsx ppt pptx] => 'open',
53
+ :default => 'open'
54
+ }.freeze
55
+
56
+ # ========================================
57
+ # Command History Size
58
+ # ========================================
59
+ COMMAND_HISTORY_SIZE = 1000
60
+
61
+ # ========================================
62
+ # Script Paths and Bookmarks
63
+ # ========================================
64
+ # script_paths.yml - List of script directories
65
+ # bookmarks.yml - List of bookmarks
66
+ #
67
+ # These files are automatically loaded by rufio.
68
+ # You can edit them manually or manage via rufio's UI.
@@ -0,0 +1,11 @@
1
+ # ~/.config/rufio/script_paths.yml
2
+ # List of script directories
3
+ #
4
+ # Scripts in registered directories can be executed
5
+ # from rufio's command mode (:).
6
+ #
7
+ # Example: :build -> executes build.sh or build.rb in script_paths
8
+
9
+ - ~/.config/rufio/scripts
10
+ - ~/bin
11
+ - ~/scripts
@@ -21,7 +21,7 @@ module Rufio
21
21
  terminal_ui = TerminalUI.new(test_mode: test_mode)
22
22
 
23
23
  # バックグラウンドコマンド実行用の設定
24
- log_dir = File.join(Dir.home, '.config', 'rufio', 'log')
24
+ log_dir = File.join(Dir.home, '.config', 'rufio', 'logs')
25
25
  FileUtils.mkdir_p(log_dir) unless Dir.exist?(log_dir)
26
26
  command_logger = CommandLogger.new(log_dir)
27
27
  background_executor = BackgroundCommandExecutor.new(command_logger)
@@ -2,13 +2,15 @@
2
2
 
3
3
  require 'json'
4
4
  require 'fileutils'
5
+ require_relative 'bookmark_storage'
5
6
 
6
7
  module Rufio
7
8
  class Bookmark
8
9
  MAX_BOOKMARKS = 9
9
10
 
10
- def initialize(config_file = nil)
11
+ def initialize(config_file = nil, storage: nil)
11
12
  @config_file = config_file || default_config_file
13
+ @storage = storage || JsonBookmarkStorage.new(@config_file)
12
14
  @bookmarks = []
13
15
  ensure_config_directory
14
16
  load
@@ -70,38 +72,12 @@ module Rufio
70
72
  end
71
73
 
72
74
  def save
73
- begin
74
- File.write(@config_file, JSON.pretty_generate(@bookmarks))
75
- true
76
- rescue StandardError => e
77
- warn "Failed to save bookmarks: #{e.message}"
78
- false
79
- end
75
+ @storage.save(@bookmarks)
80
76
  end
81
77
 
82
78
  def load
83
- return true unless File.exist?(@config_file)
84
-
85
- begin
86
- content = File.read(@config_file)
87
- @bookmarks = JSON.parse(content, symbolize_names: true)
88
- @bookmarks = [] unless @bookmarks.is_a?(Array)
89
-
90
- # 無効なブックマークを除去
91
- @bookmarks = @bookmarks.select do |bookmark|
92
- bookmark.is_a?(Hash) &&
93
- bookmark.key?(:path) &&
94
- bookmark.key?(:name) &&
95
- bookmark[:path].is_a?(String) &&
96
- bookmark[:name].is_a?(String)
97
- end
98
-
99
- true
100
- rescue JSON::ParserError, StandardError => e
101
- warn "Failed to load bookmarks: #{e.message}"
102
- @bookmarks = []
103
- true
104
- end
79
+ @bookmarks = @storage.load
80
+ true
105
81
  end
106
82
 
107
83
  private
@@ -1,16 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'bookmark'
4
+ require_relative 'bookmark_storage'
4
5
  require_relative 'config_loader'
5
6
 
6
7
  module Rufio
7
8
  # Manages bookmark operations with interactive UI
8
9
  class BookmarkManager
9
10
  def initialize(bookmark = nil, dialog_renderer = nil)
10
- @bookmark = bookmark || Bookmark.new
11
+ @bookmark = bookmark || create_default_bookmark
11
12
  @dialog_renderer = dialog_renderer
12
13
  end
13
14
 
15
+ private
16
+
17
+ def create_default_bookmark
18
+ # 必要に応じて古いconfig.ymlからマイグレーション
19
+ ConfigLoader.migrate_bookmarks_if_needed
20
+
21
+ # 新形式のYAMLストレージを使用(bookmarks.yml)
22
+ storage = ConfigLoader.bookmark_storage
23
+ Bookmark.new(ConfigLoader::BOOKMARKS_YML, storage: storage)
24
+ end
25
+
26
+ public
27
+
14
28
  # Show bookmark menu and handle user selection
15
29
  # @param current_path [String] Current directory path
16
30
  # @return [Symbol, nil] Action to perform (:navigate, :add, :list, :remove, :cancel)
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'yaml'
5
+ require 'fileutils'
6
+ require_relative 'config'
7
+
8
+ module Rufio
9
+ # ブックマークストレージの基底クラス
10
+ class BookmarkStorage
11
+ def initialize(file_path)
12
+ @file_path = file_path
13
+ end
14
+
15
+ def load
16
+ raise NotImplementedError, 'Subclasses must implement #load'
17
+ end
18
+
19
+ def save(_bookmarks)
20
+ raise NotImplementedError, 'Subclasses must implement #save'
21
+ end
22
+
23
+ protected
24
+
25
+ def ensure_directory
26
+ dir = File.dirname(@file_path)
27
+ FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
28
+ end
29
+
30
+ def valid_bookmark?(bookmark)
31
+ bookmark.is_a?(Hash) &&
32
+ (bookmark.key?(:path) || bookmark.key?('path')) &&
33
+ (bookmark.key?(:name) || bookmark.key?('name'))
34
+ end
35
+
36
+ def normalize_bookmark(bookmark)
37
+ {
38
+ path: bookmark[:path] || bookmark['path'],
39
+ name: bookmark[:name] || bookmark['name']
40
+ }
41
+ end
42
+
43
+ def filter_valid_bookmarks(bookmarks)
44
+ return [] unless bookmarks.is_a?(Array)
45
+
46
+ bookmarks.select { |b| valid_bookmark?(b) }.map { |b| normalize_bookmark(b) }
47
+ end
48
+ end
49
+
50
+ # JSON形式のブックマークストレージ
51
+ class JsonBookmarkStorage < BookmarkStorage
52
+ def load
53
+ return [] unless File.exist?(@file_path)
54
+
55
+ content = File.read(@file_path)
56
+ bookmarks = JSON.parse(content, symbolize_names: true)
57
+ filter_valid_bookmarks(bookmarks)
58
+ rescue JSON::ParserError, StandardError
59
+ []
60
+ end
61
+
62
+ def save(bookmarks)
63
+ ensure_directory
64
+ File.write(@file_path, JSON.pretty_generate(bookmarks))
65
+ true
66
+ rescue StandardError => e
67
+ warn "Failed to save bookmarks to JSON: #{e.message}"
68
+ false
69
+ end
70
+ end
71
+
72
+ # YAML形式のブックマークストレージ(新旧形式対応)
73
+ # 新形式: bookmarks.yml(配列形式)
74
+ # 旧形式: config.yml(bookmarksセクション)
75
+ class YamlBookmarkStorage < BookmarkStorage
76
+ def load
77
+ return [] unless File.exist?(@file_path)
78
+
79
+ # 新形式: bookmarks.yml(配列形式)
80
+ if @file_path.end_with?('bookmarks.yml')
81
+ return Config.load_bookmarks_from_yml(@file_path)
82
+ end
83
+
84
+ # 旧形式: config.yml(bookmarksセクション)
85
+ yaml = YAML.safe_load(File.read(@file_path), symbolize_names: true)
86
+ return [] unless yaml.is_a?(Hash)
87
+
88
+ bookmarks = yaml[:bookmarks] || []
89
+ filter_valid_bookmarks(bookmarks)
90
+ rescue StandardError
91
+ []
92
+ end
93
+
94
+ def save(bookmarks)
95
+ ensure_directory
96
+
97
+ # 新形式: bookmarks.yml(配列形式)
98
+ if @file_path.end_with?('bookmarks.yml')
99
+ Config.save_bookmarks_to_yml(@file_path, bookmarks)
100
+ return true
101
+ end
102
+
103
+ # 旧形式: config.yml(bookmarksセクション - 既存の設定を保持)
104
+ existing = if File.exist?(@file_path)
105
+ YAML.safe_load(File.read(@file_path), symbolize_names: false) || {}
106
+ else
107
+ {}
108
+ end
109
+
110
+ existing['bookmarks'] = bookmarks.map do |b|
111
+ { 'path' => b[:path], 'name' => b[:name] }
112
+ end
113
+
114
+ File.write(@file_path, YAML.dump(existing))
115
+ true
116
+ rescue StandardError => e
117
+ warn "Failed to save bookmarks to YAML: #{e.message}"
118
+ false
119
+ end
120
+ end
121
+
122
+ # JSONからYAMLへのマイグレーター
123
+ class BookmarkMigrator
124
+ # @param json_path [String] JSONファイルのパス
125
+ # @param yaml_path [String] YAMLファイルのパス
126
+ # @return [Boolean] マイグレーションが実行されたかどうか
127
+ def self.migrate(json_path, yaml_path)
128
+ return false unless File.exist?(json_path)
129
+
130
+ # JSONからブックマークを読み込む
131
+ json_storage = JsonBookmarkStorage.new(json_path)
132
+ bookmarks = json_storage.load
133
+
134
+ return false if bookmarks.empty?
135
+
136
+ # YAMLに保存
137
+ yaml_storage = YamlBookmarkStorage.new(yaml_path)
138
+ yaml_storage.save(bookmarks)
139
+
140
+ # JSONファイルをバックアップ
141
+ FileUtils.mv(json_path, "#{json_path}.bak")
142
+
143
+ true
144
+ rescue StandardError => e
145
+ warn "Migration failed: #{e.message}"
146
+ false
147
+ end
148
+ end
149
+ end
@@ -62,9 +62,9 @@ module Rufio
62
62
  # バックグラウンドエグゼキュータが利用可能な場合は非同期実行
63
63
  if @background_executor
64
64
  if @background_executor.execute_async(shell_command)
65
- return "🔄 バックグラウンドで実行中: #{shell_command.split.first}"
65
+ return "🔄 Running in background: #{shell_command.split.first}"
66
66
  else
67
- return "⚠️ 既にコマンドが実行中です"
67
+ return "⚠️ Command already running"
68
68
  end
69
69
  else
70
70
  # バックグラウンドエグゼキュータがない場合は同期実行
@@ -165,9 +165,9 @@ module Rufio
165
165
  if @background_executor.execute_ruby_async(command_display_name) do
166
166
  ScriptExecutor.execute_command(dsl_cmd)
167
167
  end
168
- return "🔄 バックグラウンドで実行中: #{command_display_name}"
168
+ return "🔄 Running in background: #{command_display_name}"
169
169
  else
170
- return "⚠️ 既にコマンドが実行中です"
170
+ return "⚠️ Command already running"
171
171
  end
172
172
  end
173
173