wherdr 1.3.4 → 2.0.1
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.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/072bjdot.js +2 -0
- package/.output/public/_nuxt/8FAMamJX.js +1 -0
- package/.output/public/_nuxt/{AgentView.DzFWBd2A.css → AgentView.CfD2RWZY.css} +1 -1
- package/.output/public/_nuxt/BDNMzG2s.js +1 -0
- package/.output/public/_nuxt/BX8KVYfd.js +1 -0
- package/.output/public/_nuxt/{CJKsMzIp.js → BYZVrreW.js} +1 -1
- package/.output/public/_nuxt/C2aT0CgA.js +62 -0
- package/.output/public/_nuxt/CanLPS0U.js +105 -0
- package/.output/public/_nuxt/DGXKTg7D.js +31 -0
- package/.output/public/_nuxt/{DMLmW6JM.js → DOsw6KCR.js} +41 -42
- package/.output/public/_nuxt/DTiR5P9E.js +25 -0
- package/.output/public/_nuxt/{w7Rm7unj.js → DYKfeNM-.js} +1 -1
- package/.output/public/_nuxt/DZ7VvF3e.js +1 -0
- package/.output/public/_nuxt/DZGKxROq.js +6 -0
- package/.output/public/_nuxt/DeLLm2j1.js +23 -0
- package/.output/public/_nuxt/DumNBIyF.js +1 -0
- package/.output/public/_nuxt/ScQ9FtVj.js +1 -0
- package/.output/public/_nuxt/TS7GZUPU.js +9 -0
- package/.output/public/_nuxt/board.DK5EU4sL.css +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/b6ed1ddd-d6d6-4137-beab-2548b20dd998.json +1 -0
- package/.output/public/_nuxt/entry.BhiYrGAW.css +2 -0
- package/.output/public/_nuxt/settings.Cdb21nNw.css +1 -0
- package/.output/public/sw.js +1 -1
- package/.output/server/chunks/_/branding.mjs +1 -1
- package/.output/server/chunks/_/changes.mjs +4 -4
- package/.output/server/chunks/_/fileDownload.mjs +278 -0
- package/.output/server/chunks/_/files.mjs +44 -17
- package/.output/server/chunks/_/machineOrder.mjs +1 -1
- package/.output/server/chunks/_/onboarding.mjs +1 -1
- package/.output/server/chunks/_/package.mjs +9 -3
- package/.output/server/chunks/_/plugins.mjs +92 -125
- package/.output/server/chunks/_/restart.mjs +1 -1
- package/.output/server/chunks/_/selfupdate.mjs +1 -1
- package/.output/server/chunks/_/updates.mjs +1 -1
- package/.output/server/chunks/_/worktrees.mjs +1 -1
- package/.output/server/chunks/_/ws.mjs +43 -6
- package/.output/server/chunks/nitro/nitro.mjs +14073 -10658
- package/.output/server/chunks/raw/check-doc-links.mjs +5 -0
- package/.output/server/chunks/raw/check-leaks.mjs +1 -1
- package/.output/server/chunks/raw/check-release-notes.mjs +5 -0
- package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
- package/.output/server/chunks/raw/install-claude-statusline.mjs +1 -1
- package/.output/server/chunks/raw/prerelease-summary.mjs +5 -0
- package/.output/server/chunks/raw/prerelease.mjs +7 -0
- package/.output/server/chunks/raw/reveal.mjs +1 -1
- package/.output/server/chunks/raw/test-affected.mjs +5 -0
- package/.output/server/chunks/routes/api/_..._.mjs +6 -5
- package/.output/server/chunks/routes/api/agents.post.mjs +6 -5
- package/.output/server/chunks/routes/api/ask-tab.post.mjs +6 -5
- package/.output/server/chunks/routes/api/attach.post.mjs +6 -5
- package/.output/server/chunks/routes/api/auth/disable.post.mjs +6 -5
- package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +6 -5
- package/.output/server/chunks/routes/api/auth/lock.post.mjs +6 -5
- package/.output/server/chunks/routes/api/auth/login/options.post.mjs +6 -5
- package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +6 -5
- package/.output/server/chunks/routes/api/auth/max-session.post.mjs +6 -5
- package/.output/server/chunks/routes/api/auth/register/options.post.mjs +6 -5
- package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +6 -5
- package/.output/server/chunks/routes/api/auth/status.get.mjs +6 -5
- package/.output/server/chunks/routes/api/changes.get.mjs +7 -6
- package/.output/server/chunks/routes/api/chat/image.get.mjs +7 -6
- package/.output/server/chunks/routes/api/chat.get.mjs +20 -7
- package/.output/server/chunks/routes/api/choose.post.mjs +31 -17
- package/.output/server/chunks/routes/api/claude-setup.post.mjs +42 -0
- package/.output/server/chunks/routes/api/claude-statusline.post.mjs +7 -6
- package/.output/server/chunks/routes/api/clear-queued-input.post.mjs +42 -0
- package/.output/server/chunks/routes/api/close/status.get.mjs +7 -6
- package/.output/server/chunks/routes/api/close.post.mjs +6 -5
- package/.output/server/chunks/routes/api/codex-update.post.mjs +7 -6
- package/.output/server/chunks/routes/api/commands.get.mjs +7 -6
- package/.output/server/chunks/routes/api/config.get.mjs +10 -13
- package/.output/server/chunks/routes/api/dirs.get.mjs +7 -6
- package/.output/server/chunks/routes/api/dismiss-stopped.post.mjs +7 -6
- package/.output/server/chunks/routes/api/dismiss.post.mjs +7 -6
- package/.output/server/chunks/routes/api/effort.post.mjs +7 -6
- package/.output/server/chunks/routes/api/efforts.get.mjs +7 -6
- package/.output/server/chunks/routes/api/file.post.mjs +7 -6
- package/.output/server/chunks/routes/api/files/download.get.mjs +12 -31
- package/.output/server/chunks/routes/api/files/download.head.mjs +41 -0
- package/.output/server/chunks/routes/api/files/read.get.mjs +8 -7
- package/.output/server/chunks/routes/api/files.get.mjs +7 -6
- package/.output/server/chunks/routes/api/health.get.mjs +6 -5
- package/.output/server/chunks/routes/api/input.post.mjs +7 -6
- package/.output/server/chunks/routes/api/interrupt.post.mjs +24 -21
- package/.output/server/chunks/routes/api/isgit.get.mjs +8 -8
- package/.output/server/chunks/routes/api/machine/awake.get.mjs +7 -6
- package/.output/server/chunks/routes/api/machine/awake.post.mjs +7 -6
- package/.output/server/chunks/routes/api/machine/order.get.mjs +6 -5
- package/.output/server/chunks/routes/api/machine/order.post.mjs +6 -5
- package/.output/server/chunks/routes/api/machine/reconnect.post.mjs +40 -0
- package/.output/server/chunks/routes/api/machine/rename.post.mjs +7 -6
- package/.output/server/chunks/routes/api/machine/status.post.mjs +39 -0
- package/.output/server/chunks/routes/api/menu-left.post.mjs +40 -0
- package/.output/server/chunks/routes/api/menu.post.mjs +7 -6
- package/.output/server/chunks/routes/api/model.post.mjs +7 -6
- package/.output/server/chunks/routes/api/models.get.mjs +7 -6
- package/.output/server/chunks/routes/api/nav.post.mjs +7 -6
- package/.output/server/chunks/routes/api/onboarding.get.mjs +6 -5
- package/.output/server/chunks/routes/api/onboarding.post.mjs +6 -5
- package/.output/server/chunks/routes/api/phone.get.mjs +8 -10
- package/.output/server/chunks/routes/api/phone.post.mjs +8 -10
- package/.output/server/chunks/routes/api/plugins/actions.get.mjs +6 -10
- package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +6 -10
- package/.output/server/chunks/routes/api/plugins/projects.get.mjs +10 -9
- package/.output/server/chunks/routes/api/plugins/projects.post.mjs +11 -8
- package/.output/server/chunks/routes/api/prompt.post.mjs +22 -13
- package/.output/server/chunks/routes/api/push/quiet.post.mjs +7 -6
- package/.output/server/chunks/routes/api/push/subscribe.post.mjs +7 -7
- package/.output/server/chunks/routes/api/push/test.post.mjs +7 -6
- package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +7 -6
- package/.output/server/chunks/routes/api/quotas.get.mjs +7 -6
- package/.output/server/chunks/routes/api/rename.post.mjs +6 -5
- package/.output/server/chunks/routes/api/requeue.post.mjs +7 -6
- package/.output/server/chunks/routes/api/restart.get.mjs +6 -5
- package/.output/server/chunks/routes/api/restart.post.mjs +6 -5
- package/.output/server/chunks/routes/api/reveal.post.mjs +91 -8
- package/.output/server/chunks/routes/api/screen-key.post.mjs +7 -6
- package/.output/server/chunks/routes/api/screen.get.mjs +7 -6
- package/.output/server/chunks/routes/api/search.get.mjs +7 -6
- package/.output/server/chunks/routes/api/seen.post.mjs +7 -6
- package/.output/server/chunks/routes/api/sessions.get.mjs +7 -6
- package/.output/server/chunks/routes/api/sessions.post.mjs +7 -6
- package/.output/server/chunks/routes/api/settings-tab.post.mjs +7 -6
- package/.output/server/chunks/routes/api/{plugins/thread-limits.get.mjs → settings.get.mjs} +10 -9
- package/.output/server/chunks/routes/api/settings.post.mjs +40 -0
- package/.output/server/chunks/routes/api/space.post.mjs +34 -18
- package/.output/server/chunks/routes/api/state.get.mjs +7 -6
- package/.output/server/chunks/routes/api/tasks/action.post.mjs +39 -0
- package/.output/server/chunks/routes/api/{plugins/profiles.get.mjs → tasks/add.post.mjs} +12 -16
- package/.output/server/chunks/routes/api/tasks/after.post.mjs +39 -0
- package/.output/server/chunks/routes/api/tasks/approve.post.mjs +39 -0
- package/.output/server/chunks/routes/api/{project/report.get.mjs → tasks/archived.get.mjs} +12 -14
- package/.output/server/chunks/routes/api/{index.get.mjs → tasks/autopilot.get.mjs} +13 -14
- package/.output/server/chunks/routes/api/tasks/autopilot.post.mjs +39 -0
- package/.output/server/chunks/routes/api/{gitroot.get.mjs → tasks/board-settings.get.mjs} +12 -14
- package/.output/server/chunks/routes/api/tasks/board-settings.post.mjs +39 -0
- package/.output/server/chunks/routes/api/tasks/coordinator.get.mjs +40 -0
- package/.output/server/chunks/routes/api/tasks/coordinator.post.mjs +39 -0
- package/.output/server/chunks/routes/api/tasks/details.get.mjs +40 -0
- package/.output/server/chunks/routes/api/tasks/limit.post.mjs +39 -0
- package/.output/server/chunks/routes/api/tasks/links.get.mjs +39 -0
- package/.output/server/chunks/routes/api/tasks/models.get.mjs +40 -0
- package/.output/server/chunks/routes/api/tasks/pick.post.mjs +39 -0
- package/.output/server/chunks/routes/api/tasks/question.post.mjs +39 -0
- package/.output/server/chunks/routes/api/tasks/scheduled.get.mjs +40 -0
- package/.output/server/chunks/routes/api/{project → tasks}/settings.get.mjs +10 -12
- package/.output/server/chunks/routes/api/tasks/start.get.mjs +40 -0
- package/.output/server/chunks/routes/api/tasks/tell.post.mjs +39 -0
- package/.output/server/chunks/routes/api/tasks.get.mjs +39 -0
- package/.output/server/chunks/routes/api/unqueue.post.mjs +7 -6
- package/.output/server/chunks/routes/api/update/status.get.mjs +6 -5
- package/.output/server/chunks/routes/api/update.get.mjs +8 -10
- package/.output/server/chunks/routes/api/update.post.mjs +8 -10
- package/.output/server/chunks/routes/api/upload.post.mjs +7 -6
- package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +6 -5
- package/.output/server/chunks/routes/api/worktrees.get.mjs +6 -5
- package/.output/server/chunks/routes/favicon.ico.get.mjs +6 -5
- package/.output/server/chunks/routes/icons/_name_.get.mjs +7 -6
- package/.output/server/chunks/routes/renderer.mjs +8 -7
- package/.output/server/chunks/routes/uploads/_...name_.get.mjs +7 -6
- package/.output/server/chunks/routes/ws/_..._.mjs +7 -6
- package/.output/server/chunks/routes/ws/events.mjs +9 -7
- package/.output/server/chunks/routes/ws/term.mjs +7 -6
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/index.mjs +7 -6
- package/.output/server/package.json +1 -1
- package/README.md +44 -1445
- package/bin/lib/commands.mjs +44 -9
- package/bin/lib/panel.mjs +3 -11
- package/bin/lib/service.mjs +41 -2
- package/bin/lib/skill.mjs +1 -1
- package/bin/lib/tailnet.d.mts +6 -3
- package/bin/lib/tailnet.mjs +70 -32
- package/bin/lib/userpath.d.mts +14 -0
- package/bin/lib/userpath.mjs +142 -0
- package/docs/README.md +58 -0
- package/docs/RELEASING.md +174 -0
- package/docs/board.md +169 -0
- package/docs/command.md +58 -0
- package/docs/configuration.md +39 -0
- package/docs/conversation.md +132 -0
- package/docs/development.md +38 -0
- package/docs/devices.md +58 -0
- package/docs/files.md +29 -0
- package/docs/herdr-projects-1x.md +278 -0
- package/docs/home.md +52 -0
- package/docs/installation.md +174 -0
- package/docs/machines.md +74 -0
- package/docs/migrate-from-1.x-docker.md +160 -0
- package/docs/networks.md +154 -0
- package/docs/notifications.md +83 -0
- package/docs/overview.md +71 -0
- package/docs/phone.md +26 -0
- package/docs/plugins.md +109 -0
- package/docs/quick-start.md +89 -0
- package/docs/quotas.md +65 -0
- package/docs/release-notes-2.0.0.md +84 -0
- package/docs/security.md +117 -0
- package/docs/terminal.md +15 -0
- package/docs/troubleshooting.md +45 -0
- package/package.json +9 -3
- package/skills/wherdr/SKILL.md +24 -173
- package/.output/public/_nuxt/BEJHMUrj.js +0 -1
- package/.output/public/_nuxt/BOtcEDnA.js +0 -1
- package/.output/public/_nuxt/BUaYhQ2r.js +0 -6
- package/.output/public/_nuxt/CJNhn9sA.js +0 -36
- package/.output/public/_nuxt/COCvtdHN.js +0 -89
- package/.output/public/_nuxt/Cl45J6_Q.js +0 -1
- package/.output/public/_nuxt/CndPDbMI.js +0 -2
- package/.output/public/_nuxt/Ctbx58Um.js +0 -23
- package/.output/public/_nuxt/Dl1PHLOB.js +0 -1
- package/.output/public/_nuxt/Nhex3_iH.js +0 -1
- package/.output/public/_nuxt/OpWX45i7.js +0 -89
- package/.output/public/_nuxt/builds/meta/4994f3a4-4126-4f57-a9e5-c7ebb25850bc.json +0 -1
- package/.output/public/_nuxt/dTj21DMs.js +0 -1
- package/.output/public/_nuxt/entry.BohTWE-n.css +0 -2
- package/.output/public/_nuxt/kwSoIiM7.js +0 -1
- package/.output/public/_nuxt/mkEwYka4.js +0 -1
- package/.output/server/chunks/_/pluginPolicy.mjs +0 -93
- package/.output/server/chunks/_/projectBoard.mjs +0 -363
- package/.output/server/chunks/_/projectDocs.mjs +0 -106
- package/.output/server/chunks/_/projectInbox.mjs +0 -135
- package/.output/server/chunks/_/projectThreads.mjs +0 -46
- package/.output/server/chunks/_/projectThreads2.mjs +0 -61
- package/.output/server/chunks/_/projectsActions.mjs +0 -143
- package/.output/server/chunks/_/projectsPlugin.mjs +0 -30
- package/.output/server/chunks/_/projectsPlugin2.mjs +0 -57
- package/.output/server/chunks/_/reveal.mjs +0 -115
- package/.output/server/chunks/raw/dev.wherdr.open.mjs +0 -7
- package/.output/server/chunks/raw/docker-entrypoint.mjs +0 -7
- package/.output/server/chunks/raw/install-host-open.mjs +0 -7
- package/.output/server/chunks/raw/wherdr-open.mjs +0 -7
- package/.output/server/chunks/routes/api/board.get.mjs +0 -148
- package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +0 -45
- package/.output/server/chunks/routes/api/project/inbox.get.mjs +0 -44
- package/.output/server/chunks/routes/api/project/inbox.post.mjs +0 -44
- package/.output/server/chunks/routes/api/project/memory.get.mjs +0 -43
- package/.output/server/chunks/routes/api/project/routines.get.mjs +0 -44
- package/.output/server/chunks/routes/api/project/thread.get.mjs +0 -45
- package/.output/server/chunks/routes/api/project/thread.post.mjs +0 -47
- package/bin/install-docker-skill.sh +0 -20
package/docs/devices.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Computer, phone and iPad
|
|
2
|
+
|
|
3
|
+
[Documentation](README.md) · [Project](../README.md)
|
|
4
|
+
|
|
5
|
+
### On a computer
|
|
6
|
+
|
|
7
|
+
- **Split panes, live**: a tab with several panes is drawn with Herdr's real layout; every pane
|
|
8
|
+
shows its conversation or terminal live. Every visible terminal fills its cell and follows
|
|
9
|
+
window and divider resizing, keeping its instance and connection when focus changes.
|
|
10
|
+
Click a cell to give it the keyboard. Leaving the tab restores each terminal's original size,
|
|
11
|
+
unless a Herdr client has resized it meanwhile.
|
|
12
|
+
- **Rearrange the layout**: drag a pane onto another to move it, drag a divider to resize
|
|
13
|
+
(arrow keys work on a focused divider); changes go to Herdr itself.
|
|
14
|
+
- **Spaces and tabs**: sidebar with every space, tabs at the top, active tab remembered per space.
|
|
15
|
+
The sidebar can be resized, or collapsed to a narrow rail (search, new agent, settings and
|
|
16
|
+
state counters) with the button next to Settings; the choice is kept on the device.
|
|
17
|
+
- **Keyboard shortcuts** (`Mod` is ⌘ on macOS, Ctrl elsewhere; `Mod+/` or `?` lists them all,
|
|
18
|
+
also in Settings › Computer):
|
|
19
|
+
- `Ctrl/⌘+K` global search across agents and conversations, `Alt+↑/↓` previous / next agent
|
|
20
|
+
in the list, `Mod+,` settings, `H` the [Board](board.md#works-great-with-herdr-projects) (outside a
|
|
21
|
+
text field and the terminal).
|
|
22
|
+
- `Mod+Alt+N` new agent in a new space, `Mod+Alt+T` new tab in the current space,
|
|
23
|
+
`Mod+Alt+W` close the current pane (after confirmation). They work from the terminal too.
|
|
24
|
+
- In an agent: `Mod+F` searches the conversation, ``Ctrl+` `` switches between conversation
|
|
25
|
+
and terminal, and `Esc` stops a working agent when the message field is empty.
|
|
26
|
+
- `Alt+Shift+arrows` swaps the current pane with its neighbour, `Ctrl/⌘+Alt+arrows` moves
|
|
27
|
+
focus to the neighbouring pane in a side-by-side tab, `Esc` closes dialogs, `Enter` sends
|
|
28
|
+
and `Shift+Enter` adds a new line. On a "Your turn" card, `1`–`9` pick an option (on AZERTY
|
|
29
|
+
without Shift too, outside the message field); on the `/resume` card, `Ctrl+A` switches
|
|
30
|
+
between every project and the current one (`⌘A` still selects all on macOS).
|
|
31
|
+
- In the message field, `↑` on the first line recalls previous messages and slash commands;
|
|
32
|
+
`↓` on the last line returns to newer entries, then restores your draft. History keeps the
|
|
33
|
+
last 100 texts sent from this device per agent, without attachments or quoted references.
|
|
34
|
+
- **Board** for [herdr-projects](board.md#works-great-with-herdr-projects) 1.2.1 or later: every machine's
|
|
35
|
+
tasks in four columns (needs you, ready to approve, working, to do), done one tap away, each
|
|
36
|
+
task with its pull request, review, reply and approval.
|
|
37
|
+
- **Settings** in a sidebar, with desktop-only options such as the content width.
|
|
38
|
+
|
|
39
|
+
### On a phone
|
|
40
|
+
|
|
41
|
+
- **Installable app (PWA)** on iPhone and Android, with safe-area and keyboard handling.
|
|
42
|
+
- **Web Push notifications** when an agent finishes or needs you (with its question), and for
|
|
43
|
+
`herdr notification show` (plugins, scripts).
|
|
44
|
+
- **Quick replies**: answer permissions and questions in one tap from the agent list.
|
|
45
|
+
- **Split tabs on a small screen**: a plan of the tab's panes in Herdr's proportions, then each
|
|
46
|
+
pane full screen with a mini-map and swipe to its neighbours.
|
|
47
|
+
- **Terminal key bar** (Esc, Enter, arrows, Shift+Tab, Ctrl+C…) and touch scrolling.
|
|
48
|
+
- **Offline reading** of the last known state and of recently opened conversations.
|
|
49
|
+
|
|
50
|
+
### On an iPad
|
|
51
|
+
|
|
52
|
+
- **Computer layout in both orientations**: in portrait the agent list folds to a narrow column
|
|
53
|
+
and slides over the conversation; in landscape it stays docked. Buttons are 44 px, and the
|
|
54
|
+
layout does not change when the on-screen keyboard opens.
|
|
55
|
+
- **Side by side by touch**: finger-sized pane buttons, grip and dividers; the active terminal
|
|
56
|
+
pane has the key bar; with the keyboard open the tab fits the visible area above it.
|
|
57
|
+
- **Hardware keyboard**: Enter sends (Shift+Enter adds a line) once a key only a hardware
|
|
58
|
+
keyboard sends (arrows, Esc, a ⌘ chord) has been typed.
|
package/docs/files.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Files and changes
|
|
2
|
+
|
|
3
|
+
[Documentation](README.md) · [Project](../README.md)
|
|
4
|
+
|
|
5
|
+
- **Changes view**: Git status and diff of an agent's working folder; worktree management.
|
|
6
|
+
Review the diff like a pull request: comment on one line or on a **block of lines**. The code
|
|
7
|
+
itself is plain text — a click on it does nothing, so it can be selected and copied.
|
|
8
|
+
- **Mouse**: a **+** appears in the gutter of the hovered line; click it to comment that line,
|
|
9
|
+
or press it and drag over other lines to comment the block. With an editor open, Shift+click
|
|
10
|
+
another line to change its block.
|
|
11
|
+
- **Touch**: tap a line number to choose the line, tap another line to extend the block, then
|
|
12
|
+
**Comment** in the bar pinned at the bottom. Nothing is written by the first tap.
|
|
13
|
+
- **Keyboard**: one tab stop per file; arrow keys move between lines, Shift+arrows choose a
|
|
14
|
+
block, Enter opens the editor. In the editor, ⌘/Ctrl+Enter saves and Escape cancels (a second
|
|
15
|
+
Escape if text would be lost); the window stays open.
|
|
16
|
+
|
|
17
|
+
A block stays within one hunk (the other hunks dim while it is chosen) and may mix deleted and
|
|
18
|
+
new lines. Each comment is a thread under the last line of its block, headed by its lines
|
|
19
|
+
("Lines 12–18"), with **Edit** and a two-step **Delete**; the lines it covers are marked in
|
|
20
|
+
the gutter. Comments, including the text of an editor left open, are saved on this device for
|
|
21
|
+
that agent, across refreshes and reloads. A block that leaves the diff, or whose code changed
|
|
22
|
+
between its first and last lines, is flagged above the diff and keeps the excerpt that was
|
|
23
|
+
commented.
|
|
24
|
+
**Send review** stays pinned with the number of comments; it groups them by file as
|
|
25
|
+
`file:12-18 — remark` (`file:12` for one line) followed by a short excerpt of the block, and
|
|
26
|
+
appends them to the conversation's message draft, preserving existing text; it never sends a
|
|
27
|
+
message. Deleted lines use the old file's numbers, explicitly labelled. **Discard** clears the
|
|
28
|
+
local review. Works on remote agents and in the demo too, with no writes to the agent's
|
|
29
|
+
machine. Browser storage must be available to retain comments after closing the view.
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# Moving from herdr-projects 0.2 to 1.x
|
|
2
|
+
|
|
3
|
+
wherdr **2.0.0** reads herdr-projects **1.2.1 or later** only. wherdr 1.3.4 is the last version
|
|
4
|
+
that reads herdr-projects 0.2 (its Project panel, `TASKS.md`, threads). This page moves one
|
|
5
|
+
machine from 0.2 to 1.x, keeps a backup, and says how to go back. Do it on each machine that
|
|
6
|
+
runs herdr-projects.
|
|
7
|
+
|
|
8
|
+
wherdr 2.0 runs only **natively**, as a service of your user. A wherdr 1.x running in Docker
|
|
9
|
+
moves first: [Migrate a 1.x Docker install](migrate-from-1.x-docker.md).
|
|
10
|
+
|
|
11
|
+
herdr-projects 1.x is a different program, not a newer 0.2: one work board of tasks, each
|
|
12
|
+
handed to an agent in its own space, reviewed when it finishes and merged on your yes. Your
|
|
13
|
+
0.2 projects are **not converted**. 1.x sets them aside, whole, in `~/.herdr-projects-legacy`
|
|
14
|
+
and never deletes them. Upstream describes what it does in
|
|
15
|
+
[older installs](https://github.com/eliasstravik/herdr-projects/blob/main/docs/old-installs.md).
|
|
16
|
+
|
|
17
|
+
## Before you start
|
|
18
|
+
|
|
19
|
+
- Herdr 0.9.3 or later (`herdr --version`): the oldest Herdr herdr-projects 1.2.1 was checked on.
|
|
20
|
+
- No 0.2 thread you still need running: finish or stop them first. 1.x asks the 0.2 ticker to
|
|
21
|
+
stop, and moves nothing while it still runs.
|
|
22
|
+
- Note what each 0.2 project still had to do (its `TASKS.md`): you will tell the 1.x
|
|
23
|
+
Coordinator about it after the move.
|
|
24
|
+
|
|
25
|
+
## 1. Back up
|
|
26
|
+
|
|
27
|
+
1.x moves folders and edits a few files outside them (it backs those up itself, beside them,
|
|
28
|
+
as `<file>.bak-herdr-projects`). Keep your own copy too:
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
cd ~ && if [ -s ~/herdr-projects-0.2-backup.path ]; then
|
|
32
|
+
echo "backup already made, kept: $(cat ~/herdr-projects-0.2-backup.path)"
|
|
33
|
+
else
|
|
34
|
+
backup="$HOME/herdr-projects-0.2-backup-$(date +%Y%m%d-%H%M%S).tgz"
|
|
35
|
+
files=$(for p in .herdr-projects .config/herdr-projects .local/state/herdr/plugins/herdr-projects \
|
|
36
|
+
.config/herdr/config.toml .config/herdr/plugins.json; do [ -e "$p" ] && echo "$p"; done)
|
|
37
|
+
if ! printf '%s\n' "$files" | grep -q herdr-projects; then
|
|
38
|
+
echo "NO 0.2 FILES FOUND in $HOME: nothing backed up, check you are the user who runs Herdr"
|
|
39
|
+
elif [ ! -e "$backup" ] && printf '%s\n' "$files" | tar czf "$backup" -T - \
|
|
40
|
+
&& tar tzf "$backup" > /dev/null; then
|
|
41
|
+
echo "$backup" > ~/herdr-projects-0.2-backup.path && echo "backup ok: $backup"
|
|
42
|
+
printf '%s\n' "$files" | grep -qx .config/herdr/config.toml \
|
|
43
|
+
|| echo "no Herdr config.toml to keep: step 5 of Going back has nothing to restore"
|
|
44
|
+
else
|
|
45
|
+
echo "BACKUP FAILED: do not go on"
|
|
46
|
+
fi
|
|
47
|
+
fi
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Go on only after `backup ok` (or `backup already made`). The archive has a new name each time
|
|
51
|
+
and is never overwritten. `~/herdr-projects-0.2-backup.path` keeps the path of the **first**
|
|
52
|
+
one: running this again, for example after an install that stopped halfway, keeps that first
|
|
53
|
+
backup instead of saving files 1.x has already changed. The steps of
|
|
54
|
+
[Going back](#going-back-to-02) read the path from that file.
|
|
55
|
+
|
|
56
|
+
The archive holds your whole projects (their libraries, uploads and thread records): expect
|
|
57
|
+
hundreds of megabytes. Keep it, and its `.path` file, until you are sure you will not go back:
|
|
58
|
+
it is the only full copy of Herdr's `config.toml` as it was (see
|
|
59
|
+
[Going back](#going-back-to-02), step 5).
|
|
60
|
+
|
|
61
|
+
## 2. Install herdr-projects 1.2.21
|
|
62
|
+
|
|
63
|
+
```sh
|
|
64
|
+
herdr plugin uninstall herdr-projects && herdr plugin install eliasstravik/herdr-projects --ref v1.2.21 --yes
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Uninstalling removes only Herdr's copy of the plugin; your projects stay where they are.
|
|
68
|
+
|
|
69
|
+
Then, in the Herdr terminal client, reload its config (`prefix` + `Shift` + `R`) and open the
|
|
70
|
+
work board once (the plugin action **Open the work board**). Its first run sets the 0.2 files
|
|
71
|
+
aside and says so in one line. Without an attached client, the same from a shell:
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
herdr server reload-config && herdr plugin action invoke open --plugin herdr-projects
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Check where things stand:
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
~/.herdr-projects/data/bin/herdr-projects doctor
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`doctor` lists what it took over and anything left to do (it exits with 1 when something needs
|
|
84
|
+
you). Running it again changes nothing.
|
|
85
|
+
|
|
86
|
+
What the first run changes, besides moving the 0.2 folders:
|
|
87
|
+
|
|
88
|
+
- **`herdr-projects` leaves your PATH.** The link 0.2 had put there (`~/.local/bin/herdr-projects`)
|
|
89
|
+
is removed, and `doctor` reports it until you add 1.x's launcher folder to your PATH (in
|
|
90
|
+
`~/.profile` or your shell's start-up file):
|
|
91
|
+
`export PATH="$HOME/.herdr-projects/data/bin:$PATH"`.
|
|
92
|
+
- **Herdr's config** loses 0.2's tab bar line, its key (`herdr-projects.open-popup`) and **both**
|
|
93
|
+
custom sidebar rows (agents and spaces): Herdr's own sidebar comes back. A
|
|
94
|
+
`[safety."~/.herdr-projects/<project>"]` section is left as it was, though that folder is now in
|
|
95
|
+
`~/.herdr-projects-legacy`: remove it or point it there.
|
|
96
|
+
- **Agents' settings** (Claude, Codex…) lose only 0.2's `herdr-projects … hook --agent …` hooks.
|
|
97
|
+
|
|
98
|
+
Do not run `herdr-projects update` on a machine that still had 0.2 before this step: install
|
|
99
|
+
1.2.1 as above.
|
|
100
|
+
|
|
101
|
+
## 3. Update wherdr
|
|
102
|
+
|
|
103
|
+
Installing a new version does not change a wherdr that is already running: restart it too.
|
|
104
|
+
|
|
105
|
+
- The installer (Herdr plugin, the recommended setup): `curl -fsSL https://wherdr.dev/install | sh`
|
|
106
|
+
again, or **U** in the **wherdr** panel. It fetches the GitHub release package directly, and
|
|
107
|
+
wherdr restarts on the new version.
|
|
108
|
+
- npm: `npm install -g wherdr@latest && wherdr restart` (npm may hold a new release for up to two
|
|
109
|
+
days).
|
|
110
|
+
- Homebrew: `brew upgrade wherdr && brew services restart wherdr`
|
|
111
|
+
- A 1.x Docker install: there is no 2.0 image; move to the native service first
|
|
112
|
+
([Migrate a 1.x Docker install](migrate-from-1.x-docker.md)).
|
|
113
|
+
|
|
114
|
+
Check the version wherdr now serves in **Settings › About**: 2.0 or later. Still 1.3.4 means the
|
|
115
|
+
old process is still running: restart it.
|
|
116
|
+
|
|
117
|
+
Open **Settings › Plugins › herdr-projects**: each machine says **Installed · v1.2.21**. The
|
|
118
|
+
**Board** (next to Settings) shows the tasks; write to the Coordinator in its box to add the
|
|
119
|
+
work your 0.2 projects still had.
|
|
120
|
+
|
|
121
|
+
## Push when a task needs you
|
|
122
|
+
|
|
123
|
+
herdr-projects tells you when a task needs you, is ready to approve, or failed, through its
|
|
124
|
+
`board.notify` setting: it can run a command for each event. Point it at Herdr's own
|
|
125
|
+
notifications, which wherdr already sends to your phone. Run once on each machine with
|
|
126
|
+
herdr-projects:
|
|
127
|
+
|
|
128
|
+
```sh
|
|
129
|
+
~/.herdr-projects/data/bin/herdr-projects set board.notify 'herdr notification show --body="$HERDR_PROJECTS_TITLE" --sound request -- "$HERDR_PROJECTS_ID · $HERDR_PROJECTS_EVENT"'
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
The push names the task and the event, and a tap opens the task on wherdr's Board. Back to
|
|
133
|
+
none: `herdr-projects set board.notify none`. Settings › Plugins › herdr-projects shows the
|
|
134
|
+
same command.
|
|
135
|
+
|
|
136
|
+
## Going back to 0.2
|
|
137
|
+
|
|
138
|
+
1. **Bring 1.x's agents to rest first**, so none keeps changing a repo while folders move.
|
|
139
|
+
Stopping the Coordinator is not enough: each task has its own agent (and its reviewer), and
|
|
140
|
+
machine and project coordinators are stopped apart. A Coordinator belongs to one Herdr
|
|
141
|
+
session while the plugin and its files are shared, so do this in each Herdr session where you
|
|
142
|
+
used 1.x's board.
|
|
143
|
+
|
|
144
|
+
```sh
|
|
145
|
+
hp=~/.herdr-projects/data/bin/herdr-projects
|
|
146
|
+
$hp list --all --json # every task, with its id and state
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Let each task that is working finish, or stop it with `$hp stop <id>`. Then stop the
|
|
150
|
+
coordinators you used:
|
|
151
|
+
|
|
152
|
+
```sh
|
|
153
|
+
$hp coordinator stop # the Coordinator of this session
|
|
154
|
+
$hp coordinator --machine stop # the machine coordinator
|
|
155
|
+
$hp coordinator --project <repo> stop # each project coordinator (one per repo)
|
|
156
|
+
herdr agent list # every agent of this Herdr session and its status
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Go on when none of the agents 1.x started (its tasks' agents and reviewers, its coordinators)
|
|
160
|
+
is still working. Leave the agents you started yourself alone.
|
|
161
|
+
|
|
162
|
+
2. **Take out 1.x's extras, then stop what still runs.** Herdr has no uninstall hook, so 1.x
|
|
163
|
+
cleans up outside its folders only when asked: its how-to files for agents, its blocks in
|
|
164
|
+
Herdr's config, and the herdr web UI's shared link if you pointed it at the board. Run this
|
|
165
|
+
while 1.x is still installed:
|
|
166
|
+
|
|
167
|
+
```sh
|
|
168
|
+
~/.herdr-projects/data/bin/herdr-projects remove-extras && echo "extras removed"
|
|
169
|
+
herdr plugin disable herdr-projects # its hooks and its board key
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Go on only after `extras removed`. `disable` does not stop what already runs. Close the work
|
|
173
|
+
board's tab in Herdr: that ends the board, but its `keeper` and `keeper-work` keep running. List
|
|
174
|
+
your processes that name herdr-projects:
|
|
175
|
+
|
|
176
|
+
```sh
|
|
177
|
+
ps -U "$(id -u)" -o pid=,args= | grep '[h]erdr-projects'
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
This is a list to read, not a list to stop. Stop with `kill <pid>` only a line whose program
|
|
181
|
+
is 1.x's in **your** HOME: `~/.config/herdr/plugins/…/herdr-projects-…/bin/herdr-projects-<system>`
|
|
182
|
+
or `~/.herdr-projects/data/bin/herdr-projects`, such as its `keeper`, `keeper-work`, `board`
|
|
183
|
+
and page server. Leave any other line: another HOME or install, a 0.2 program
|
|
184
|
+
(`…/target/release/herdr-projects`), or a command that only mentions the name. Run the list
|
|
185
|
+
again: none of the processes you stopped may still be there.
|
|
186
|
+
|
|
187
|
+
3. **Uninstall 1.x**: `herdr plugin uninstall herdr-projects`
|
|
188
|
+
|
|
189
|
+
4. **Put the 0.2 folders back.** 1.x wrote down where it put each one in
|
|
190
|
+
`~/.herdr-projects/moved.json`: `~/.herdr-projects-legacy`, or `-legacy-2`, `-legacy-3`… when an
|
|
191
|
+
older one was already there. Do not guess the names: this lists them, then puts each folder back.
|
|
192
|
+
A folder already at the old place (1.x's own board, or a folder created since) is set aside
|
|
193
|
+
first, as `<name>.from-1x-1` (or the next free number), never moved inside it. Running it a
|
|
194
|
+
second time changes nothing.
|
|
195
|
+
|
|
196
|
+
```sh
|
|
197
|
+
if [ ! -s ~/herdr-projects-restore.tsv ]; then
|
|
198
|
+
python3 - <<'PY' > ~/herdr-projects-restore.tsv.new && mv ~/herdr-projects-restore.tsv.new ~/herdr-projects-restore.tsv
|
|
199
|
+
import json, os
|
|
200
|
+
moved = json.load(open(os.path.expanduser('~/.herdr-projects/moved.json')))
|
|
201
|
+
for v in moved.get('legacy', {}).values():
|
|
202
|
+
print(v['from'] + '\t' + v['to'])
|
|
203
|
+
PY
|
|
204
|
+
fi
|
|
205
|
+
cat ~/herdr-projects-restore.tsv # each line: old place <tab> where 1.x put it
|
|
206
|
+
|
|
207
|
+
restore() {
|
|
208
|
+
dest=$1 src=$2
|
|
209
|
+
[ -e "$src" ] || { echo "not found, skipped: $src"; return 0; }
|
|
210
|
+
if [ -e "$dest" ] || [ -L "$dest" ]; then
|
|
211
|
+
n=1; while [ -e "$dest.from-1x-$n" ] || [ -L "$dest.from-1x-$n" ]; do n=$((n + 1)); done
|
|
212
|
+
mv "$dest" "$dest.from-1x-$n" && echo "set aside: $dest -> $dest.from-1x-$n" || return 1
|
|
213
|
+
fi
|
|
214
|
+
mv "$src" "$dest" && echo "restored: $src -> $dest"
|
|
215
|
+
}
|
|
216
|
+
tab=$(printf '\t')
|
|
217
|
+
while IFS="$tab" read -r from to; do restore "$from" "$to" || break; done < ~/herdr-projects-restore.tsv
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
1.x's own board is now in `~/.herdr-projects.from-1x-<n>`: keep it if you may come back to 1.x.
|
|
221
|
+
|
|
222
|
+
5. Put back the files 1.x changed.
|
|
223
|
+
- **Herdr's config: restore it from your own backup** (step 1 of the move), not from
|
|
224
|
+
`config.toml.bak-herdr-projects`. 1.x rewrites that one file at each change it makes to
|
|
225
|
+
Herdr's config (adding its own key, then taking it out again on uninstall), so it only holds the
|
|
226
|
+
state before its last change, without 0.2's lines. If step 1 said there was no `config.toml`
|
|
227
|
+
to keep, skip this: 0.2 had none.
|
|
228
|
+
|
|
229
|
+
First take the file out of the archive, into a new private folder, and have Herdr check it.
|
|
230
|
+
Nothing is replaced yet:
|
|
231
|
+
|
|
232
|
+
```sh
|
|
233
|
+
ok= && backup=$(cat ~/herdr-projects-0.2-backup.path) && tmp=$(mktemp -d) \
|
|
234
|
+
&& tar xzf "$backup" -C "$tmp" .config/herdr/config.toml \
|
|
235
|
+
&& [ -s "$tmp/.config/herdr/config.toml" ] \
|
|
236
|
+
&& XDG_CONFIG_HOME="$tmp/.config" herdr config check \
|
|
237
|
+
&& ok=1 && echo "checked: $tmp/.config/herdr/config.toml" || echo "STOP: nothing restored"
|
|
238
|
+
diff ~/.config/herdr/config.toml "$tmp/.config/herdr/config.toml" # what the restore changes
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Only after `checked`, in the same shell, keep the current file beside it and restore:
|
|
242
|
+
|
|
243
|
+
```sh
|
|
244
|
+
[ "$ok" = 1 ] && cp ~/.config/herdr/config.toml ~/.config/herdr/config.toml.before-0.2-restore \
|
|
245
|
+
&& cp "$tmp/.config/herdr/config.toml" ~/.config/herdr/config.toml && herdr server reload-config
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
- **Agents' settings** (Claude, Codex…): 1.x changes them once, so their
|
|
249
|
+
`<file>.bak-herdr-projects` is the file as it was before the move. Compare before restoring,
|
|
250
|
+
since the file may have changed since:
|
|
251
|
+
`diff ~/.claude/settings.json ~/.claude/settings.json.bak-herdr-projects`, then
|
|
252
|
+
`cp ~/.claude/settings.json.bak-herdr-projects ~/.claude/settings.json` (same for
|
|
253
|
+
`~/.codex/hooks.json` and the others `doctor` named).
|
|
254
|
+
6. Reinstall 0.2 from the fork wherdr 1.3.4 installs, pinned to `v0.2.36`: the command is in
|
|
255
|
+
wherdr 1.3.4's README and in its **Settings › Plugins › herdr-projects**. `v0.2.36` exists only on
|
|
256
|
+
that fork: upstream's last 0.2 tag is `v0.2.35`, whose `herdr-projects update` would offer 1.x
|
|
257
|
+
again. The install puts the `herdr-projects` link back on your PATH.
|
|
258
|
+
7. Go back to wherdr 1.3.4, and restart it:
|
|
259
|
+
- The installer (Herdr plugin): `curl -fsSL https://wherdr.dev/install | WHERDR_REF=v1.3.4 sh`
|
|
260
|
+
(wherdr restarts on that version).
|
|
261
|
+
- npm: `npm install -g wherdr@1.3.4 && wherdr restart`
|
|
262
|
+
- Homebrew installs only the newest version: for 1.3.4, `brew services stop wherdr && brew uninstall wherdr`,
|
|
263
|
+
then use npm as above.
|
|
264
|
+
|
|
265
|
+
**Settings › About** must say 1.3.4: 2.0 there means the old process still runs.
|
|
266
|
+
|
|
267
|
+
If anything is missing, the backup from step 1 of the move has everything as it was:
|
|
268
|
+
`cd ~ && tar xzf "$(cat ~/herdr-projects-0.2-backup.path)"` (with herdr-projects stopped).
|
|
269
|
+
|
|
270
|
+
## Moving from Docker to the native service
|
|
271
|
+
|
|
272
|
+
wherdr 2.0 has no Docker image: it runs only natively, as your user, where the Board can act.
|
|
273
|
+
Published 1.x images stay on GHCR as they are, for those who stay on 1.x. The native service
|
|
274
|
+
keeps the same port and the same data folder, so passkeys, notifications and the address your
|
|
275
|
+
devices open keep working.
|
|
276
|
+
|
|
277
|
+
Follow [Migrate a 1.x Docker install](migrate-from-1.x-docker.md): back up, stop the container,
|
|
278
|
+
install the native service, check, and go back if needed. It is written so an AI agent can run it.
|
package/docs/home.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Home and agent list
|
|
2
|
+
|
|
3
|
+
[Documentation](README.md) · [Project](../README.md)
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
### Everywhere
|
|
8
|
+
|
|
9
|
+
- **Home grouping**: Settings › Appearance › Home screen › **Group by** chooses **Machine**
|
|
10
|
+
(default, projects under their coordinator) or **State** (Needs you, Working, Ready merged
|
|
11
|
+
across online machines). State mode adds machine and project badges to flat cards; the
|
|
12
|
+
machine bar and its groups filter both modes. Compact/normal applies to both. In State mode,
|
|
13
|
+
a row of machine chips at the top opens each machine's menu (sessions, keep awake, board,
|
|
14
|
+
Claude quota setup), and offline or reconnecting machines stay on one line at the bottom.
|
|
15
|
+
- **Live agent list**, one line per Herdr space, grouped by state (your turn, working, ready).
|
|
16
|
+
The list is normal by default; turn on Settings › Appearance › Home screen › **Compact list**
|
|
17
|
+
for one line per card (agent, title, project badge and state). When an agent asks for
|
|
18
|
+
permission or asks a question, its card opens on the question and its options: **answer in one
|
|
19
|
+
tap** without opening it; the card is one line again once answered. Board tasks use one line in
|
|
20
|
+
compact mode (agent, key, title, progress, duration, state and Your turn when needed); normal
|
|
21
|
+
mode adds the current activity and relevant limit or review labels on a second line. Task
|
|
22
|
+
details stay in the task sheet. A compact list turned on in 1.x goes back to normal once, on
|
|
23
|
+
the first 2.0 load; turning it on again is kept. Other agents
|
|
24
|
+
also use dense rows, with a last-answer preview in normal mode; waiting agents keep their
|
|
25
|
+
questions and one-tap answers in both modes.
|
|
26
|
+
With [herdr-projects](board.md#works-great-with-herdr-projects), the board's spaces follow Herdr's sidebar:
|
|
27
|
+
the Coordinators on top, then one group per repo, headed by its project coordinator (the repo's
|
|
28
|
+
name, the wherdr mark, **Coordinator** and its state), a bar that folds the group and sums up its
|
|
29
|
+
tasks (`4 TASKS · 1 YOUR TURN · 1 LIMIT`, the branch and `↓` commits behind its upstream, the
|
|
30
|
+
repo space's menu), then its tasks, indented (key, title, progress, time on it, the board's
|
|
31
|
+
current line). A remote coordinator link replaces the local coordinator above the bar.
|
|
32
|
+
Without a coordinator, the group starts with the bar; the repo terminal opens from its **…**
|
|
33
|
+
menu. Closing a space that holds task agents names the tasks it stops.
|
|
34
|
+
- **New agent**: pick an installed agent (or a plain terminal), a folder, optionally a separate
|
|
35
|
+
Git **worktree** and branch, resume the last conversation, and queue a first message.
|
|
36
|
+
- **Machine bar**: at the top of the list, “All”, then each machine with its state and count; a
|
|
37
|
+
tap shows one machine alone, without its header: its Claude and Codex quotas sit together at
|
|
38
|
+
the top, and an offline or reconnecting machine says so there. Right click (long press on a
|
|
39
|
+
phone) a machine's tab for its actions, those of its **…** menu; on a group's tab, for **Group
|
|
40
|
+
settings**. Settings › Appearance › Home screen › **Machine bar** orders its
|
|
41
|
+
items, takes some off it or hides it (saved on the server). A machine's **…** menu opens the
|
|
42
|
+
Board filtered on it (**Open the board**). In **Groups**, create a named selection of machines,
|
|
43
|
+
check its members and drag their handles to set their order. Groups appear after All by default,
|
|
44
|
+
with their combined task count and a group icon; order or hide them alongside the machines.
|
|
45
|
+
Choosing a group shows its members in the group's order. Groups follow you across devices.
|
|
46
|
+
Switching selections keeps the current conversation if it belongs there; otherwise the desktop
|
|
47
|
+
restores that selection's last conversation on this device, then its machine coordinator (a group's
|
|
48
|
+
first online machine), or the empty view. All always keeps the current conversation. Phones keep
|
|
49
|
+
the list first and check the same rule when reopening a conversation through browser history.
|
|
50
|
+
Explicit choices from search, cards or links open the chosen conversation. Unsent drafts stay saved.
|
|
51
|
+
- **Named Herdr sessions**, **quotas** (remaining Claude and Codex usage limits), **Herdr plugin
|
|
52
|
+
actions** in the menus, **passkey lock** (Face ID, Touch ID, Windows Hello, Android…).
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# Installation and updates
|
|
2
|
+
|
|
3
|
+
**Upgrading to 2.0.0?** Read the [release notes](release-notes-2.0.0.md) for breaking changes and the 1.x migration checklist.
|
|
4
|
+
|
|
5
|
+
[Documentation](README.md) · [Project](../README.md)
|
|
6
|
+
|
|
7
|
+
## Requirements
|
|
8
|
+
|
|
9
|
+
- **Herdr ≥ 0.9.1** running on the server (`herdr` or `herdr server`), with its Claude Code /
|
|
10
|
+
Codex / omp integrations installed if you use them (`herdr integration install claude|codex|omp`).
|
|
11
|
+
omp's conversation is only found through its integration, which reports the session file.
|
|
12
|
+
- **Linux or macOS** server with **Node.js 22** or newer (the installer offers to install it).
|
|
13
|
+
wherdr runs natively, as the user who runs Herdr.
|
|
14
|
+
- **HTTPS** to use passkeys, push notifications and the installable app from another device.
|
|
15
|
+
Browsers only allow them on `https://` or `http://localhost`. The easiest way is
|
|
16
|
+
[`tailscale serve`](https://tailscale.com/kb/1312/serve); a reverse proxy **reachable only
|
|
17
|
+
from your private network** with a valid certificate also works (see
|
|
18
|
+
[Other private networks](networks.md#other-private-networks)).
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
### Ask your AI agent
|
|
23
|
+
|
|
24
|
+
**Recommended.** Paste this into Claude Code, Codex or any coding agent: it installs and sets up wherdr for you.
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
Read https://wherdr.dev/agent.md and help me set up wherdr. Check what is already installed first, and ask me before installing anything.
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
It follows [our setup guide for agents](https://wherdr.dev/agent.md): checks what you already have,
|
|
31
|
+
asks before installing anything, sets up your phone over Tailscale, never exposes wherdr to the Internet.
|
|
32
|
+
|
|
33
|
+
<a id="the-one-command"></a>
|
|
34
|
+
|
|
35
|
+
### Or run the installer yourself
|
|
36
|
+
|
|
37
|
+
On the computer that runs Herdr, as your user, on macOS or Linux:
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
curl -fsSL https://wherdr.dev/install | sh
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The script ([read it first](https://wherdr.dev/install), source in
|
|
44
|
+
[`website/public/install`](../website/public/install)) never uses sudo. It:
|
|
45
|
+
|
|
46
|
+
1. checks **Herdr ≥ 0.9.1**; without it, it stops with the link to [herdr.dev](https://herdr.dev);
|
|
47
|
+
2. leaves alone a wherdr that **already answers** on the port: a Herdr plugin install is offered
|
|
48
|
+
its update, anything else is left as it is;
|
|
49
|
+
3. checks **Node.js 22** or newer (or Bun), in your `PATH` and in the folders of n, nvm, fnm,
|
|
50
|
+
Volta, asdf and Homebrew. Without it, it asks before installing it: `brew install node` on a
|
|
51
|
+
Mac with Homebrew, otherwise the official Node.js 22 build from nodejs.org, its checksum
|
|
52
|
+
checked, unpacked in `~/wherdr/node` (used by wherdr only: your `PATH` is not changed). With
|
|
53
|
+
musl libc (Alpine) it gives the install links instead;
|
|
54
|
+
4. runs `herdr plugin install afloury/wherdr --yes`: the [Herdr plugin](plugins.md#install-as-a-herdr-plugin)
|
|
55
|
+
downloads the GitHub release package of its version (checksum checked, no wait for npm),
|
|
56
|
+
installs it in `~/wherdr/app`, starts it on `http://localhost:7683`, opens the setup guide in
|
|
57
|
+
your browser (first install) and binds **prefix+i** to its panel;
|
|
58
|
+
5. configures automatic startup with `wherdr service install`: **at login on macOS** with a
|
|
59
|
+
LaunchAgent; **at boot on Linux when lingering is enabled**, otherwise **at login**, with a
|
|
60
|
+
`systemd --user` unit. It tries to enable lingering (`loginctl enable-linger`, allowed for
|
|
61
|
+
your own user without sudo on most systems), which also keeps wherdr running after logout.
|
|
62
|
+
Without lingering, wherdr stops after logout. The installer checks lingering after installation
|
|
63
|
+
and reports which case applies, or says when it cannot verify it. The service gets
|
|
64
|
+
your login shell's `PATH`, so the agents you installed in `~/.local/bin`, `~/.bun/bin`,
|
|
65
|
+
`~/.cargo/bin`, `~/.npm-global/bin` or Homebrew are found (see [Agent PATH](installation.md#agent-path)). Each
|
|
66
|
+
run installs it again, with the `PATH` of now. If this step fails (no systemd), nothing of it
|
|
67
|
+
is left, wherdr is started again and keeps starting with Herdr, and the script says how to
|
|
68
|
+
retry;
|
|
69
|
+
6. on a computer **without a screen** (no `DISPLAY` on Linux, or an SSH session): opens nothing,
|
|
70
|
+
prints the local address, an `ssh -L` tunnel to reach it from your computer, and the phone
|
|
71
|
+
steps (`wherdr phone`: Tailscale state, the address, the QR code once it answers). Run the
|
|
72
|
+
command again at any time to check the phone address.
|
|
73
|
+
|
|
74
|
+
Settings, as environment variables (`curl -fsSL https://wherdr.dev/install | WHERDR_PORT=7684 sh`):
|
|
75
|
+
|
|
76
|
+
| Variable | Default | Meaning |
|
|
77
|
+
| --- | --- | --- |
|
|
78
|
+
| `WHERDR_DIR` | `~/wherdr` | Install folder (plugin settings, data, log). |
|
|
79
|
+
| `WHERDR_PORT` | `7683` | Local port. |
|
|
80
|
+
| `WHERDR_SERVICE` | — | `off`: no login service; wherdr then starts with Herdr only (the plugin's startup hook). |
|
|
81
|
+
| `WHERDR_YES` | — | `1` answers yes to every question (non-interactive use), installing Node.js included. |
|
|
82
|
+
| `WHERDR_NO_BROWSER` | — | `1` never opens a browser. |
|
|
83
|
+
| `WHERDR_REF` | main | Git tag or branch of the plugin. |
|
|
84
|
+
| `WHERDR_PLUGIN` | `afloury/wherdr` | A local checkout to link and build instead (development, tests). |
|
|
85
|
+
|
|
86
|
+
Update: run the command again (it offers the update), **U** in the wherdr panel, or **Update** in
|
|
87
|
+
the app: all three fetch the GitHub release package directly.
|
|
88
|
+
|
|
89
|
+
#### Agent PATH
|
|
90
|
+
|
|
91
|
+
systemd and launchd start services with a short system `PATH`, and herdr-projects, run by
|
|
92
|
+
wherdr for the Board, then reports `claude is not installed here` for an agent installed in a
|
|
93
|
+
user folder. wherdr gives it the `PATH` an interactive login shell would have, on the host and
|
|
94
|
+
over SSH, in this order: the `PATH` your login shell gives (asked once by `wherdr service
|
|
95
|
+
install`), the one herdr-projects records in `~/.herdr-projects/data/env.json`
|
|
96
|
+
(`$HERDR_PROJECTS_DATA_DIR`, or `$HERDR_PROJECTS_HOME/data`), then `~/.local/bin`, `~/.bun/bin`,
|
|
97
|
+
`~/.cargo/bin`, `~/.npm-global/bin`, `~/.deno/bin`, `~/.volta/bin`, `~/bin`, Homebrew's folders and
|
|
98
|
+
`/usr/local/bin` when they exist, then the `PATH` it was started with and the system folders. Your
|
|
99
|
+
own folders come before the system ones, as in your shell: an old system-wide copy of an agent
|
|
100
|
+
never wins over yours. After installing
|
|
101
|
+
an agent somewhere else, run `wherdr service install` again (or the one command).
|
|
102
|
+
|
|
103
|
+
### Which setup?
|
|
104
|
+
|
|
105
|
+
| | **Always-on server + Tailscale** (recommended) | **One computer** |
|
|
106
|
+
| --- | --- | --- |
|
|
107
|
+
| Runs on | A machine that never sleeps: Raspberry Pi, mini-PC, home server, private VPS (Linux) | The computer you work on (macOS or Linux) |
|
|
108
|
+
| Reach it from | Your phone and every computer on your tailnet | That computer only (`http://localhost:7683`) |
|
|
109
|
+
| Installable app, push notifications, passkeys | Yes (private HTTPS from `tailscale serve`) | Desktop browser only; no phone access |
|
|
110
|
+
| Other machines (a Mac, a laptop…) | Added in Herdr over SSH, shown in wherdr | Also possible, but they are only reachable while this computer is awake |
|
|
111
|
+
|
|
112
|
+
Both use [the one command](installation.md#the-one-command) and the same app. You can start with the second one
|
|
113
|
+
and move to the first later.
|
|
114
|
+
|
|
115
|
+
### Moving from Docker to the native service
|
|
116
|
+
|
|
117
|
+
wherdr 2.0 runs only natively as your user. Published 1.x images remain on GHCR for users
|
|
118
|
+
staying on 1.x. To keep your port, passkeys and settings when moving, follow the
|
|
119
|
+
[Docker migration guide](migrate-from-1.x-docker.md): verifiable steps, with a way back,
|
|
120
|
+
that you can also hand to an AI agent ("read this file and migrate me").
|
|
121
|
+
|
|
122
|
+
## Updating
|
|
123
|
+
|
|
124
|
+
wherdr checks the latest GitHub release at most once a day (an anonymous request to
|
|
125
|
+
`api.github.com`, nothing is sent) and shows a small **“wherdr X.Y.Z is available”** banner on the
|
|
126
|
+
home screen and in Settings › About, with the release notes and the exact command for your setup.
|
|
127
|
+
Hide it until the next version with ×. Set `WHERDR_UPDATE_CHECK=off` to disable the check. The
|
|
128
|
+
installed version is shown in Settings › About.
|
|
129
|
+
|
|
130
|
+
GitHub release packages (including the bundled agent skill) and Homebrew
|
|
131
|
+
updates are published without waiting for npm moderation. Native plugin installs and updates
|
|
132
|
+
use the GitHub `.tgz` and verify its SHA-256 checksum before extraction. A failed one-tap
|
|
133
|
+
download or checksum check leaves the running version in place. Plugin installation tries
|
|
134
|
+
GitHub first, then the prebuilt npm package of the exact same version (with its registry integrity hash), and only builds from source when neither works.
|
|
135
|
+
This also keeps older 1.3.x releases without GitHub archives installable with Node.js or Bun.
|
|
136
|
+
Packages predating the bundled skill retain the plugin checkout's commands and skill, so
|
|
137
|
+
skill refresh, installation and uninstallation remain available.
|
|
138
|
+
The installer fetches `main` explicitly unless you set `WHERDR_REF`.
|
|
139
|
+
|
|
140
|
+
The SHA-256 checksum detects damaged downloads. It is served beside the archive, so someone
|
|
141
|
+
who can replace both files can make them match; it does not prove the publisher’s identity
|
|
142
|
+
or protect against replacement of the archive and checksum together.
|
|
143
|
+
|
|
144
|
+
`npm install -g`, `npx`, `bunx` and `pnpm dlx` still need npm to serve the wherdr package.
|
|
145
|
+
Their banner waits for registry availability; Homebrew's banner waits for its formula.
|
|
146
|
+
Versions through 1.3.2 use GitHub's `latest` marker and an npm-based updater. That marker only
|
|
147
|
+
advances once npm **and** Homebrew are ready, so their existing Update button continues to work.
|
|
148
|
+
To update an older native plugin earlier, rerun the installer or press **U** in its Herdr panel.
|
|
149
|
+
See [Releasing](RELEASING.md) for the publication order and recovery steps.
|
|
150
|
+
|
|
151
|
+
**Update in one tap.** When wherdr runs from the Herdr plugin (Node.js mode), a global npm install
|
|
152
|
+
or Homebrew, the banner has an **Update** button instead of the command, on every device that can
|
|
153
|
+
open wherdr (this computer and your tailnet; unlocked, when a passkey is set). wherdr installs the new version in a
|
|
154
|
+
process of its own, restarts, and checks that `/api/health` reports the new version within 60
|
|
155
|
+
seconds; the app shows the progress and reloads on the new version. If the new version does not
|
|
156
|
+
answer, wherdr goes back to the previous one by itself (the plugin keeps the previous copy in
|
|
157
|
+
`~/wherdr/app.prev`, npm reinstalls the previous version, Homebrew points back to the previous keg)
|
|
158
|
+
and the app says so. Every step is logged in `~/wherdr/update.log`.
|
|
159
|
+
|
|
160
|
+
| Setup | What Update does |
|
|
161
|
+
| --- | --- |
|
|
162
|
+
| The one command / Herdr plugin, Node.js | Verifies and unpacks the GitHub release package of the new version into `~/wherdr/app`, keeps the old copy, restarts (the login service included) |
|
|
163
|
+
| `npm install -g wherdr` | `npm install -g wherdr@X.Y.Z`, then restarts (login service included) |
|
|
164
|
+
| Homebrew | `brew upgrade wherdr`, then `brew services restart wherdr` |
|
|
165
|
+
|
|
166
|
+
`npx wherdr` runs from a temporary folder: run `npx wherdr@latest` again.
|
|
167
|
+
|
|
168
|
+
| Setup | Update command (in the wherdr folder) |
|
|
169
|
+
| --- | --- |
|
|
170
|
+
| The one command | Run `curl -fsSL https://wherdr.dev/install \| sh` again: it offers the update (GitHub release package) |
|
|
171
|
+
| Herdr plugin, Node.js | **U** in the **wherdr** panel, or `herdr plugin install afloury/wherdr --yes` (wherdr restarts on the new version) |
|
|
172
|
+
| `wherdr` command (npm) | `npm install -g wherdr@latest && wherdr restart` (npx: stop it, then `npx wherdr@latest`) |
|
|
173
|
+
| `wherdr` command (Homebrew) | `brew upgrade wherdr`, then `brew services restart wherdr` |
|
|
174
|
+
| From source | `git pull && npm ci && npm run build`, then restart wherdr |
|