hiiro 0.1.263 → 0.1.264
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 +1 -16
- data/bin/h-pr +27 -9
- data/lib/hiiro/queue.rb +35 -17
- data/lib/hiiro/tasks.rb +46 -0
- data/lib/hiiro/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 76687adcde43e2ad6dce4229da650c5be4a9ff7af7fd0868fe500b8baa538dc3
|
|
4
|
+
data.tar.gz: ffa4a2fd4780888a1d77f2db4775fb03f6293780d1cf32ce92b9c2fe594b4bfb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9f7845f577e987676e7943623c4aa926487d3008fe2ed9d286dbcd235ba574bf848deed0bf1cd03234745881e8e768e6a7c9f30fc2772466c657c3fcd66c1179
|
|
7
|
+
data.tar.gz: 3468f5173adb4138320c894485f1cae7540bc03d41df3ff5c089f0e90dedd39a6c1b288772305f83d2d30761f482f4bf0bb3534f0a4c37c392ae5107c83b161a
|
data/CHANGELOG.md
CHANGED
|
@@ -1,16 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [0.1.263] - 2026-03-18
|
|
9
|
-
|
|
10
|
-
### Fixed
|
|
11
|
-
- fix(pr): fix undefined method 'display_pinned' in tags subcommand
|
|
12
|
-
|
|
13
|
-
## [0.1.262] - 2026-03-17
|
|
14
|
-
|
|
15
|
-
### Added
|
|
16
|
-
- Initial release
|
|
1
|
+
Done. The CHANGELOG.md has been updated with v0.1.264 released today (2026-03-18), moving the previously unreleased features into the new version section and creating a fresh [Unreleased] section.
|
data/bin/h-pr
CHANGED
|
@@ -1543,19 +1543,26 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1543
1543
|
|
|
1544
1544
|
add_subcmd(:tags) do
|
|
1545
1545
|
pinned = pinned_manager.load_pinned
|
|
1546
|
-
by_tag = Hash.new { |h, k| h[k] = [] }
|
|
1547
1546
|
|
|
1548
|
-
pinned.
|
|
1549
|
-
|
|
1547
|
+
if pinned.empty?
|
|
1548
|
+
puts "No tracked PRs."
|
|
1549
|
+
next
|
|
1550
1550
|
end
|
|
1551
1551
|
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1552
|
+
by_tag = Hash.new { |h, k| h[k] = [] }
|
|
1553
|
+
untagged = []
|
|
1554
|
+
|
|
1555
|
+
pinned.each do |pr|
|
|
1556
|
+
tags = Array(pr.tags)
|
|
1557
|
+
if tags.empty?
|
|
1558
|
+
untagged << pr
|
|
1559
|
+
else
|
|
1560
|
+
tags.each { |t| by_tag[t] << pr }
|
|
1561
|
+
end
|
|
1555
1562
|
end
|
|
1556
1563
|
|
|
1557
|
-
|
|
1558
|
-
puts
|
|
1564
|
+
render_group = lambda do |label, prs, current_tag|
|
|
1565
|
+
puts label
|
|
1559
1566
|
slot_w = prs.map { |pr| (pr.slot || 1).to_s.length }.max
|
|
1560
1567
|
succ_w = prs.filter_map { |pr| pr.checks&.dig('success')&.to_i&.to_s&.length }.max || 1
|
|
1561
1568
|
total_w = prs.filter_map { |pr| pr.checks&.dig('total')&.to_i&.to_s&.length }.max || 1
|
|
@@ -1563,9 +1570,20 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1563
1570
|
crs_w = prs.map { |pr| [pr.reviews&.dig('changes_requested').to_i.to_s.length, 1].max }.max
|
|
1564
1571
|
widths = { slot: slot_w, succ: succ_w, total: total_w, as: as_w, crs: crs_w }
|
|
1565
1572
|
prs.each_with_index do |pr, idx|
|
|
1566
|
-
|
|
1573
|
+
line = pinned_manager.display_pinned(pr, idx, widths: widths, oneline: true)
|
|
1574
|
+
if current_tag
|
|
1575
|
+
other = Array(pr.tags) - [current_tag]
|
|
1576
|
+
line += " " + other.map { |t| "\e[30;104m#{t}\e[0m" }.join(' ') if other.any?
|
|
1577
|
+
end
|
|
1578
|
+
puts " #{line}"
|
|
1567
1579
|
end
|
|
1568
1580
|
end
|
|
1581
|
+
|
|
1582
|
+
by_tag.sort.each do |tag, prs|
|
|
1583
|
+
render_group.call("\e[30;104m#{tag}\e[0m (#{prs.length})", prs, tag)
|
|
1584
|
+
end
|
|
1585
|
+
|
|
1586
|
+
render_group.call("(untagged) (#{untagged.length})", untagged, nil) if untagged.any?
|
|
1569
1587
|
end
|
|
1570
1588
|
|
|
1571
1589
|
# === Multi-PR action commands (mCMD) ===
|
data/lib/hiiro/queue.rb
CHANGED
|
@@ -232,32 +232,42 @@ class Hiiro
|
|
|
232
232
|
}
|
|
233
233
|
end
|
|
234
234
|
|
|
235
|
-
def
|
|
236
|
-
|
|
237
|
-
return nil unless env
|
|
235
|
+
def select_task_or_session(hiiro)
|
|
236
|
+
mapping = {}
|
|
238
237
|
|
|
239
|
-
|
|
240
|
-
|
|
238
|
+
env = Environment.current rescue nil
|
|
239
|
+
if env
|
|
240
|
+
env.all_tasks.sort_by(&:name).each do |task|
|
|
241
|
+
line = format("task %-25s tree: %s", task.name, task.tree_name || '(none)')
|
|
242
|
+
mapping[line] = { type: :task, task: task }
|
|
243
|
+
end
|
|
244
|
+
end
|
|
241
245
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
246
|
+
sessions = Hiiro::Tmux::Sessions.fetch rescue nil
|
|
247
|
+
if sessions
|
|
248
|
+
sessions.names.sort.each do |name|
|
|
249
|
+
mapping[format("session %s", name)] = { type: :session, name: name }
|
|
250
|
+
end
|
|
245
251
|
end
|
|
246
252
|
|
|
253
|
+
return nil if mapping.empty?
|
|
254
|
+
|
|
247
255
|
hiiro.fuzzyfind_from_map(mapping)
|
|
248
256
|
end
|
|
249
257
|
|
|
250
258
|
def resolve_task_info(opts, hiiro, default_task_info)
|
|
251
|
-
|
|
252
|
-
|
|
259
|
+
if opts.choose
|
|
260
|
+
selection = select_task_or_session(hiiro)
|
|
261
|
+
if selection
|
|
262
|
+
case selection[:type]
|
|
263
|
+
when :task then task_info_for(selection[:task].name)
|
|
264
|
+
when :session then { session_name: selection[:name] }
|
|
265
|
+
end
|
|
266
|
+
else
|
|
267
|
+
default_task_info
|
|
268
|
+
end
|
|
253
269
|
elsif opts.task
|
|
254
|
-
opts.task
|
|
255
|
-
else
|
|
256
|
-
nil
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
if task_name
|
|
260
|
-
task_info_for(task_name)
|
|
270
|
+
task_info_for(opts.task)
|
|
261
271
|
else
|
|
262
272
|
default_task_info
|
|
263
273
|
end
|
|
@@ -653,6 +663,14 @@ class Hiiro
|
|
|
653
663
|
puts "Cleaned #{count} files"
|
|
654
664
|
}
|
|
655
665
|
|
|
666
|
+
h.add_subcmd(:sadd) { |*args|
|
|
667
|
+
exec('h', 'queue', 'add', '-s', *args)
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
h.add_subcmd(:tadd) { |*args|
|
|
671
|
+
exec('h', 'task', 'queue', 'add', *args)
|
|
672
|
+
}
|
|
673
|
+
|
|
656
674
|
h.add_subcmd(:dir) {
|
|
657
675
|
q.queue_dirs
|
|
658
676
|
puts DIR
|
data/lib/hiiro/tasks.rb
CHANGED
|
@@ -194,6 +194,28 @@ class Hiiro
|
|
|
194
194
|
puts "Stopped task '#{task.name}' (worktree available for reuse)"
|
|
195
195
|
end
|
|
196
196
|
|
|
197
|
+
def resume_task(tree, task_name: nil)
|
|
198
|
+
unless tree
|
|
199
|
+
puts "No available worktree selected"
|
|
200
|
+
return
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# Derive a default task name from the tree name: "foo/main" -> "foo"
|
|
204
|
+
task_name ||= tree.name.end_with?('/main') ? tree.name.chomp('/main') : tree.name
|
|
205
|
+
|
|
206
|
+
if task_by_name(task_name)
|
|
207
|
+
puts "Task '#{task_name}' already exists"
|
|
208
|
+
return
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
color_index = Hiiro::TaskColors.next_index(config.tasks.map(&:color_index).compact)
|
|
212
|
+
task = Task.new(name: task_name, tree: tree.name, session: task_name, color_index: color_index)
|
|
213
|
+
config.save_task(task)
|
|
214
|
+
puts "Resumed task '#{task_name}' from worktree '#{tree.name}'"
|
|
215
|
+
|
|
216
|
+
switch_to_task(task)
|
|
217
|
+
end
|
|
218
|
+
|
|
197
219
|
def list(tags_filter: [])
|
|
198
220
|
tag_store = Hiiro::Tags.new(:task)
|
|
199
221
|
items = tasks
|
|
@@ -940,6 +962,30 @@ class Hiiro
|
|
|
940
962
|
tm.stop_task(task)
|
|
941
963
|
end
|
|
942
964
|
|
|
965
|
+
h.add_subcmd(:resume) do |tree_name=nil|
|
|
966
|
+
available = tm.environment.all_trees.reject { |t|
|
|
967
|
+
tm.environment.all_tasks.any? { |task| task.tree_name == t.name }
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
if available.empty?
|
|
971
|
+
puts "No available worktrees to resume"
|
|
972
|
+
next
|
|
973
|
+
end
|
|
974
|
+
|
|
975
|
+
tree = if tree_name
|
|
976
|
+
Hiiro::Matcher.new(available, :name).by_prefix(tree_name).first&.item
|
|
977
|
+
else
|
|
978
|
+
h.fuzzyfind_from_map(available.each_with_object({}) { |t, m| m[t.name] = t })
|
|
979
|
+
end
|
|
980
|
+
|
|
981
|
+
unless tree
|
|
982
|
+
puts tree_name ? "No available worktree matching '#{tree_name}'" : "No worktree selected"
|
|
983
|
+
next
|
|
984
|
+
end
|
|
985
|
+
|
|
986
|
+
tm.resume_task(tree)
|
|
987
|
+
end
|
|
988
|
+
|
|
943
989
|
h.add_subcmd(:edit) do
|
|
944
990
|
h.edit_files(__FILE__)
|
|
945
991
|
end
|
data/lib/hiiro/version.rb
CHANGED