hiiro 0.1.366 → 0.1.368

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.
@@ -2,7 +2,7 @@ require 'shellwords'
2
2
 
3
3
  class Hiiro
4
4
  class TaskSessions
5
- class Error < StandardError; end
5
+ class Error < Hiiro::Error; end
6
6
 
7
7
  def initialize(client, workspace:, directory:)
8
8
  @client = client
data/lib/hiiro/tasks.rb CHANGED
@@ -175,6 +175,28 @@ class Hiiro
175
175
  task_name = scope == :subtask ? "#{current_parent_task.name}/#{name}" : name
176
176
  subtree_name = scope == :subtask ? "#{current_parent_task.name}/#{name}" : "#{name}/main"
177
177
 
178
+ target_path = create_tree(subtree_name, sparse_groups: sparse_groups)
179
+ return unless target_path
180
+
181
+ session_name = task_name
182
+ task = Task.new(name: task_name, tree: subtree_name, session: session_name)
183
+ config.save_task(task)
184
+
185
+ base_dir = target_path
186
+ if app_name
187
+ app = environment.find_app(app_name)
188
+ base_dir = app.resolve(target_path) if app
189
+ end
190
+
191
+ Dir.chdir(base_dir)
192
+ hiiro.start_herdr_workspace(session_name, start_directory: Dir.pwd)
193
+
194
+ puts "Started task '#{task_name}' in worktree '#{subtree_name}'"
195
+ end
196
+
197
+ # Create (or reuse an unassigned) worktree under WORK_DIR and return its path,
198
+ # or nil on failure. Shared by `h task start` and `t TASK tree new`.
199
+ def create_tree(subtree_name, sparse_groups: [])
178
200
  target_path = File.join(Hiiro::WORK_DIR, subtree_name)
179
201
 
180
202
  git = Hiiro::Git.new(nil, Hiiro::REPO_PATH)
@@ -184,33 +206,19 @@ class Hiiro
184
206
  FileUtils.mkdir_p(File.dirname(target_path))
185
207
  unless git.move_worktree(available.path, target_path, repo_path: Hiiro::REPO_PATH)
186
208
  puts "ERROR: Failed to rename worktree"
187
- return
209
+ return nil
188
210
  end
189
211
  else
190
212
  puts "Creating new worktree '#{subtree_name}'..."
191
213
  FileUtils.mkdir_p(File.dirname(target_path))
192
214
  unless git.add_worktree_detached(target_path, repo_path: Hiiro::REPO_PATH)
193
215
  puts "ERROR: Failed to create worktree"
194
- return
216
+ return nil
195
217
  end
196
218
  end
197
219
 
198
220
  apply_sparse_checkout(target_path, sparse_groups) if sparse_groups.any?
199
-
200
- session_name = task_name
201
- task = Task.new(name: task_name, tree: subtree_name, session: session_name)
202
- config.save_task(task)
203
-
204
- base_dir = target_path
205
- if app_name
206
- app = environment.find_app(app_name)
207
- base_dir = app.resolve(target_path) if app
208
- end
209
-
210
- Dir.chdir(base_dir)
211
- hiiro.start_herdr_workspace(session_name, start_directory: Dir.pwd)
212
-
213
- puts "Started task '#{task_name}' in worktree '#{subtree_name}'"
221
+ target_path
214
222
  end
215
223
 
216
224
  def switch_to_task(task, app_name: nil, force: false)
@@ -1463,10 +1471,11 @@ class Hiiro
1463
1471
  end
1464
1472
 
1465
1473
  def name
1466
- @name ||= if path.start_with?(Hiiro::WORK_DIR + '/')
1467
- path.sub(Hiiro::WORK_DIR + '/', '')
1468
- else
1469
- File.basename(path)
1474
+ @name ||= begin
1475
+ roots = [Hiiro::WORK_DIR]
1476
+ roots << File.realpath(Hiiro::WORK_DIR) if Dir.exist?(Hiiro::WORK_DIR)
1477
+ root = roots.uniq.find { |dir| path.start_with?(dir + '/') }
1478
+ root ? path.delete_prefix(root + '/') : File.basename(path)
1470
1479
  end
1471
1480
  end
1472
1481
 
@@ -1683,13 +1692,17 @@ class Hiiro
1683
1692
  end
1684
1693
 
1685
1694
  def task
1695
+ return @task if defined?(@task)
1696
+
1697
+ s = session
1698
+ t = tree
1699
+ @task = all_tasks.find { |task|
1700
+ (s && task.session_name == s.name) ||
1701
+ (t && (task.tree_name == t.name || task.tree_name == t.path))
1702
+ }
1686
1703
  @task ||= begin
1687
- s = session
1688
- t = tree
1689
- all_tasks.find { |task|
1690
- (s && task.session_name == s.name) ||
1691
- (t && (task.tree_name == t.name || task.tree_name == t.path))
1692
- }
1704
+ record = CurrentTask.new(herdr: -> { Hiiro::Herdr.client }, cwd: path, pin: false).resolve
1705
+ record && all_tasks.find { |task| task.name == record.name }
1693
1706
  end
1694
1707
  end
1695
1708
 
data/lib/hiiro/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  class Hiiro
2
- VERSION = "0.1.366"
2
+ VERSION = "0.1.368"
3
3
  SUPPORTED_RUBY_VERSION = ">= 3.2.0"
4
4
  end
data/lib/hiiro.rb CHANGED
@@ -6,6 +6,7 @@ require "ostruct"
6
6
  require 'awesome_print'
7
7
 
8
8
  require_relative "hiiro/version"
9
+ require_relative "hiiro/error"
9
10
  require_relative "hiiro/config"
10
11
  require_relative "hiiro/effects"
11
12
  require_relative "hiiro/db"
@@ -46,6 +47,9 @@ require_relative "hiiro/pane_home"
46
47
  require_relative "hiiro/pin_record"
47
48
  require_relative "hiiro/reminder"
48
49
  require_relative 'hiiro/registry'
50
+ require_relative 'hiiro/current_task'
51
+ require_relative 'hiiro/task_sessions'
52
+ require_relative 'hiiro/task_cli'
49
53
  require_relative 'hiiro/tui'
50
54
 
51
55
  class String
@@ -65,7 +69,7 @@ class Hiiro
65
69
  WORK_DIR = File.join(Dir.home, 'work')
66
70
  REPO_PATH = File.join(WORK_DIR, '.git')
67
71
 
68
- def self.init(*oargs, plugins: [], logging: false, tasks: false, task_scope: nil, **values, &block)
72
+ def self.init(*oargs, plugins: [], logging: false, tasks: false, task_scope: nil, builtin_commands: true, **values, &block)
69
73
  load_env
70
74
  Hiiro::DB.setup!
71
75
 
@@ -98,24 +102,14 @@ class Hiiro
98
102
  new(h_bin, *h_args, logging: logging, tasks: tasks, task_scope: task_scope, **values).tap do |hiiro|
99
103
  hiiro.load_plugins(plugins)
100
104
 
101
- hiiro.add_subcommand(:pry) { |*args|
102
- binding.pry
103
- }
104
-
105
- hiiro.add_subcmd(:edit, **values) { |*args|
106
- hiiro.edit_files(hiiro.bin)
107
- }
108
-
109
- if hiiro.tasks_enabled?
110
- hiiro.add_subcmd(:task) do |*args|
111
- tm = TaskManager.new(hiiro, scope: :task)
112
- Tasks.build_hiiro(hiiro, tm).run
113
- end
105
+ if builtin_commands
106
+ hiiro.add_subcommand(:pry) { |*args|
107
+ binding.pry
108
+ }
114
109
 
115
- hiiro.add_subcmd(:subtask) do |*args|
116
- tm = TaskManager.new(hiiro, scope: :subtask)
117
- Tasks.build_hiiro(hiiro, tm).run
118
- end
110
+ hiiro.add_subcmd(:edit, **values) { |*args|
111
+ hiiro.edit_files(hiiro.bin)
112
+ }
119
113
  end
120
114
 
121
115
  if block
@@ -132,8 +126,8 @@ class Hiiro
132
126
  Options.setup(&block)
133
127
  end
134
128
 
135
- def self.run(*args, plugins: [], logging: false, tasks: false, task_scope: nil, **values, &block)
136
- hiiro = init(*args, plugins:, logging:, tasks:, task_scope:, **values, &block)
129
+ def self.run(*args, plugins: [], logging: false, tasks: false, task_scope: nil, builtin_commands: true, **values, &block)
130
+ hiiro = init(*args, plugins:, logging:, tasks:, task_scope:, builtin_commands:, **values, &block)
137
131
 
138
132
  hiiro.run
139
133
  end
@@ -227,6 +221,12 @@ class Hiiro
227
221
  Hiiro::Config.open(file, dir: dir)
228
222
  end
229
223
 
224
+ # Open a file, directory, or URL with the OS default handler.
225
+ def open_default(target)
226
+ executable = RUBY_PLATFORM.include?('darwin') ? 'open' : 'xdg-open'
227
+ system(executable, target)
228
+ end
229
+
230
230
  def herdr_client
231
231
  @herdr_client ||= Herdr.client!(self)
232
232
  end
@@ -276,6 +276,8 @@ class Hiiro
276
276
  handle_result(result)
277
277
 
278
278
  exit 1
279
+ rescue Hiiro::Error => e
280
+ abort "ERROR: #{e.message}"
279
281
  rescue => e
280
282
  puts "ERROR: #{e.message}"
281
283
  puts e.backtrace
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hiiro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.366
4
+ version: 0.1.368
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Toyota
@@ -129,6 +129,8 @@ email:
129
129
  executables:
130
130
  - h
131
131
  - hiiro
132
+ - t
133
+ - tt
132
134
  extensions: []
133
135
  extra_rdoc_files: []
134
136
  files:
@@ -142,6 +144,7 @@ files:
142
144
  - Rakefile
143
145
  - TODO.md
144
146
  - bin/h
147
+ - bin/h-alias
145
148
  - bin/h-app
146
149
  - bin/h-bg
147
150
  - bin/h-bin
@@ -153,6 +156,8 @@ files:
153
156
  - bin/h-cpr
154
157
  - bin/h-date
155
158
  - bin/h-db
159
+ - bin/h-env
160
+ - bin/h-herdr
156
161
  - bin/h-img
157
162
  - bin/h-link
158
163
  - bin/h-misc
@@ -170,6 +175,7 @@ files:
170
175
  - bin/h-sha
171
176
  - bin/h-sparse
172
177
  - bin/h-tags
178
+ - bin/h-task
173
179
  - bin/h-time
174
180
  - bin/h-title
175
181
  - bin/h-todo
@@ -302,6 +308,7 @@ files:
302
308
  - docs/h-cpr.md
303
309
  - docs/h-db.md
304
310
  - docs/h-file.md
311
+ - docs/h-herdr.md
305
312
  - docs/h-img.md
306
313
  - docs/h-link.md
307
314
  - docs/h-misc.md
@@ -336,7 +343,10 @@ files:
336
343
  - examples/sparse_groups.yml
337
344
  - exe/h
338
345
  - exe/hiiro
346
+ - exe/t
347
+ - exe/tt
339
348
  - h-tmux-plugins.tmux
349
+ - herdr-plugin/herdr-plugin.toml
340
350
  - hiiro.gemspec
341
351
  - lib/hiiro.rb
342
352
  - lib/hiiro/any_struct.rb
@@ -349,8 +359,10 @@ files:
349
359
  - lib/hiiro/capture.rb
350
360
  - lib/hiiro/check_run.rb
351
361
  - lib/hiiro/config.rb
362
+ - lib/hiiro/current_task.rb
352
363
  - lib/hiiro/db.rb
353
364
  - lib/hiiro/effects.rb
365
+ - lib/hiiro/error.rb
354
366
  - lib/hiiro/fuzzyfind.rb
355
367
  - lib/hiiro/git.rb
356
368
  - lib/hiiro/git/branch.rb
@@ -383,8 +395,8 @@ files:
383
395
  - lib/hiiro/service_manager.rb
384
396
  - lib/hiiro/shell.rb
385
397
  - lib/hiiro/tags.rb
398
+ - lib/hiiro/task_cli.rb
386
399
  - lib/hiiro/task_record.rb
387
- - lib/hiiro/task_scope.rb
388
400
  - lib/hiiro/task_sessions.rb
389
401
  - lib/hiiro/tasks.rb
390
402
  - lib/hiiro/todo.rb