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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +24 -17
- data/bin/h-app +4 -6
- data/bin/h-bg +4 -9
- data/bin/h-branch +21 -21
- data/bin/h-claude +6 -6
- data/bin/h-config +2 -2
- data/bin/h-notify +92 -257
- data/bin/h-pane +96 -137
- data/bin/h-pr +16 -10
- data/bin/h-project +7 -19
- data/bin/h-session +52 -106
- data/bin/h-title +12 -44
- data/bin/h-window +24 -135
- data/bin/h-wtree +2 -2
- data/docs/README.md +10 -13
- data/docs/docker-testing-guide.md +6 -7
- data/docs/h-app.md +2 -2
- data/docs/h-bg.md +11 -59
- data/docs/h-branch.md +3 -4
- data/docs/h-claude.md +25 -25
- data/docs/h-config.md +4 -5
- data/docs/h-notify.md +33 -106
- data/docs/h-pane.md +36 -148
- data/docs/h-pr.md +2 -3
- data/docs/h-project.md +3 -3
- data/docs/h-queue.md +24 -24
- data/docs/h-service.md +8 -8
- data/docs/h-session.md +29 -126
- data/docs/h-subtask.md +3 -3
- data/docs/h-task.md +16 -28
- data/docs/h-title.md +5 -25
- data/docs/h-window.md +19 -118
- data/docs/h-wtree.md +3 -4
- data/docs/h.md +10 -12
- data/exe/h +1 -3
- data/lib/hiiro/background.rb +17 -14
- data/lib/hiiro/branch.rb +24 -3
- data/lib/hiiro/db.rb +4 -1
- data/lib/hiiro/effects.rb +2 -2
- data/lib/hiiro/git/pr.rb +13 -6
- data/lib/hiiro/herdr.rb +610 -0
- data/lib/hiiro/invocation.rb +16 -19
- data/lib/hiiro/pinned_pr.rb +16 -3
- data/lib/hiiro/pinned_pr_manager.rb +1 -1
- data/lib/hiiro/queue.rb +93 -74
- data/lib/hiiro/service_manager.rb +54 -80
- data/lib/hiiro/tasks.rb +53 -91
- data/lib/hiiro/version.rb +1 -1
- data/lib/hiiro.rb +5 -6
- data/merge +47 -0
- data/plugins/notify.rb +2 -7
- data/plugins/project.rb +2 -2
- metadata +6 -21
- data/bin/h-buffer +0 -123
- data/bin/h-jumplist +0 -287
- data/docs/h-buffer.md +0 -133
- data/docs/h-jumplist.md +0 -111
- data/lib/hiiro/task_colors.rb +0 -38
- data/lib/hiiro/tmux/buffer.rb +0 -63
- data/lib/hiiro/tmux/buffers.rb +0 -58
- data/lib/hiiro/tmux/pane.rb +0 -122
- data/lib/hiiro/tmux/panes.rb +0 -81
- data/lib/hiiro/tmux/session.rb +0 -112
- data/lib/hiiro/tmux/sessions.rb +0 -61
- data/lib/hiiro/tmux/window.rb +0 -94
- data/lib/hiiro/tmux/windows.rb +0 -73
- data/lib/hiiro/tmux.rb +0 -384
- /data/{.ruby-version → bkup..ruby-version} +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e1a1f6f0db99f2573bda6b2c6e8746e49464a4079d40534b6367aa5c888d4557
|
|
4
|
+
data.tar.gz: f805de24c6a10db384b4bbb5141edc8d9f0511d9b07cf8c81c4ada064cb6d50e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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-
|
|
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
|
|
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
|
|
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,
|
|
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` |
|
|
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
|
|
88
|
-
| `h queue` | Claude prompt queue with
|
|
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` |
|
|
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` |
|
|
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
|
|
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 |
|
|
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
|
-
|
|
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
|
|
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['
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
'
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
154
|
-
return nil unless ENV['
|
|
153
|
+
def capture_herdr_info
|
|
154
|
+
return nil unless ENV['HERDR_ENV'] == '1'
|
|
155
155
|
|
|
156
156
|
{
|
|
157
|
-
'
|
|
158
|
-
'
|
|
159
|
-
'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[:
|
|
169
|
-
puts "
|
|
170
|
-
puts "
|
|
171
|
-
puts "
|
|
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:,
|
|
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
|
-
|
|
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
|
-
|
|
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[:
|
|
305
|
-
puts "
|
|
306
|
-
puts "
|
|
307
|
-
puts "
|
|
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
|
-
|
|
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
|
-
|
|
142
|
-
|
|
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
|
-
|
|
153
|
-
|
|
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
|
-
|
|
159
|
+
herdr_client.new_tab(command: cmd)
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
add_subcmd(:env) { |*args|
|