hiiro 0.1.122 → 0.1.123
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/bin/h-link +1 -7
- data/bin/h-pr +26 -162
- data/bin/h-session +3 -1
- data/exe/h +0 -29
- data/lib/hiiro/queue.rb +7 -10
- data/lib/hiiro/tasks.rb +18 -30
- data/lib/hiiro/tmux.rb +4 -4
- data/lib/hiiro/version.rb +1 -1
- data/lib/hiiro.rb +2 -2
- data/scripts/compare +2 -2
- metadata +6 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '09c953336eb16ea65b0e501937a1ce3ca9d478a4290f4e17b01fd357b61c2bcf'
|
|
4
|
+
data.tar.gz: eba72473fabb36214727ef277e8fde1424d3af1660e6f9102fce2079385d07ab
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 14063fe4372147c627525a7837a1d825d10d5c7a9d2507497830f02b031bf38cc7c013f974135cf070fac2a6763d65729dfb078ef956d77be77f4744405bc000
|
|
7
|
+
data.tar.gz: a4bcdf2b1d9d6de4ce1df9c86170cd96468a9d609cd09c5b242ea25adcf342e12fd97e159ca96de793a58fd929192cc8b21eb1be2434b6fc85e3318d29046af2
|
data/bin/h-link
CHANGED
|
@@ -7,10 +7,6 @@ require 'pry'
|
|
|
7
7
|
require 'tempfile'
|
|
8
8
|
require "hiiro"
|
|
9
9
|
|
|
10
|
-
opts = Hiiro::Options.setup {
|
|
11
|
-
option(:shorthand, short: :s)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
10
|
class LinkManager
|
|
15
11
|
LINKS_FILE = File.join(Dir.home, '.config/hiiro/links.yml')
|
|
16
12
|
LINK_TEMPLATE = {
|
|
@@ -219,12 +215,10 @@ Hiiro.run(*ARGV, plugins: [Pins], links_file: lm.links_file) do
|
|
|
219
215
|
url = add_args.shift
|
|
220
216
|
description = add_args.join(' ')
|
|
221
217
|
|
|
222
|
-
vals = opts.parse!(add_args)
|
|
223
|
-
|
|
224
218
|
new_link = LinkManager::Link.new(
|
|
225
219
|
url: url,
|
|
226
220
|
description: description,
|
|
227
|
-
shorthand:
|
|
221
|
+
shorthand: nil,
|
|
228
222
|
created_at: Time.now.iso8601
|
|
229
223
|
)
|
|
230
224
|
|
data/bin/h-pr
CHANGED
|
@@ -16,6 +16,16 @@ class PRManager
|
|
|
16
16
|
@hiiro = hiiro
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
+
def help
|
|
20
|
+
puts "Usage: h pr <subcommand> [args]"
|
|
21
|
+
puts
|
|
22
|
+
puts "Subcommands:"
|
|
23
|
+
puts " save [PR_NUMBER] Record PR for this task (auto-detects if omitted)"
|
|
24
|
+
puts " current Show current branch's PR info"
|
|
25
|
+
puts " open [PR_NUMBER] Open PR in browser"
|
|
26
|
+
puts " view [PR_NUMBER] View PR details in terminal"
|
|
27
|
+
end
|
|
28
|
+
|
|
19
29
|
def save(pr_number = nil)
|
|
20
30
|
pr_info = fetch_pr_info(pr_number)
|
|
21
31
|
unless pr_info
|
|
@@ -256,131 +266,7 @@ class PinnedPRManager
|
|
|
256
266
|
(authored_prs + assigned_prs).uniq { |pr| pr['number'] }
|
|
257
267
|
end
|
|
258
268
|
|
|
259
|
-
def
|
|
260
|
-
return true if force
|
|
261
|
-
return true unless pr['last_checked']
|
|
262
|
-
|
|
263
|
-
last_check_time = Time.parse(pr['last_checked']) rescue nil
|
|
264
|
-
return true unless last_check_time
|
|
265
|
-
|
|
266
|
-
# Refresh if last check was more than 2 minutes ago
|
|
267
|
-
(Time.now - last_check_time) > 120
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
def batch_fetch_pr_info(pr_numbers)
|
|
272
|
-
return {} if pr_numbers.empty?
|
|
273
|
-
|
|
274
|
-
# Build GraphQL query to fetch multiple PRs at once
|
|
275
|
-
pr_queries = pr_numbers.map.with_index do |num, idx|
|
|
276
|
-
<<~GRAPHQL.strip
|
|
277
|
-
pr#{idx}: pullRequest(number: #{num}) {
|
|
278
|
-
number
|
|
279
|
-
title
|
|
280
|
-
url
|
|
281
|
-
headRefName
|
|
282
|
-
state
|
|
283
|
-
isDraft
|
|
284
|
-
mergeable
|
|
285
|
-
reviewDecision
|
|
286
|
-
statusCheckRollup {
|
|
287
|
-
contexts {
|
|
288
|
-
... on CheckRun {
|
|
289
|
-
conclusion
|
|
290
|
-
status
|
|
291
|
-
}
|
|
292
|
-
... on StatusContext {
|
|
293
|
-
state
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
reviews(last: 50) {
|
|
298
|
-
nodes {
|
|
299
|
-
author {
|
|
300
|
-
login
|
|
301
|
-
}
|
|
302
|
-
state
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
GRAPHQL
|
|
307
|
-
end
|
|
308
|
-
|
|
309
|
-
query = <<~GRAPHQL
|
|
310
|
-
query {
|
|
311
|
-
repository(owner: "instacart", name: "carrot") {
|
|
312
|
-
#{pr_queries.join("\n")}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
GRAPHQL
|
|
316
|
-
|
|
317
|
-
result = `gh api graphql -f query='#{query.gsub("'", "'\\''")}' 2>/dev/null`
|
|
318
|
-
return {} if result.empty?
|
|
319
|
-
|
|
320
|
-
data = JSON.parse(result)
|
|
321
|
-
repo_data = data.dig('data', 'repository')
|
|
322
|
-
return {} unless repo_data
|
|
323
|
-
|
|
324
|
-
# Convert GraphQL response to hash keyed by PR number
|
|
325
|
-
pr_info_by_number = {}
|
|
326
|
-
pr_numbers.each_with_index do |num, idx|
|
|
327
|
-
pr_data = repo_data["pr#{idx}"]
|
|
328
|
-
next unless pr_data
|
|
329
|
-
|
|
330
|
-
# Transform GraphQL response to match gh pr view format
|
|
331
|
-
pr_info_by_number[num] = {
|
|
332
|
-
'number' => pr_data['number'],
|
|
333
|
-
'title' => pr_data['title'],
|
|
334
|
-
'url' => pr_data['url'],
|
|
335
|
-
'headRefName' => pr_data['headRefName'],
|
|
336
|
-
'state' => pr_data['state'],
|
|
337
|
-
'isDraft' => pr_data['isDraft'],
|
|
338
|
-
'mergeable' => pr_data['mergeable'],
|
|
339
|
-
'reviewDecision' => pr_data['reviewDecision'],
|
|
340
|
-
'statusCheckRollup' => pr_data['statusCheckRollup'],
|
|
341
|
-
'reviews' => pr_data.dig('reviews', 'nodes') || []
|
|
342
|
-
}
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
pr_info_by_number
|
|
346
|
-
rescue JSON::ParserError, StandardError
|
|
347
|
-
{}
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
def refresh_all_status(prs, force: false)
|
|
351
|
-
# Determine which PRs need refreshing
|
|
352
|
-
prs_to_refresh = prs.select { |pr| needs_refresh?(pr, force: force) }
|
|
353
|
-
|
|
354
|
-
if prs_to_refresh.empty?
|
|
355
|
-
puts "All PRs recently checked (within last 2 minutes). Use -U to force update." unless force
|
|
356
|
-
return prs
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
# Batch fetch all PR info at once
|
|
360
|
-
pr_numbers = prs_to_refresh.map { |pr| pr['number'] }
|
|
361
|
-
fetched_info = batch_fetch_pr_info(pr_numbers)
|
|
362
|
-
|
|
363
|
-
# Update each PR with fetched info
|
|
364
|
-
prs_to_refresh.each do |pr|
|
|
365
|
-
info = fetched_info[pr['number']]
|
|
366
|
-
next unless info
|
|
367
|
-
|
|
368
|
-
pr['state'] = info['state']
|
|
369
|
-
pr['title'] = info['title']
|
|
370
|
-
pr['checks'] = summarize_checks(info['statusCheckRollup'])
|
|
371
|
-
pr['reviews'] = summarize_reviews(info['reviews'])
|
|
372
|
-
pr['review_decision'] = info['reviewDecision']
|
|
373
|
-
pr['is_draft'] = info['isDraft']
|
|
374
|
-
pr['mergeable'] = info['mergeable']
|
|
375
|
-
pr['last_checked'] = Time.now.iso8601
|
|
376
|
-
end
|
|
377
|
-
|
|
378
|
-
prs
|
|
379
|
-
end
|
|
380
|
-
|
|
381
|
-
def refresh_status(pr, force: false)
|
|
382
|
-
return pr unless needs_refresh?(pr, force: force)
|
|
383
|
-
|
|
269
|
+
def refresh_status(pr)
|
|
384
270
|
info = fetch_pr_info(pr['number'])
|
|
385
271
|
return pr unless info
|
|
386
272
|
|
|
@@ -775,14 +661,12 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
775
661
|
end
|
|
776
662
|
|
|
777
663
|
compact = status_args.include?('-c') || status_args.include?('--compact')
|
|
778
|
-
force = status_args.include?('-U') || status_args.include?('--force-update')
|
|
779
664
|
|
|
780
665
|
puts "Refreshing status for #{pinned.length} pinned PR(s)..."
|
|
781
666
|
puts
|
|
782
667
|
|
|
783
|
-
pinned_manager.refresh_all_status(pinned, force: force)
|
|
784
|
-
|
|
785
668
|
pinned.each_with_index do |pr, idx|
|
|
669
|
+
pinned_manager.refresh_status(pr)
|
|
786
670
|
if compact
|
|
787
671
|
puts pinned_manager.display_pinned(pr, idx)
|
|
788
672
|
else
|
|
@@ -796,7 +680,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
796
680
|
puts "Status updated at #{Time.now.strftime('%H:%M:%S')}"
|
|
797
681
|
end
|
|
798
682
|
|
|
799
|
-
add_subcmd(:update) do
|
|
683
|
+
add_subcmd(:update) do
|
|
800
684
|
pinned = pinned_manager.load_pinned
|
|
801
685
|
|
|
802
686
|
if pinned.empty?
|
|
@@ -804,19 +688,15 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
804
688
|
next
|
|
805
689
|
end
|
|
806
690
|
|
|
807
|
-
force = update_args.include?('-U') || update_args.include?('--force-update')
|
|
808
|
-
|
|
809
691
|
puts "Updating status for #{pinned.length} PR(s)..."
|
|
810
|
-
pinned_manager.
|
|
692
|
+
pinned.each { |pr| pinned_manager.refresh_status(pr) }
|
|
811
693
|
pinned_manager.save_pinned(pinned)
|
|
812
694
|
puts "Done."
|
|
813
695
|
end
|
|
814
696
|
|
|
815
|
-
add_subcmd(:green) do
|
|
697
|
+
add_subcmd(:green) do
|
|
816
698
|
pinned = pinned_manager.load_pinned
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
pinned_manager.refresh_all_status(pinned, force: force)
|
|
699
|
+
pinned.each { |pr| pinned_manager.refresh_status(pr) }
|
|
820
700
|
pinned_manager.save_pinned(pinned)
|
|
821
701
|
|
|
822
702
|
filtered = pinned.select { |pr|
|
|
@@ -834,11 +714,9 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
834
714
|
filtered.each_with_index { |pr, i| puts pinned_manager.display_pinned(pr, i) }
|
|
835
715
|
end
|
|
836
716
|
|
|
837
|
-
add_subcmd(:red) do
|
|
717
|
+
add_subcmd(:red) do
|
|
838
718
|
pinned = pinned_manager.load_pinned
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
pinned_manager.refresh_all_status(pinned, force: force)
|
|
719
|
+
pinned.each { |pr| pinned_manager.refresh_status(pr) }
|
|
842
720
|
pinned_manager.save_pinned(pinned)
|
|
843
721
|
|
|
844
722
|
filtered = pinned.select { |pr|
|
|
@@ -856,11 +734,9 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
856
734
|
filtered.each_with_index { |pr, i| puts pinned_manager.display_pinned(pr, i) }
|
|
857
735
|
end
|
|
858
736
|
|
|
859
|
-
add_subcmd(:old) do
|
|
737
|
+
add_subcmd(:old) do
|
|
860
738
|
pinned = pinned_manager.load_pinned
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
pinned_manager.refresh_all_status(pinned, force: force)
|
|
739
|
+
pinned.each { |pr| pinned_manager.refresh_status(pr) }
|
|
864
740
|
pinned_manager.save_pinned(pinned)
|
|
865
741
|
|
|
866
742
|
filtered = pinned.select { |pr| pr['state'] == 'MERGED' }
|
|
@@ -884,8 +760,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
884
760
|
next
|
|
885
761
|
end
|
|
886
762
|
|
|
887
|
-
|
|
888
|
-
pinned_manager.refresh_all_status(pinned, force: force)
|
|
763
|
+
pinned.each { |pr| pinned_manager.refresh_status(pr) }
|
|
889
764
|
|
|
890
765
|
merged_or_closed = pinned.select { |pr| pr['state'] == 'MERGED' || pr['state'] == 'CLOSED' }
|
|
891
766
|
|
|
@@ -907,11 +782,9 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
907
782
|
puts "Done. #{pinned_manager.load_pinned.length} PR(s) still tracked."
|
|
908
783
|
end
|
|
909
784
|
|
|
910
|
-
add_subcmd(:draft) do
|
|
785
|
+
add_subcmd(:draft) do
|
|
911
786
|
pinned = pinned_manager.load_pinned
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
pinned_manager.refresh_all_status(pinned, force: force)
|
|
787
|
+
pinned.each { |pr| pinned_manager.refresh_status(pr) }
|
|
915
788
|
pinned_manager.save_pinned(pinned)
|
|
916
789
|
|
|
917
790
|
filtered = pinned.select { |pr| pr['is_draft'] == true }
|
|
@@ -954,14 +827,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
954
827
|
missing_numbers = missing.map { |pr| pr['number'] }
|
|
955
828
|
|
|
956
829
|
tmpfile = Tempfile.new(['missing-prs-', '.yml'])
|
|
957
|
-
|
|
958
|
-
missing.each do |pr|
|
|
959
|
-
lines << ''
|
|
960
|
-
lines << "# [#{pr['headRefName']}] #{pr['title']}"
|
|
961
|
-
lines << "# url: #{pr['url']}"
|
|
962
|
-
lines << "- #{pr['number']}"
|
|
963
|
-
end
|
|
964
|
-
tmpfile.write(lines.join("\n"))
|
|
830
|
+
tmpfile.write(missing_numbers.to_yaml)
|
|
965
831
|
tmpfile.close
|
|
966
832
|
|
|
967
833
|
system(ENV['EDITOR'] || 'nvim', tmpfile.path)
|
|
@@ -1078,8 +944,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1078
944
|
end
|
|
1079
945
|
|
|
1080
946
|
# Refresh all statuses first
|
|
1081
|
-
|
|
1082
|
-
pinned_manager.refresh_all_status(pinned, force: force)
|
|
947
|
+
pinned.each { |pr| pinned_manager.refresh_status(pr) }
|
|
1083
948
|
pinned_manager.save_pinned(pinned)
|
|
1084
949
|
|
|
1085
950
|
merged = pinned.select { |pr| pr['state'] == 'MERGED' }
|
|
@@ -1110,8 +975,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1110
975
|
end
|
|
1111
976
|
|
|
1112
977
|
# Refresh all statuses first
|
|
1113
|
-
|
|
1114
|
-
pinned_manager.refresh_all_status(pinned, force: force)
|
|
978
|
+
pinned.each { |pr| pinned_manager.refresh_status(pr) }
|
|
1115
979
|
|
|
1116
980
|
merged_or_closed = pinned.select { |pr| pr['state'] == 'MERGED' || pr['state'] == 'CLOSED' }
|
|
1117
981
|
|
data/bin/h-session
CHANGED
|
@@ -4,7 +4,7 @@ require 'hiiro'
|
|
|
4
4
|
require 'tempfile'
|
|
5
5
|
require 'yaml'
|
|
6
6
|
|
|
7
|
-
Hiiro.run(*ARGV,
|
|
7
|
+
Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
8
8
|
tmux = tmux_client
|
|
9
9
|
|
|
10
10
|
add_subcmd(:ls, :list) { |*args|
|
|
@@ -130,6 +130,7 @@ Hiiro.run(*ARGV, tasks: true, plugins: [Pins]) do
|
|
|
130
130
|
end
|
|
131
131
|
|
|
132
132
|
add_subcmd(:orphans) do
|
|
133
|
+
env = Environment.current
|
|
133
134
|
task_session_names = env.all_tasks.map(&:session_name)
|
|
134
135
|
orphans = env.all_sessions.reject { |s| task_session_names.include?(s.name) }
|
|
135
136
|
|
|
@@ -143,6 +144,7 @@ Hiiro.run(*ARGV, tasks: true, plugins: [Pins]) do
|
|
|
143
144
|
end
|
|
144
145
|
|
|
145
146
|
add_subcmd(:okill) do
|
|
147
|
+
env = Environment.current
|
|
146
148
|
task_session_names = env.all_tasks.map(&:session_name)
|
|
147
149
|
orphans = env.all_sessions.reject { |s| task_session_names.include?(s.name) }
|
|
148
150
|
|
data/exe/h
CHANGED
|
@@ -3,20 +3,6 @@
|
|
|
3
3
|
require "hiiro"
|
|
4
4
|
require "fileutils"
|
|
5
5
|
|
|
6
|
-
def update_hiiro
|
|
7
|
-
if `gem list hiiro`.strip.empty?
|
|
8
|
-
system('gem', 'install', 'hiiro')
|
|
9
|
-
else
|
|
10
|
-
system('gem', 'update', 'hiiro')
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
system('h', 'setup')
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def rbenv_versions
|
|
17
|
-
versions = `rbenv versions --bare`.lines(chomp: true)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
6
|
Hiiro.run(*ARGV, cwd: Dir.pwd, tasks: true) do
|
|
21
7
|
add_subcmd(:version) { |*args|
|
|
22
8
|
puts Hiiro::VERSION
|
|
@@ -26,21 +12,6 @@ Hiiro.run(*ARGV, cwd: Dir.pwd, tasks: true) do
|
|
|
26
12
|
puts "pong"
|
|
27
13
|
}
|
|
28
14
|
|
|
29
|
-
add_subcmd(:install) { |*args|
|
|
30
|
-
opts = Hiiro::Options.setup {
|
|
31
|
-
flag(:all, short: :a)
|
|
32
|
-
}.parse!(ARGV)
|
|
33
|
-
|
|
34
|
-
if opts.all
|
|
35
|
-
rbenv_versions.each do |ver|
|
|
36
|
-
ENV['RBENV_VERSION'] = ver
|
|
37
|
-
update_hiiro
|
|
38
|
-
end
|
|
39
|
-
else
|
|
40
|
-
update_hiiro
|
|
41
|
-
end
|
|
42
|
-
}
|
|
43
|
-
|
|
44
15
|
add_subcmd(:setup) do |*args|
|
|
45
16
|
# Detect how the command was invoked to determine prefix
|
|
46
17
|
invoked_as = File.basename($0)
|
data/lib/hiiro/queue.rb
CHANGED
|
@@ -3,7 +3,6 @@ require 'fileutils'
|
|
|
3
3
|
require 'shellwords'
|
|
4
4
|
require 'time'
|
|
5
5
|
require 'front_matter_parser'
|
|
6
|
-
require 'tempfile'
|
|
7
6
|
|
|
8
7
|
class Hiiro
|
|
9
8
|
class Queue
|
|
@@ -178,7 +177,7 @@ class Hiiro
|
|
|
178
177
|
return nil unless task
|
|
179
178
|
|
|
180
179
|
{
|
|
181
|
-
task_name: task.name,
|
|
180
|
+
task_name: task.subtask? ? task.parent_name : task.name,
|
|
182
181
|
tree_name: task.tree_name,
|
|
183
182
|
session_name: task.session_name,
|
|
184
183
|
}
|
|
@@ -236,11 +235,8 @@ class Hiiro
|
|
|
236
235
|
end
|
|
237
236
|
end
|
|
238
237
|
|
|
239
|
-
name = slugify(content.lines.
|
|
240
|
-
|
|
241
|
-
if name.empty?
|
|
242
|
-
name = Time.now.strftime("%Y%m%d%H%M%S") + '-' + task_info[:task_name]
|
|
243
|
-
end
|
|
238
|
+
name = slugify(content.lines.reject { |l| l.start_with?('---') || l.match?(/^\w+:/) }.first.to_s.strip)
|
|
239
|
+
return nil if name.empty?
|
|
244
240
|
|
|
245
241
|
base_name = name
|
|
246
242
|
counter = 1
|
|
@@ -398,13 +394,14 @@ class Hiiro
|
|
|
398
394
|
args, flag_task = q.extract_task_flag(args)
|
|
399
395
|
ti = flag_task ? q.task_info_for(flag_task) : task_info
|
|
400
396
|
|
|
401
|
-
tmpfile = Tempfile.new(['hq-', '.md'])
|
|
402
|
-
prompt_file = tmpfile.path
|
|
403
397
|
if args.empty? && !$stdin.tty?
|
|
404
398
|
content = $stdin.read.strip
|
|
405
399
|
elsif args.any?
|
|
406
400
|
content = args.join(' ')
|
|
407
401
|
else
|
|
402
|
+
require 'tempfile'
|
|
403
|
+
tmpfile = Tempfile.new(['hq-', '.md'])
|
|
404
|
+
|
|
408
405
|
# Pre-fill with frontmatter template if task_info is available
|
|
409
406
|
if ti
|
|
410
407
|
fm_lines = ["---"]
|
|
@@ -427,7 +424,7 @@ class Hiiro
|
|
|
427
424
|
end
|
|
428
425
|
end
|
|
429
426
|
|
|
430
|
-
result = q.add_with_frontmatter(content)
|
|
427
|
+
result = q.add_with_frontmatter(content, task_info: ti)
|
|
431
428
|
if result
|
|
432
429
|
puts "Created: #{result[:path]}"
|
|
433
430
|
else
|
data/lib/hiiro/tasks.rb
CHANGED
|
@@ -177,15 +177,21 @@ class Hiiro
|
|
|
177
177
|
|
|
178
178
|
items.each do |task|
|
|
179
179
|
marker = (current && current.name == task.name) ? "*" : " "
|
|
180
|
-
|
|
181
|
-
|
|
180
|
+
tree = environment.find_tree(task.tree_name)
|
|
181
|
+
branch = tree&.branch || (tree&.detached? ? '(detached)' : nil)
|
|
182
|
+
branch_str = branch ? " [#{branch}]" : ""
|
|
183
|
+
|
|
184
|
+
display_name = scope == :subtask ? task.short_name : task.name
|
|
185
|
+
puts format("%s %-25s tree: %-20s%s", marker, display_name, task.tree_name || '(none)', branch_str)
|
|
182
186
|
|
|
183
187
|
if scope == :task
|
|
184
188
|
subs = subtasks(task)
|
|
185
189
|
subs.each do |st|
|
|
186
190
|
sub_marker = (current && current.name == st.name) ? "*" : " "
|
|
187
|
-
|
|
188
|
-
|
|
191
|
+
sub_tree = environment.find_tree(st.tree_name)
|
|
192
|
+
sub_branch = sub_tree&.branch || (sub_tree&.detached? ? '(detached)' : nil)
|
|
193
|
+
sub_branch_str = sub_branch ? " [#{sub_branch}]" : ""
|
|
194
|
+
puts format("%s - %-23s tree: %-20s%s", sub_marker, st.short_name, st.tree_name || '(none)', sub_branch_str)
|
|
189
195
|
end
|
|
190
196
|
end
|
|
191
197
|
end
|
|
@@ -346,20 +352,14 @@ class Hiiro
|
|
|
346
352
|
# --- Interactive selection with sk ---
|
|
347
353
|
|
|
348
354
|
def select_task_interactive(prompt = nil)
|
|
349
|
-
|
|
350
|
-
tasks.
|
|
355
|
+
names = if scope == :subtask
|
|
356
|
+
tasks.map(&:short_name)
|
|
351
357
|
else
|
|
352
|
-
environment.all_tasks.
|
|
358
|
+
environment.all_tasks.map(&:name)
|
|
353
359
|
end
|
|
354
|
-
return nil if
|
|
360
|
+
return nil if names.empty?
|
|
355
361
|
|
|
356
|
-
|
|
357
|
-
display_name = scope == :subtask ? task.short_name : task.name
|
|
358
|
-
line = task.display_line(scope: scope, environment: environment)
|
|
359
|
-
h[line] = display_name
|
|
360
|
-
end
|
|
361
|
-
|
|
362
|
-
hiiro.fuzzyfind_from_map(mapping)
|
|
362
|
+
hiiro.fuzzyfind(names.sort)
|
|
363
363
|
end
|
|
364
364
|
|
|
365
365
|
def value_for_task(task_name = nil, &block)
|
|
@@ -645,7 +645,8 @@ class Hiiro
|
|
|
645
645
|
|
|
646
646
|
task_info = if task
|
|
647
647
|
{
|
|
648
|
-
task_name: task.name,
|
|
648
|
+
task_name: task.subtask? ? task.parent_name : task.name,
|
|
649
|
+
subtask_name: task.subtask? ? task.short_name : nil,
|
|
649
650
|
tree: task.tree_name,
|
|
650
651
|
branch: task.branch,
|
|
651
652
|
session: task.session_name
|
|
@@ -760,7 +761,7 @@ class Hiiro
|
|
|
760
761
|
task = tm.current_task
|
|
761
762
|
task_info = if task
|
|
762
763
|
{
|
|
763
|
-
task_name: task.name,
|
|
764
|
+
task_name: task.subtask? ? task.parent_name : task.name,
|
|
764
765
|
tree_name: task.tree_name,
|
|
765
766
|
session_name: task.session_name
|
|
766
767
|
}
|
|
@@ -893,19 +894,6 @@ class Hiiro
|
|
|
893
894
|
h[:session] = session_name if session_name != name
|
|
894
895
|
h
|
|
895
896
|
end
|
|
896
|
-
|
|
897
|
-
def display_line(scope: :task, environment:)
|
|
898
|
-
display_name = (scope == :subtask) ? short_name : name
|
|
899
|
-
tree = environment.find_tree(tree_name)
|
|
900
|
-
branch = tree&.branch || (tree&.detached? ? '(detached)' : '(none)')
|
|
901
|
-
session = session_name || '(none)'
|
|
902
|
-
|
|
903
|
-
format("%-25s tree: %-20s branch: %-20s session: %s",
|
|
904
|
-
display_name,
|
|
905
|
-
tree_name || '(none)',
|
|
906
|
-
branch,
|
|
907
|
-
session)
|
|
908
|
-
end
|
|
909
897
|
end
|
|
910
898
|
|
|
911
899
|
class App
|
data/lib/hiiro/tmux.rb
CHANGED
|
@@ -23,8 +23,8 @@ class Hiiro
|
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
def self.open_session(name)
|
|
27
|
-
client.open_session(name)
|
|
26
|
+
def self.open_session(name, **opts)
|
|
27
|
+
client.open_session(name, **opts)
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
attr_reader :hiiro
|
|
@@ -83,11 +83,11 @@ class Hiiro
|
|
|
83
83
|
run_success?('has-session', '-t', name)
|
|
84
84
|
end
|
|
85
85
|
|
|
86
|
-
def open_session(name)
|
|
86
|
+
def open_session(name, **opts)
|
|
87
87
|
session_name = name.to_s
|
|
88
88
|
|
|
89
89
|
unless session_exists?(session_name)
|
|
90
|
-
|
|
90
|
+
new_session(session_name, **opts, detached: true)
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
if in_tmux?
|
data/lib/hiiro/version.rb
CHANGED
data/lib/hiiro.rb
CHANGED
|
@@ -136,8 +136,8 @@ class Hiiro
|
|
|
136
136
|
@tmux_client ||= Tmux.client!(self)
|
|
137
137
|
end
|
|
138
138
|
|
|
139
|
-
def start_tmux_session(name)
|
|
140
|
-
tmux_client.open_session(name)
|
|
139
|
+
def start_tmux_session(name, **opts)
|
|
140
|
+
tmux_client.open_session(name, **opts)
|
|
141
141
|
end
|
|
142
142
|
|
|
143
143
|
def make_child(custom_subcmd=nil, custom_args=nil, **kwargs, &block)
|
data/scripts/compare
CHANGED
|
@@ -8,7 +8,7 @@ diff_dirs() {
|
|
|
8
8
|
|
|
9
9
|
# s@Only in \(bin|plugins\): \(.*\)@cp -v \1/\2 $HOME/\1/@;
|
|
10
10
|
|
|
11
|
-
diff_dirs | sed -E "s@Only in @@;s@: @/@;s@^(/.*(bin|plugins).*)@cp -v \\1 \\2/@;s@^(bin.*)@cp -v \\1 $HOME/bin/@;s@^(plugins.*)@cp -v \\1 $HOME/.config/hiiro/plugins/@;s@Files (.*) and (.*) differ@
|
|
11
|
+
diff_dirs | sed -E "s@Only in @@;s@: @/@;s@^(/.*(bin|plugins).*)@cp -v \\1 \\2/@;s@^(bin.*)@cp -v \\1 $HOME/bin/@;s@^(plugins.*)@cp -v \\1 $HOME/.config/hiiro/plugins/@;s@Files (.*) and (.*) differ@vim -d \\1 \\2@" | egrep 'cp -'
|
|
12
12
|
|
|
13
|
-
diff_dirs | sed -E "s@Only in @@;s@: @/@;s@^(/.*(bin|plugins).*)@cp -v \\1 \\2/@;s@^(bin.*)@cp -v \\1 $HOME/bin/@;s@^(plugins.*)@cp -v \\1 $HOME/.config/hiiro/plugins/@;s@Files (.*) and (.*) differ@
|
|
13
|
+
diff_dirs | sed -E "s@Only in @@;s@: @/@;s@^(/.*(bin|plugins).*)@cp -v \\1 \\2/@;s@^(bin.*)@cp -v \\1 $HOME/bin/@;s@^(plugins.*)@cp -v \\1 $HOME/.config/hiiro/plugins/@;s@Files (.*) and (.*) differ@vim -d \\1 \\2@" | egrep -v 'cp -'
|
|
14
14
|
|
metadata
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
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.123
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Joshua Toyota
|
|
8
|
+
autorequire:
|
|
8
9
|
bindir: exe
|
|
9
10
|
cert_chain: []
|
|
10
|
-
date:
|
|
11
|
+
date: 2026-02-28 00:00:00.000000000 Z
|
|
11
12
|
dependencies:
|
|
12
13
|
- !ruby/object:Gem::Dependency
|
|
13
14
|
name: pry
|
|
@@ -152,6 +153,7 @@ metadata:
|
|
|
152
153
|
homepage_uri: https://github.com/unixsuperhero/hiiro
|
|
153
154
|
source_code_uri: https://github.com/unixsuperhero/hiiro
|
|
154
155
|
changelog_uri: https://github.com/unixsuperhero/hiiro/blob/main/CHANGELOG.md
|
|
156
|
+
post_install_message:
|
|
155
157
|
rdoc_options: []
|
|
156
158
|
require_paths:
|
|
157
159
|
- lib
|
|
@@ -166,7 +168,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
166
168
|
- !ruby/object:Gem::Version
|
|
167
169
|
version: '0'
|
|
168
170
|
requirements: []
|
|
169
|
-
rubygems_version:
|
|
171
|
+
rubygems_version: 3.3.7
|
|
172
|
+
signing_key:
|
|
170
173
|
specification_version: 4
|
|
171
174
|
summary: A lightweight CLI framework for Ruby
|
|
172
175
|
test_files: []
|