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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 871d2d76f4647e75d54cabf2467f4d96cddb2d93700224c6b1264f19e7dbb5ba
4
- data.tar.gz: 41156d672713bf0fa7e709c9a1880fd4417aa14f6eb0fc090429c656b2806006
3
+ metadata.gz: '09c953336eb16ea65b0e501937a1ce3ca9d478a4290f4e17b01fd357b61c2bcf'
4
+ data.tar.gz: eba72473fabb36214727ef277e8fde1424d3af1660e6f9102fce2079385d07ab
5
5
  SHA512:
6
- metadata.gz: 2aa2489c839aa9229b23d163740070f2b1296fa92f806479f27f090cb133a8b1fbac669bc9f1f48b0745e5886cd873318cb9b4aba24bf322bff1d692f06d08ec
7
- data.tar.gz: 52ee5cfb1594645eb10e25a031cf9ef14b2f156cc341fb6348bbf10856903bc2de418d2f70b06923e18f676fa90bf752dec463cb75a0002edbf474f4045a1773
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: vals.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 needs_refresh?(pr, force: false)
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 |*update_args|
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.refresh_all_status(pinned, force: force)
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 |*green_args|
697
+ add_subcmd(:green) do
816
698
  pinned = pinned_manager.load_pinned
817
- force = green_args.include?('-U') || green_args.include?('--force-update')
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 |*red_args|
717
+ add_subcmd(:red) do
838
718
  pinned = pinned_manager.load_pinned
839
- force = red_args.include?('-U') || red_args.include?('--force-update')
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 |*old_args|
737
+ add_subcmd(:old) do
860
738
  pinned = pinned_manager.load_pinned
861
- force = old_args.include?('-U') || old_args.include?('--force-update')
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
- force = args.include?('-U') || args.include?('--force-update')
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 |*draft_args|
785
+ add_subcmd(:draft) do
911
786
  pinned = pinned_manager.load_pinned
912
- force = draft_args.include?('-U') || draft_args.include?('--force-update')
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
- lines = ['---']
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
- force = args.include?('-U') || args.include?('--force-update')
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
- force = args.include?('-U') || args.include?('--force-update')
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, tasks: true, plugins: [Pins]) do
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.drop_while { |l| l.strip.empty? || l.start_with?('---') || l.match?(/^\w+:/) }.first.to_s.strip)
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
- line = task.display_line(scope: scope, environment: environment)
181
- puts "#{marker} #{line}"
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
- sub_line = st.display_line(scope: :subtask, environment: environment)
188
- puts "#{sub_marker} - #{sub_line}"
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
- task_list = if scope == :subtask
350
- tasks.sort_by(&:short_name)
355
+ names = if scope == :subtask
356
+ tasks.map(&:short_name)
351
357
  else
352
- environment.all_tasks.sort_by(&:name)
358
+ environment.all_tasks.map(&:name)
353
359
  end
354
- return nil if task_list.empty?
360
+ return nil if names.empty?
355
361
 
356
- mapping = task_list.each_with_object({}) do |task, h|
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
- run_system('new-session', '-d', '-A', '-s', session_name)
90
+ new_session(session_name, **opts, detached: true)
91
91
  end
92
92
 
93
93
  if in_tmux?
data/lib/hiiro/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Hiiro
2
- VERSION = "0.1.122"
2
+ VERSION = "0.1.123"
3
3
  end
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@safe_nvim -d \\1 \\2@" | egrep 'cp -'
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@safe_nvim -d \\1 \\2@" | egrep -v 'cp -'
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.122
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: 1980-01-02 00:00:00.000000000 Z
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: 4.0.3
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: []