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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +47 -0
- data/CLAUDE.md +1 -0
- data/README.md +79 -53
- data/bin/h-alias +28 -0
- data/bin/h-bin +20 -0
- data/bin/h-env +25 -0
- data/bin/h-herdr +156 -0
- data/bin/h-task +1 -0
- data/bin/t +1 -0
- data/bin/tt +1 -0
- data/docs/h-bin.md +49 -2
- data/docs/h-herdr.md +41 -0
- data/docs/h-subtask.md +5 -44
- data/docs/h-task.md +18 -712
- data/docs/h.md +2 -2
- data/docs/t.md +89 -376
- data/docs/why-t.md +23 -25
- data/exe/h +1 -0
- data/exe/t +7 -0
- data/exe/tt +7 -0
- data/herdr-plugin/herdr-plugin.toml +47 -0
- data/lib/hiiro/current_task.rb +92 -0
- data/lib/hiiro/error.rb +5 -0
- data/lib/hiiro/git/worktrees.rb +1 -1
- data/lib/hiiro/git.rb +8 -2
- data/lib/hiiro/task_cli.rb +788 -0
- data/lib/hiiro/task_sessions.rb +1 -1
- data/lib/hiiro/tasks.rb +40 -27
- data/lib/hiiro/version.rb +1 -1
- data/lib/hiiro.rb +22 -20
- metadata +14 -2
- data/bin/t +0 -526
- data/bin/tt +0 -20
- data/lib/hiiro/task_scope.rb +0 -92
data/lib/hiiro/task_sessions.rb
CHANGED
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 ||=
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
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
|
-
|
|
1688
|
-
|
|
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
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
|
-
|
|
102
|
-
|
|
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(:
|
|
116
|
-
|
|
117
|
-
|
|
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.
|
|
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
|