hiiro 0.1.359 → 0.1.361

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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/README.md +24 -17
  4. data/bin/h-app +4 -6
  5. data/bin/h-bg +4 -9
  6. data/bin/h-branch +21 -21
  7. data/bin/h-claude +6 -6
  8. data/bin/h-config +2 -2
  9. data/bin/h-notify +92 -257
  10. data/bin/h-pane +96 -137
  11. data/bin/h-pr +16 -10
  12. data/bin/h-project +7 -19
  13. data/bin/h-session +52 -106
  14. data/bin/h-title +12 -44
  15. data/bin/h-window +24 -135
  16. data/bin/h-wtree +2 -2
  17. data/docs/README.md +10 -13
  18. data/docs/docker-testing-guide.md +6 -7
  19. data/docs/h-app.md +2 -2
  20. data/docs/h-bg.md +11 -59
  21. data/docs/h-branch.md +3 -4
  22. data/docs/h-claude.md +25 -25
  23. data/docs/h-config.md +4 -5
  24. data/docs/h-notify.md +33 -106
  25. data/docs/h-pane.md +36 -148
  26. data/docs/h-pr.md +2 -3
  27. data/docs/h-project.md +3 -3
  28. data/docs/h-queue.md +24 -24
  29. data/docs/h-service.md +8 -8
  30. data/docs/h-session.md +29 -126
  31. data/docs/h-subtask.md +3 -3
  32. data/docs/h-task.md +16 -28
  33. data/docs/h-title.md +5 -25
  34. data/docs/h-window.md +19 -118
  35. data/docs/h-wtree.md +3 -4
  36. data/docs/h.md +10 -12
  37. data/exe/h +1 -3
  38. data/lib/hiiro/background.rb +17 -14
  39. data/lib/hiiro/branch.rb +24 -3
  40. data/lib/hiiro/db.rb +4 -1
  41. data/lib/hiiro/effects.rb +2 -2
  42. data/lib/hiiro/git/pr.rb +13 -6
  43. data/lib/hiiro/herdr.rb +610 -0
  44. data/lib/hiiro/invocation.rb +16 -19
  45. data/lib/hiiro/pinned_pr.rb +16 -3
  46. data/lib/hiiro/pinned_pr_manager.rb +1 -1
  47. data/lib/hiiro/queue.rb +93 -74
  48. data/lib/hiiro/service_manager.rb +54 -80
  49. data/lib/hiiro/tasks.rb +53 -91
  50. data/lib/hiiro/version.rb +1 -1
  51. data/lib/hiiro.rb +5 -6
  52. data/merge +47 -0
  53. data/plugins/notify.rb +2 -7
  54. data/plugins/project.rb +2 -2
  55. metadata +6 -21
  56. data/bin/h-buffer +0 -123
  57. data/bin/h-jumplist +0 -287
  58. data/docs/h-buffer.md +0 -133
  59. data/docs/h-jumplist.md +0 -111
  60. data/lib/hiiro/task_colors.rb +0 -38
  61. data/lib/hiiro/tmux/buffer.rb +0 -63
  62. data/lib/hiiro/tmux/buffers.rb +0 -58
  63. data/lib/hiiro/tmux/pane.rb +0 -122
  64. data/lib/hiiro/tmux/panes.rb +0 -81
  65. data/lib/hiiro/tmux/session.rb +0 -112
  66. data/lib/hiiro/tmux/sessions.rb +0 -61
  67. data/lib/hiiro/tmux/window.rb +0 -94
  68. data/lib/hiiro/tmux/windows.rb +0 -73
  69. data/lib/hiiro/tmux.rb +0 -384
  70. /data/{.ruby-version → bkup..ruby-version} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c336f9c4c1b59833aa907d1168d66dd055edccfc80e707eae1c6193eb99c303b
4
- data.tar.gz: a98470507032d423c49dd4f8f8fd7e90eb23824933c5b2bfe2a3278d734cde1e
3
+ metadata.gz: e1a1f6f0db99f2573bda6b2c6e8746e49464a4079d40534b6367aa5c888d4557
4
+ data.tar.gz: f805de24c6a10db384b4bbb5141edc8d9f0511d9b07cf8c81c4ada064cb6d50e
5
5
  SHA512:
6
- metadata.gz: '08212298421522b4cfa442573451106dc3f539395773e7446bf99e30980b69bc9f30e1b369ed56c33a5fce1957d068720cb3a5231fd6360a00d6b75334b88f6b'
7
- data.tar.gz: 64f95314c15015105b3445bc8c5ce9671be9c81ad7626d0ef30b6a120b6ede06904fa2c0161b1d336fa4380db79520e913b0cae311bc3b1e4860ee723ce0d305
6
+ metadata.gz: 5008e27fbd04a84a473fd12f81d41d758a8e147d2455abb69d33417741feabf5d2605a7697e3b462f56b121b627c46d9bbaeb067663be39a605e70a4ae9592e9
7
+ data.tar.gz: 15ac3b8449da827b76e5bbf68fac2e40dfe468526cef493e14d9887e32ad1a0a5f04830f260b82ee9adfc55d7df67d6272c54cbb11406c0a2881bc751ce04df4
data/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ### Added
6
+ - Add `Hiiro::Herdr`, a JSON-backed adapter for Herdr workspaces, tabs, panes, notifications, and command execution.
7
+ - Persist Herdr workspace/tab/pane IDs for invocations, branches, queued prompts, services, and tracked PRs, with read fallbacks for legacy metadata.
8
+
9
+ ### Changed
10
+ - Move task, project, queue, service, background, Claude, app navigation, PR attach, title, and notification workflows from tmux to Herdr.
11
+ - Keep `h session` and `h window` as compatibility commands for Herdr workspaces and tabs.
12
+
13
+ ### Removed
14
+ - Remove tmux paste-buffer, jumplist, task-color, focus-hook, and arbitrary-layout features that Herdr 0.8.2 does not support.
15
+ - Remove the old `Hiiro::Tmux` adapter and tmux-specific command tests.
16
+
5
17
  ### Fixed
6
18
  - Restore the missing `Hiiro::Bins` helper so `require "hiiro"` boots and commands like `h jumplist record` dispatch correctly.
7
19
  - Make Hiiro's Ruby requirement explicit as Ruby 3.2+ and have rbenv-wide gem installs skip incompatible Ruby versions.
data/README.md CHANGED
@@ -27,7 +27,7 @@ h setup
27
27
 
28
28
  This installs:
29
29
  - Plugins to `~/.config/hiiro/plugins/`
30
- - Subcommands (`h-buffer`, `h-todo`, etc.) to `~/bin/`
30
+ - Subcommands (`h-pane`, `h-todo`, etc.) to `~/bin/`
31
31
 
32
32
  Ensure `~/bin` is in your `$PATH`.
33
33
 
@@ -35,9 +35,12 @@ Ensure `~/bin` is in your `$PATH`.
35
35
  ### Dependencies
36
36
 
37
37
  ```sh
38
- # For notify plugin (macOS)
38
+ # For h alert (macOS)
39
39
  brew install terminal-notifier
40
40
 
41
+ # Terminal workspace, tab, and pane management
42
+ # Install Herdr 0.8.2 or newer.
43
+
41
44
  # For fuzzy-finder
42
45
  brew install sk # (or fzf)
43
46
 
@@ -76,24 +79,22 @@ h ping
76
79
  |---------|-------------|
77
80
  | `h app` | Manage app directories within tasks/projects |
78
81
  | `h branch` | Git branch management with fuzzy selection and copy |
79
- | `h buffer` | Tmux paste buffer management |
80
- | `h claude` | Claude CLI wrapper with tmux split support |
82
+ | `h claude` | Claude CLI wrapper with Herdr split support |
81
83
  | `h commit` | Select commits using fuzzy finder |
82
- | `h config` | Open config files (vim, git, tmux, zsh, starship, claude) |
84
+ | `h config` | Open config files (vim, git, Herdr, zsh, starship, claude) |
83
85
  | `h link` | Manage saved links with URL, description, and shorthand |
84
- | `h pane` | Tmux pane management |
86
+ | `h pane` | Herdr pane management |
85
87
  | `h plugin` | Manage hiiro plugins (list, edit, search) |
86
88
  | `h pr` | GitHub PR management via gh CLI |
87
- | `h project` | Project navigation with tmux session management |
88
- | `h queue` | Claude prompt queue with tmux-based task execution |
89
- | `h jumplist` | Vim-style tmux navigation history (back/forward through panes) |
89
+ | `h project` | Project navigation with Herdr workspace management |
90
+ | `h queue` | Claude prompt queue with Herdr-based task execution |
90
91
  | `h service` | Manage background dev services with env variations and groups |
91
92
  | `h file` | Track and open frequently-used files per app |
92
93
  | `h run` | Run dev tools (lint/test/format) against changed files |
93
- | `h session` | Tmux session management |
94
+ | `h session` | Compatibility commands for Herdr workspaces |
94
95
  | `h sha` | Extract short SHA from git log |
95
96
  | `h todo` | Todo list management with tags and task association |
96
- | `h window` | Tmux window management |
97
+ | `h window` | Compatibility commands for Herdr tabs |
97
98
  | `h wtree` | Git worktree management |
98
99
 
99
100
  `h claude agents|commands|skills -a` prints the absolute file path for each matching `.claude` tool, including `SKILL.md` for skills.
@@ -103,7 +104,6 @@ h ping
103
104
  Any subcommand can be abbreviated as long as the prefix uniquely matches:
104
105
 
105
106
  ```sh
106
- h buf ls # matches h buffer ls
107
107
  h ses ls # matches h session ls
108
108
  h win # matches h window
109
109
  ```
@@ -117,9 +117,9 @@ Plugins are Ruby modules loaded from `~/.config/hiiro/plugins/`:
117
117
  | Plugin | Description |
118
118
  |--------|-------------|
119
119
  | Pins | Per-command YAML key-value storage |
120
- | Project | Project directory navigation with tmux session management |
120
+ | Project | Project directory navigation with Herdr workspace management |
121
121
  | Tasks | Task lifecycle management across git worktrees with external-worktree registration and subtask support |
122
- | Notify | macOS desktop notifications via terminal-notifier |
122
+ | Notify | Herdr desktop notifications |
123
123
 
124
124
  ## Adding Subcommands
125
125
 
@@ -226,9 +226,8 @@ All configuration lives in `~/.config/hiiro/`:
226
226
  ~/.config/hiiro/
227
227
  plugins/ # Plugin files (auto-loaded)
228
228
  pins/ # Pin storage (per command)
229
- queue/ # Prompt queue (wip, pending, running, done, failed)
230
229
  services/ # Service runtime state
231
- jumplist/ # Per-client tmux navigation history
230
+ bg-history.txt # Background command history
232
231
  env_templates/ # Base .env templates for services
233
232
  tasks/ # Task metadata
234
233
  projects.yml # Project aliases
@@ -239,6 +238,14 @@ All configuration lives in `~/.config/hiiro/`:
239
238
  todo.yml # Todo items
240
239
  ```
241
240
 
241
+ Runtime data lives separately:
242
+
243
+ ```
244
+ ~/.local/share/hiiro/
245
+ queue/ # Prompt queue (wip, pending, running, done, failed)
246
+ notify_log.yml # Herdr notification log
247
+ ```
248
+
242
249
  ## Testing
243
250
 
244
251
  Run the test suite:
@@ -349,7 +356,7 @@ MIT
349
356
  # Start with specific variations
350
357
  h service start api-rails --use DATABASE_URL=docker --use REDIS_URL=docker
351
358
 
352
- # Start the full local stack (one window, 3 split panes)
359
+ # Start the full local stack (one Herdr tab per service)
353
360
  h service start full-stack
354
361
 
355
362
  # Start frontend pointing at staging backends
data/bin/h-app CHANGED
@@ -25,12 +25,10 @@ def relative_cd_path(target_path)
25
25
  end
26
26
 
27
27
  def send_cd(path)
28
- pane = ENV['TMUX_PANE']
29
- if pane
30
- system('tmux', 'send-keys', '-t', pane, "cd #{path}\n")
31
- else
32
- system('tmux', 'send-keys', "cd #{path}\n")
33
- end
28
+ pane = ENV['HERDR_PANE_ID']
29
+ return warn('Not running inside a Herdr pane') unless pane
30
+
31
+ Hiiro::Herdr.client.run_in_pane(pane, "cd #{path.shellescape}")
34
32
  end
35
33
 
36
34
 
data/bin/h-bg CHANGED
@@ -16,9 +16,7 @@ def append_history(cmd)
16
16
  end
17
17
 
18
18
  def run_in_bg(cmd)
19
- Hiiro::Background.ensure_session
20
- name = cmd.split.first.to_s
21
- system('tmux', 'new-window', '-d', '-t', "#{Hiiro::Background::SESSION}:", '-n', name, cmd)
19
+ Hiiro::Background.run(ENV['SHELL'] || 'zsh', '-lc', cmd)
22
20
  end
23
21
 
24
22
  Hiiro.run(*ARGV) do
@@ -57,7 +55,8 @@ Hiiro.run(*ARGV) do
57
55
  end
58
56
 
59
57
  add_subcmd(:attach, :a) do
60
- system('tmux', 'switch-client', '-t', Hiiro::Background::SESSION)
58
+ workspace = Hiiro::Background.ensure_workspace
59
+ Hiiro::Herdr.client.focus_workspace(workspace.id)
61
60
  end
62
61
 
63
62
  add_subcmd(:history, :hist) do
@@ -70,10 +69,6 @@ Hiiro.run(*ARGV) do
70
69
  end
71
70
 
72
71
  add_subcmd(:setup) do
73
- $stderr.puts 'Add this to your tmux.conf:'
74
- $stderr.puts
75
- puts "bind-key b display-popup -E -w 80% -h 40% \"h bg popup\""
76
- $stderr.puts
77
- $stderr.puts "Then reload tmux: tmux source-file ~/.tmux.conf"
72
+ puts 'No setup is required. Bind `h bg popup` in Herdr if you want a shortcut.'
78
73
  end
79
74
  end
data/bin/h-branch CHANGED
@@ -36,7 +36,7 @@ class BranchManager
36
36
  name: entry[:name],
37
37
  worktree: entry[:worktree],
38
38
  task: entry[:task],
39
- tmux: entry[:tmux],
39
+ herdr: entry[:herdr],
40
40
  sha: entry[:sha]
41
41
  )
42
42
  show_entry(entry)
@@ -104,7 +104,7 @@ class BranchManager
104
104
  name: branch_name,
105
105
  worktree: entry[:worktree],
106
106
  task: entry[:task],
107
- tmux_json: Hiiro::DB::JSON.dump(entry[:tmux]),
107
+ herdr_json: Hiiro::DB::JSON.dump(entry[:herdr]),
108
108
  sha: entry[:sha],
109
109
  created_at: Time.now.iso8601
110
110
  )
@@ -119,7 +119,7 @@ class BranchManager
119
119
  'name' => b.name,
120
120
  'worktree' => b.worktree,
121
121
  'task' => b.task,
122
- 'tmux' => b.tmux.empty? ? nil : b.tmux,
122
+ 'herdr' => b.herdr.empty? ? nil : b.herdr,
123
123
  'sha' => b.sha,
124
124
  'note' => b.note,
125
125
  'created_at' => b.created_at
@@ -132,7 +132,7 @@ class BranchManager
132
132
 
133
133
  def build_entry(branch_name)
134
134
  current_task = Hiiro::Environment.current&.task rescue nil
135
- tmux_info = capture_tmux_info
135
+ herdr_info = capture_herdr_info
136
136
  sha = `git rev-parse HEAD 2>/dev/null`.strip
137
137
 
138
138
  {
@@ -140,7 +140,7 @@ class BranchManager
140
140
  sha: sha.empty? ? nil : sha,
141
141
  worktree: current_task&.tree_name,
142
142
  task: current_task&.name,
143
- tmux: tmux_info
143
+ herdr: herdr_info
144
144
  }
145
145
  end
146
146
 
@@ -150,13 +150,13 @@ class BranchManager
150
150
  hiiro.git.branch
151
151
  end
152
152
 
153
- def capture_tmux_info
154
- return nil unless ENV['TMUX']
153
+ def capture_herdr_info
154
+ return nil unless ENV['HERDR_ENV'] == '1'
155
155
 
156
156
  {
157
- 'session' => `tmux display-message -p '#S'`.strip,
158
- 'window' => `tmux display-message -p '#W'`.strip,
159
- 'pane' => ENV['TMUX_PANE']
157
+ 'workspace' => ENV['HERDR_WORKSPACE_ID'],
158
+ 'tab' => ENV['HERDR_TAB_ID'],
159
+ 'pane' => ENV['HERDR_PANE_ID'],
160
160
  }
161
161
  end
162
162
 
@@ -165,20 +165,20 @@ class BranchManager
165
165
  puts " SHA: #{entry[:sha] || '(unknown)'}"
166
166
  puts " Task: #{entry[:task] || '(none)'}"
167
167
  puts " Worktree: #{entry[:worktree] || '(none)'}"
168
- if entry[:tmux]
169
- puts " Tmux session: #{entry[:tmux]['session']}"
170
- puts " Tmux window: #{entry[:tmux]['window']}"
171
- puts " Tmux pane: #{entry[:tmux]['pane']}"
168
+ if entry[:herdr]
169
+ puts " Herdr workspace: #{entry[:herdr]['workspace']}"
170
+ puts " Herdr tab: #{entry[:herdr]['tab']}"
171
+ puts " Herdr pane: #{entry[:herdr]['pane']}"
172
172
  end
173
173
  end
174
174
 
175
- def save_branch(name:, worktree:, task:, tmux: nil, sha: nil)
175
+ def save_branch(name:, worktree:, task:, herdr: nil, sha: nil)
176
176
  existing = Hiiro::Branch.find_by_name(name)
177
177
  if existing
178
178
  existing.update(
179
179
  worktree: worktree,
180
180
  task: task,
181
- tmux_json: Hiiro::DB::JSON.dump(tmux),
181
+ herdr_json: Hiiro::DB::JSON.dump(herdr),
182
182
  sha: sha,
183
183
  updated_at: Time.now.iso8601
184
184
  )
@@ -187,7 +187,7 @@ class BranchManager
187
187
  name: name,
188
188
  worktree: worktree,
189
189
  task: task,
190
- tmux_json: Hiiro::DB::JSON.dump(tmux),
190
+ herdr_json: Hiiro::DB::JSON.dump(herdr),
191
191
  sha: sha,
192
192
  created_at: Time.now.iso8601
193
193
  )
@@ -301,10 +301,10 @@ Hiiro.run(*ARGV) do
301
301
  puts " SHA: #{entry[:sha] || '(unknown)'}"
302
302
  puts " Task: #{entry[:task] || '(none)'}"
303
303
  puts " Worktree: #{entry[:worktree] || '(none)'}"
304
- if entry[:tmux]
305
- puts " Tmux session: #{entry[:tmux]['session']}"
306
- puts " Tmux window: #{entry[:tmux]['window']}"
307
- puts " Tmux pane: #{entry[:tmux]['pane']}"
304
+ if entry[:herdr]
305
+ puts " Herdr workspace: #{entry[:herdr]['workspace']}"
306
+ puts " Herdr tab: #{entry[:herdr]['tab']}"
307
+ puts " Herdr pane: #{entry[:herdr]['pane']}"
308
308
  end
309
309
 
310
310
  base = FIND_BASE.call
data/bin/h-claude CHANGED
@@ -128,7 +128,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) {
128
128
  size += '%' if opts.percent
129
129
  cmd = opts.ignore ? fire_command(opts) : start_command(opts)
130
130
 
131
- tmux_client.split_window(horizontal: !opts.horizontal, size: size, command: cmd)
131
+ herdr_client.split_window(horizontal: !opts.horizontal, size: size, command: cmd)
132
132
  }
133
133
 
134
134
  add_subcmd(:vsplit) { |*args|
@@ -138,8 +138,8 @@ Hiiro.run(*ARGV, plugins: [Pins]) {
138
138
  size += '%' if size && opts.percent
139
139
  cmd = opts.ignore ? fire_command(opts) : start_command(opts)
140
140
 
141
- tmux_client.vsplit_window(size: size, command: cmd)
142
- tmux_client.swap_current_pane(0, keep_active: true) if opts.left
141
+ herdr_client.vsplit_window(size: size, command: cmd)
142
+ herdr_client.swap_current_pane(:left) if opts.left
143
143
  }
144
144
 
145
145
  add_subcmd(:hsplit) { |*args|
@@ -149,14 +149,14 @@ Hiiro.run(*ARGV, plugins: [Pins]) {
149
149
  size += '%' if size && opts.percent
150
150
  cmd = opts.ignore ? fire_command(opts) : start_command(opts)
151
151
 
152
- tmux_client.hsplit_window(size: size, command: cmd)
153
- tmux_client.swap_current_pane(0, keep_active: true) unless opts.bottom
152
+ herdr_client.hsplit_window(size: size, command: cmd)
153
+ herdr_client.swap_current_pane(:up) unless opts.bottom
154
154
  }
155
155
 
156
156
  add_subcmd(:window) { |*args|
157
157
  opts = opts.parse(args)
158
158
  cmd = opts.ignore ? fire_command(opts) : start_command(opts)
159
- tmux_client.new_window(command: cmd)
159
+ herdr_client.new_tab(command: cmd)
160
160
  }
161
161
 
162
162
  add_subcmd(:env) { |*args|
data/bin/h-config CHANGED
@@ -26,8 +26,8 @@ Hiiro.run(*ARGV) {
26
26
  }.run
27
27
  }
28
28
 
29
- add_subcmd(:tmux) {
30
- open_config('.tmux.conf', dir: '~')
29
+ add_subcmd(:herdr) {
30
+ open_config('config.toml', dir: '~/.config/herdr')
31
31
  }
32
32
 
33
33
  add_subcmd(:zsh) {