@axelgar/opentree 1.0.1 → 1.1.0

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 (4) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +54 -0
  3. package/README.md +78 -4
  4. package/package.json +8 -6
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Àxel García Roigé
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/NOTICE ADDED
@@ -0,0 +1,54 @@
1
+ opentree — third-party notices
2
+ ==============================
3
+
4
+ opentree itself is distributed under the MIT Licence; see LICENSE. This file
5
+ records the third-party names, marks and code that opentree touches, and the
6
+ rights it does not claim in them.
7
+
8
+
9
+ Trade marks
10
+ -----------
11
+
12
+ opentree drives coding agents it did not write. It draws each one under that
13
+ agent's own name, wordmark and brand colour so that the agent you are talking
14
+ to is identifiable at a glance, and those wordmarks are reproduced as terminal
15
+ text in pkg/config/agents.go, transcribed from each tool's own splash screen.
16
+
17
+ opencode "opencode", its wordmark and the colour #CFCECD are marks of
18
+ the opencode project.
19
+
20
+ Claude Code "Anthropic", "Claude", "Claude Code", the Claude mark and
21
+ the colour #D97757 are marks of Anthropic PBC.
22
+
23
+ GitHub Copilot "GitHub", "Copilot", "GitHub Copilot", the Copilot mark and
24
+ the colour #A371F7 are marks of GitHub, Inc.
25
+
26
+ Gemini CLI "Google", "Gemini", "Gemini CLI", the Gemini sparkle and the
27
+ colour #4285F4 are marks of Google LLC.
28
+
29
+ All trade marks, service marks, trade names and logos are the property of their
30
+ respective owners. They appear here only to identify the tools opentree can
31
+ drive, descriptively and accurately, and no claim of any right in them is made
32
+ or implied.
33
+
34
+ opentree is an independent project. It is not affiliated with, sponsored by,
35
+ endorsed by or otherwise connected to any of the owners named above; none of
36
+ them has reviewed or approved it, and its MIT licence grants no rights in
37
+ anyone's marks.
38
+
39
+ If you own one of these marks and would prefer opentree did not reproduce it,
40
+ open an issue at https://github.com/axelgar/opentree/issues and it will be
41
+ changed.
42
+
43
+
44
+ Third-party code
45
+ ----------------
46
+
47
+ opentree redistributes no code belonging to the projects above. The one adapter
48
+ it needs — @agentclientprotocol/claude-agent-acp, which bridges Claude Code onto
49
+ the Agent Client Protocol — is fetched from npm when the user asks for it and
50
+ installed under ~/.opentree/tools, under its own licence. `opentree uninstall`
51
+ removes that directory again.
52
+
53
+ The Go modules opentree links against are listed in go.mod and carry their own
54
+ licences.
package/README.md CHANGED
@@ -26,7 +26,7 @@ opentree is a cross-platform CLI tool that manages multiple AI coding agent sess
26
26
  ## Requirements
27
27
 
28
28
  - **Git** (2.5+) - for worktree support
29
- - **tmux** (3.0+) - for session orchestration
29
+ - **tmux** (3.0+) - for session orchestration (3.2+ to type `shift+enter` in the chat)
30
30
  - **A coding agent** (optional) - OpenCode (the default), Claude Code, GitHub Copilot CLI or Gemini CLI
31
31
  - **GitHub CLI** (`gh`) (optional) - for PR creation and issue fetching ([install](https://cli.github.com/))
32
32
  - **Node** (optional) - only to run Claude Code through its ACP adapter
@@ -60,6 +60,16 @@ sudo mv opentree /usr/local/bin/
60
60
  go install github.com/axelgar/opentree/cmd/opentree@latest
61
61
  ```
62
62
 
63
+ ### Uninstalling
64
+
65
+ ```bash
66
+ opentree uninstall
67
+ ```
68
+
69
+ Removes what opentree wrote into your home directory: the agent adapters under `~/.opentree/tools` (a few hundred megabytes each), the record of approved setup and run commands, the shell completion script and the global config file. It lists all of it with sizes and asks before removing anything — `--dry-run` lists and stops, `--yes` answers the question from a script.
70
+
71
+ It never touches a repository. The worktrees under `<repo>/.opentree` are your own work in progress, and `opentree delete <branch>` is what removes those. The binary belongs to whichever of brew, npm or `go install` put it there, so the command that removes it is printed at the end.
72
+
63
73
  ## Quick Start
64
74
 
65
75
  ```bash
@@ -187,7 +197,8 @@ agent's own logo, in its own colours:
187
197
  | Key | |
188
198
  | --- | --- |
189
199
  | `enter` | send |
190
- | `ctrl+j` | newline |
200
+ | `shift+enter` | newline — `ctrl+j` where the terminal cannot report modifiers |
201
+ | `↑` / `↓` | walk back through the messages already sent, and forward again |
191
202
  | `/` | slash commands — the agent's own, plus `/resume`, `/login`, `/model` and the rest |
192
203
  | `@` | attach a file from this worktree |
193
204
  | `ctrl+v` | paste — an image on the clipboard is attached, anything else is text |
@@ -197,6 +208,20 @@ agent's own logo, in its own colours:
197
208
  | `ctrl+o` | show or hide the agent's reasoning |
198
209
  | `?` | every key |
199
210
 
211
+ **Newlines.** `shift+enter` breaks the line instead of sending it, with nothing
212
+ to configure. A terminal left to itself sends a bare carriage return for
213
+ `shift+enter` — the same byte `enter` sends, and nothing downstream can tell the
214
+ two apart — so the chat asks it for modified keys on the way in (xterm's
215
+ `modifyOtherKeys`, level 1, put back on the way out), and sets `extended-keys`
216
+ on its own tmux session so tmux passes them through. That is the whole reason
217
+ the key works here and not in every terminal program.
218
+
219
+ Level 1 is the conservative request: only keys that had no encoding of their own
220
+ gain one, so `esc`, `ctrl+j` and the arrows are the bytes they always were, and a
221
+ window running something else is untouched — tmux only forwards modified keys to
222
+ programs that ask for them. In a terminal that cannot report modifiers at all
223
+ (Terminal.app), `ctrl+j` and `alt+enter` still do it.
224
+
200
225
  **Images.** Press `ctrl+v` to attach a screenshot from the clipboard, or drag one
201
226
  onto the terminal. Either way the path collapses into `[image · shot.png · 412 KB]`
202
227
  in the message you are writing — backspace over it and the attachment goes with
@@ -206,6 +231,12 @@ terminal asked to paste a picture sends nothing at all. An agent that does not
206
231
  take images gets the path as a link instead, and the chat says so rather than
207
232
  letting the difference go unnoticed.
208
233
 
234
+ **Messages you already sent.** `↑` puts the last one back in the box, `↓` walks
235
+ forward again, and coming back past the newest returns whatever was half typed
236
+ when you started looking — so a prompt worth repeating, or repeating with one
237
+ word changed, is a keypress away rather than a retype. Inside a message the
238
+ arrows still move the cursor: they only recall from its first and last row.
239
+
209
240
  **Earlier conversations.** `/resume` lists what this worktree has already
210
241
  talked about — newest first, by what each conversation was about — and picking
211
242
  one reopens it in place, history and all. The list is the agent's own where it
@@ -227,7 +258,7 @@ is queued rather than refused.
227
258
  themselves, so having the binary is the whole setup. Claude Code is reached
228
259
  through the `claude-agent-acp` adapter, which opentree installs on request into
229
260
  `~/.opentree/tools` rather than your global npm root — press `A` in the
230
- dashboard, pick Claude Code, and it offers the download (303MB, needs `node`).
261
+ dashboard, pick Claude Code, and it offers the download (340MB, needs `node`).
231
262
 
232
263
  Those four are the whole list. opentree drives agents over ACP and nothing else,
233
264
  so an agent without an ACP server has no way in — if one ships support, it
@@ -618,6 +649,30 @@ opentree delete feat/add-dark-mode
618
649
 
619
650
  ## Troubleshooting
620
651
 
652
+ ### Start here: `opentree doctor`
653
+
654
+ ```bash
655
+ opentree doctor
656
+ ```
657
+
658
+ Prints what opentree can see — its own version, the versions of git, tmux, gh
659
+ and node, which config file it resolved and what it says, whether this
660
+ repository's setup commands are approved, where state and sockets live, and
661
+ what each workspace's chat is doing. Everything it does is a read, so it is
662
+ safe to run and safe to paste into an issue.
663
+
664
+ If a problem needs reproducing rather than describing, point opentree at a log
665
+ first:
666
+
667
+ ```bash
668
+ OPENTREE_LOG=/tmp/opentree.log opentree
669
+ ```
670
+
671
+ An environment variable rather than a flag, because the interesting failures
672
+ happen inside `opentree chat`, which a tmux window starts rather than you — and
673
+ the variable is inherited by every process opentree launches. Off by default.
674
+ The file holds branch names, paths and session ids, and is written `0600`.
675
+
621
676
  ### "Error: not a git repository"
622
677
 
623
678
  opentree must be run from inside a git repository. Navigate to your project root first.
@@ -690,12 +745,31 @@ go build -o opentree ./cmd/opentree
690
745
 
691
746
  ### Architecture
692
747
 
693
- See [PLAN.md](PLAN.md) for detailed architecture documentation.
748
+ `cmd/opentree` is the CLI surface; `pkg/` is where the work happens.
749
+
750
+ | package | what it owns |
751
+ | --- | --- |
752
+ | `tui` | the dashboard: the workspace list, the Skills and Servers tabs |
753
+ | `chat` | the conversation view, and the control socket the dashboard reaches it through |
754
+ | `acp` | the Agent Client Protocol client — the agent subprocess and its stdio |
755
+ | `workspace` | a workspace's lifecycle, over the four below it |
756
+ | `worktree` | git worktrees and branches |
757
+ | `tmux` | sessions and windows |
758
+ | `state` | `state.json`, shared between the dashboard and every chat |
759
+ | `github` | `gh`, for PRs, issues and CI status |
760
+ | `bootstrap` | seeding a worktree, running its setup, and the trust gate over those commands |
761
+ | `skills` | propagating agent skills into worktrees |
762
+ | `config` | `opentree.toml` and the agent registry |
763
+ | `notify`, `diag`, `ui`, `fsutil`, `gitutil` | the small shared pieces |
694
764
 
695
765
  ## License
696
766
 
697
767
  MIT License - see [LICENSE](LICENSE) for details.
698
768
 
769
+ ## Trademarks
770
+
771
+ opentree draws each agent it drives — opencode, Claude Code, GitHub Copilot and Gemini CLI — under that agent's own wordmark and brand colour, so you can see at a glance which one you are talking to. Those marks belong to their respective owners. opentree is an independent project and is not affiliated with, sponsored by or endorsed by any of them. See [NOTICE](NOTICE).
772
+
699
773
  ## Acknowledgments
700
774
 
701
775
  - Inspired by [Conductor.build](https://conductor.build) by Sahil Lavingia
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axelgar/opentree",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "Git worktree manager CLI for orchestrating parallel AI coding sessions",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,13 +12,15 @@
12
12
  "opentree": "bin/opentree"
13
13
  },
14
14
  "files": [
15
- "bin/opentree"
15
+ "bin/opentree",
16
+ "LICENSE",
17
+ "NOTICE"
16
18
  ],
17
19
  "optionalDependencies": {
18
- "@axelgar/opentree-linux-x64": "1.0.1",
19
- "@axelgar/opentree-linux-arm64": "1.0.1",
20
- "@axelgar/opentree-darwin-x64": "1.0.1",
21
- "@axelgar/opentree-darwin-arm64": "1.0.1"
20
+ "@axelgar/opentree-linux-x64": "1.1.0",
21
+ "@axelgar/opentree-linux-arm64": "1.1.0",
22
+ "@axelgar/opentree-darwin-x64": "1.1.0",
23
+ "@axelgar/opentree-darwin-arm64": "1.1.0"
22
24
  },
23
25
  "engines": {
24
26
  "node": ">=18"