hiiro 0.1.105.pre.4 → 0.1.105

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: 7f753fe51f0ca3fa01d0de8d1ddfd9eabbec6584baaa883861f9a04577f5e8ec
4
- data.tar.gz: 826f08700234d1738f8ac1f0b2c5d7ca01bbe4905dd09f9902cb16decdd835a2
3
+ metadata.gz: ed2ec948d47eefe0c380d4d356ff55d7b2542bd40d47b797d93ce75301a2f843
4
+ data.tar.gz: 72df03eb994937c6b77284075711b7c6b8554a71da9f5527013edda8bd2bd55b
5
5
  SHA512:
6
- metadata.gz: 3d2e42fc104c49aaaca08592c50e64f5a33f94de2d0656e347f3605fd6e7982b7d5c38274c177a37c7242c1cd44515c56120131524fd36c4bf418ce0fcefcd8c
7
- data.tar.gz: 00b7a3ab0f2fad460ab0735697b9fb4a34a79466240f2eed0750075a04c447e46977cb2c3cee3c327f5119173675f14b36de33480552c4305df8d642b8c1aa0d
6
+ metadata.gz: 07cc2ba096b090a981b7a01c23813aeb46b3f44f5b8952e1582f05aa89d57a29382085f4fc81ec91d2171a12d7e140fd0014cb1e63c1baafb7a707b31cd4dadc
7
+ data.tar.gz: f778710abfc26fe7d6d89ad688dabe99efae892cad21daa6184d456d48cddb605ffc11c9eadcd9b06758fead837bd9d84cf827555cddbac94e7875a97614edf8
data/exe/h CHANGED
@@ -3,7 +3,7 @@
3
3
  require "hiiro"
4
4
  require "fileutils"
5
5
 
6
- Hiiro.run(*ARGV, cwd: Dir.pwd) do
6
+ Hiiro.run(*ARGV, cwd: Dir.pwd, tasks: true) do
7
7
  add_subcmd(:version) { |*args|
8
8
  puts Hiiro::VERSION
9
9
  }
data/lib/hiiro/queue.rb CHANGED
@@ -114,12 +114,13 @@ class Hiiro
114
114
  # Run claude interactively in tmux window, then cleanup on exit
115
115
  shell_cmd = "cd #{Shellwords.shellescape(working_dir)} && claude #{Shellwords.shellescape(prompt_text)}; HQ_EXIT=$?; #{cleanup_ruby}; exec #{ENV['SHELL'] || 'zsh'}"
116
116
 
117
- system('tmux', 'new-window', '-t', target_session, '-n', name, '-c', working_dir, shell_cmd)
117
+ win_name = short_window_name(name)
118
+ system('tmux', 'new-window', '-d', '-t', target_session, '-n', win_name, '-c', working_dir, shell_cmd)
118
119
 
119
120
  # Write meta sidecar
120
121
  meta = {
121
122
  'tmux_session' => target_session,
122
- 'tmux_window' => name,
123
+ 'tmux_window' => win_name,
123
124
  'started_at' => Time.now.iso8601,
124
125
  'working_dir' => working_dir,
125
126
  }
@@ -130,7 +131,24 @@ class Hiiro
130
131
  end
131
132
  File.write(File.join(dirs[:running], "#{name}.meta"), meta.to_yaml)
132
133
 
133
- puts "Launched: #{name} [#{target_session}]"
134
+ puts "Launched: #{name} [#{target_session}:#{win_name}]"
135
+ end
136
+
137
+ def short_window_name(name)
138
+ base = name[0, 8]
139
+ return base unless existing_window_name?(base)
140
+
141
+ # append digits to make unique
142
+ (2..99).each do |i|
143
+ candidate = "#{base[0, 7]}#{i}"
144
+ return candidate unless existing_window_name?(candidate)
145
+ end
146
+ base
147
+ end
148
+
149
+ def existing_window_name?(wname)
150
+ windows = `tmux list-windows -a -F '#\{window_name\}' 2>/dev/null`.lines(chomp: true)
151
+ windows.include?(wname)
134
152
  end
135
153
 
136
154
  def slugify(text)
@@ -262,7 +280,8 @@ class Hiiro
262
280
  if name
263
281
  meta = q.meta_for(name, :running)
264
282
  session = meta&.[]('tmux_session') || TMUX_SESSION
265
- exec('tmux', 'select-window', '-t', "#{session}:#{name}")
283
+ win = meta&.[]('tmux_window') || name
284
+ exec('tmux', 'select-window', '-t', "#{session}:#{win}")
266
285
  end
267
286
  }
268
287
 
@@ -307,6 +326,65 @@ class Hiiro
307
326
  end
308
327
  }
309
328
 
329
+ h.add_subcmd(:wip) { |name = nil|
330
+ q.queue_dirs
331
+ editor = ENV['EDITOR'] || 'vim'
332
+
333
+ if name.nil?
334
+ existing = q.tasks_in(:wip)
335
+ if existing.any?
336
+ name = h.fuzzyfind(existing)
337
+ next unless name
338
+ else
339
+ puts "No wip tasks. Provide a name to create one."
340
+ next
341
+ end
342
+ end
343
+
344
+ name = name.sub(/\.md$/, '')
345
+ path = File.join(q.queue_dirs[:wip], "#{name}.md")
346
+
347
+ unless File.exist?(path)
348
+ # Pre-fill with frontmatter if task_info available
349
+ if task_info
350
+ fm_lines = ["---"]
351
+ fm_lines << "task_name: #{task_info[:task_name]}" if task_info[:task_name]
352
+ fm_lines << "tree_name: #{task_info[:tree_name]}" if task_info[:tree_name]
353
+ fm_lines << "session_name: #{task_info[:session_name]}" if task_info[:session_name]
354
+ fm_lines << "---"
355
+ fm_lines << ""
356
+ File.write(path, fm_lines.join("\n"))
357
+ end
358
+ end
359
+
360
+ system(editor, path)
361
+ }
362
+
363
+ h.add_subcmd(:ready) { |name = nil|
364
+ wip = q.tasks_in(:wip)
365
+ if wip.empty?
366
+ puts "No wip tasks"
367
+ next
368
+ end
369
+
370
+ if name.nil?
371
+ name = wip.size == 1 ? wip.first : h.fuzzyfind(wip)
372
+ end
373
+
374
+ next unless name
375
+
376
+ name = name.sub(/\.md$/, '')
377
+ src = File.join(q.queue_dirs[:wip], "#{name}.md")
378
+ unless File.exist?(src)
379
+ puts "Wip task not found: #{name}"
380
+ next
381
+ end
382
+
383
+ dst = File.join(q.queue_dirs[:pending], "#{name}.md")
384
+ FileUtils.mv(src, dst)
385
+ puts "Moved to pending: #{name}"
386
+ }
387
+
310
388
  h.add_subcmd(:kill) { |name = nil|
311
389
  running = q.tasks_in(:running)
312
390
  if running.empty?
@@ -322,7 +400,8 @@ class Hiiro
322
400
 
323
401
  meta = q.meta_for(name, :running)
324
402
  session = meta&.[]('tmux_session') || TMUX_SESSION
325
- system('tmux', 'kill-window', '-t', "#{session}:#{name}")
403
+ win = meta&.[]('tmux_window') || name
404
+ system('tmux', 'kill-window', '-t', "#{session}:#{win}")
326
405
 
327
406
  dirs = q.queue_dirs
328
407
  md = File.join(dirs[:running], "#{name}.md")
data/lib/hiiro/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Hiiro
2
- VERSION = "0.1.105.pre.4"
2
+ VERSION = "0.1.105"
3
3
  end
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.105.pre.4
4
+ version: 0.1.105
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Toyota
@@ -164,9 +164,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
164
164
  version: 2.7.0
165
165
  required_rubygems_version: !ruby/object:Gem::Requirement
166
166
  requirements:
167
- - - ">"
167
+ - - ">="
168
168
  - !ruby/object:Gem::Version
169
- version: 1.3.1
169
+ version: '0'
170
170
  requirements: []
171
171
  rubygems_version: 3.3.7
172
172
  signing_key: