{"_id":"@axelgar/opentree","_rev":"20-166dc646b55c63272803a152678f6060","name":"@axelgar/opentree","dist-tags":{"latest":"1.3.0"},"versions":{"0.0.0":{"name":"@axelgar/opentree","version":"0.0.0","license":"MIT","_id":"@axelgar/opentree@0.0.0","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"8c46f931c69b0f8fc9b0662f60f3d0ae414ab31b","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.0.0.tgz","fileCount":2,"integrity":"sha512-91qxQ1bQOYpUoYXbVSYJgqLTP/8brpYGNQjLmD6fFd/bbtZqiku/BHMItQDiU0ev+65YN5DXt4BNS8iqCgRx9g==","signatures":[{"sig":"MEUCIBZWsytyB5yGwGq6z3YkXEe3WT0XXmq2sZ/16rplbhd8AiEAva8aO7ac+tNk2Crge8W2GdGA7aRAyAU5w6so58VRqwE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1880},"engines":{"node":">=18"},"gitHead":"a368817202b56e2ea322160328b5e8bbf428a7c7","_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.9.0","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"23.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.0.0","@axelgar/opentree-darwin-x64":"0.0.0","@axelgar/opentree-linux-arm64":"0.0.0","@axelgar/opentree-darwin-arm64":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.0.0_1773218157670_0.08780393410639808","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@axelgar/opentree","version":"0.1.14","license":"MIT","_id":"@axelgar/opentree@0.1.14","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"09337995f850f056f4b117ad780c684d93dd7e12","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.14.tgz","fileCount":3,"integrity":"sha512-0MLWsKYSZGIBO57ppJZoCR8uf5vwbHZgajEbZPaNeGnsy/1myiEeB1VwWrZ52lBeQKHromNKyxWPEq/txVn0gQ==","signatures":[{"sig":"MEUCIQD09cRyRamcNzb3mfKBbsx5x/lFodYt92WXmedQNask1QIgGYD6vpNTwry2+DhnY/4dO2aT8EAqnuNm82ctqTzhIhk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11370},"_from":"file:/tmp/axelgar-opentree-0.1.14.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.14.tgz","_integrity":"sha512-0MLWsKYSZGIBO57ppJZoCR8uf5vwbHZgajEbZPaNeGnsy/1myiEeB1VwWrZ52lBeQKHromNKyxWPEq/txVn0gQ==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.14","@axelgar/opentree-darwin-x64":"0.1.14","@axelgar/opentree-linux-arm64":"0.1.14","@axelgar/opentree-darwin-arm64":"0.1.14"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.14_1773219581708_0.1922331827624626","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@axelgar/opentree","version":"0.1.15","license":"MIT","_id":"@axelgar/opentree@0.1.15","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"6ee8e19adbf4cce07bd36e09a8b39193e6a6942b","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.15.tgz","fileCount":3,"integrity":"sha512-SqM62EIKKMSDhhnmGVd2MF31GX1xnvE2P8i5uiJHuh5hpeW2pZUqNNP40JXMHo4CWQmJ9Af7UKv6QLvyk0RVJQ==","signatures":[{"sig":"MEQCICscQ3Ge6Tk291RItq9sPW2uRF8MfDooqqCS33d3nRsZAiBC3p4kfPfde8m+uMO9qvbzifxphgsywiaJejDShAfwhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11370},"_from":"file:/tmp/axelgar-opentree-0.1.15.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.15.tgz","_integrity":"sha512-SqM62EIKKMSDhhnmGVd2MF31GX1xnvE2P8i5uiJHuh5hpeW2pZUqNNP40JXMHo4CWQmJ9Af7UKv6QLvyk0RVJQ==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.15","@axelgar/opentree-darwin-x64":"0.1.15","@axelgar/opentree-linux-arm64":"0.1.15","@axelgar/opentree-darwin-arm64":"0.1.15"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.15_1773324919804_0.6441626742648656","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@axelgar/opentree","version":"0.1.16","license":"MIT","_id":"@axelgar/opentree@0.1.16","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"529e5d5b78313721dbc53674167e1c812467c1b9","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.16.tgz","fileCount":3,"integrity":"sha512-NsHB0q7ftRXlO4fC2rdBFsbTUD+HLq9aNakSa3amnhEhGCx8BjJkh0d8UN/oQVVKLW1nB7GK+nIsO4RQjnb8/A==","signatures":[{"sig":"MEQCIFdME6SJEBrCGjSPasADgqSUkWKa8WGRr8+sGYbCoY4xAiAOih3fXMUMwZTeSbAHxT7xCIHsl28qxIynOsMBLw+ZGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11370},"_from":"file:/tmp/axelgar-opentree-0.1.16.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.16.tgz","_integrity":"sha512-NsHB0q7ftRXlO4fC2rdBFsbTUD+HLq9aNakSa3amnhEhGCx8BjJkh0d8UN/oQVVKLW1nB7GK+nIsO4RQjnb8/A==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.16","@axelgar/opentree-darwin-x64":"0.1.16","@axelgar/opentree-linux-arm64":"0.1.16","@axelgar/opentree-darwin-arm64":"0.1.16"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.16_1773389460392_0.48069668147582956","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"@axelgar/opentree","version":"0.1.17","license":"MIT","_id":"@axelgar/opentree@0.1.17","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"98818d010eeb4a255b179578b97cd51be38ce84e","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.17.tgz","fileCount":3,"integrity":"sha512-A7HuHe+QVnq6xeHQhLESOtJABi3xtQE70M9wreoODed6Aot5J96jYUPdKcXwLqbF0BaEwN1Khv8UO8y4tnqHAw==","signatures":[{"sig":"MEUCIHKQB5IwHR7Bl/+T/BL/19Mf54nhdX3YcA6N2BWo999aAiEA68jJ5r0VOnKLV/xcR0uwmUAZ9R6VdX4OOUbvGQTOPVI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11370},"_from":"file:/tmp/axelgar-opentree-0.1.17.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.17.tgz","_integrity":"sha512-A7HuHe+QVnq6xeHQhLESOtJABi3xtQE70M9wreoODed6Aot5J96jYUPdKcXwLqbF0BaEwN1Khv8UO8y4tnqHAw==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.17","@axelgar/opentree-darwin-x64":"0.1.17","@axelgar/opentree-linux-arm64":"0.1.17","@axelgar/opentree-darwin-arm64":"0.1.17"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.17_1779197788094_0.6919048548152795","host":"s3://npm-registry-packages-npm-production"}},"0.1.18":{"name":"@axelgar/opentree","version":"0.1.18","license":"MIT","_id":"@axelgar/opentree@0.1.18","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"a235965b259548c27b5b5164fd3604d080fb736c","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.18.tgz","fileCount":3,"integrity":"sha512-5pK40XYZR0svEeDf1+uiDsz/5ADY7X7wueWsOpDfVTjlkbw/4APtGh4pGu/ntRb742CXm4ynURKxyVyRXjN0+g==","signatures":[{"sig":"MEUCIQCpTxKifPukrQVsQAeWbtAgFYU9PyxQxKqkXnF2Q9T25AIgJSGLZkgzjk1phU0K2oSvMVinAq9fd3DrAqxQdxlg3LY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11370},"_from":"file:/tmp/axelgar-opentree-0.1.18.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.18.tgz","_integrity":"sha512-5pK40XYZR0svEeDf1+uiDsz/5ADY7X7wueWsOpDfVTjlkbw/4APtGh4pGu/ntRb742CXm4ynURKxyVyRXjN0+g==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.18","@axelgar/opentree-darwin-x64":"0.1.18","@axelgar/opentree-linux-arm64":"0.1.18","@axelgar/opentree-darwin-arm64":"0.1.18"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.18_1783858021899_0.9324858038274133","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"@axelgar/opentree","version":"0.1.19","license":"MIT","_id":"@axelgar/opentree@0.1.19","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"1d30ecd6732518d55b97b51193b2d433de78fb86","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.19.tgz","fileCount":3,"integrity":"sha512-STv/nTFNW+3xOPgaPqZrmVDw1P0kaZezh+8cnYA+KpnJEIEUvOVzCM1bPXfNHd1Ld04wMxevDpkewpnsGgGyvw==","signatures":[{"sig":"MEUCIESkgXEAkeo1jT1HMxO9fH5KIWwkaxjX1YwvfqOGdCPXAiEAr59aGQyPWtk7c09vnqo9H+1iXM3KRan/2+i5nDSdYXc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11294},"_from":"file:/tmp/axelgar-opentree-0.1.19.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.19.tgz","_integrity":"sha512-STv/nTFNW+3xOPgaPqZrmVDw1P0kaZezh+8cnYA+KpnJEIEUvOVzCM1bPXfNHd1Ld04wMxevDpkewpnsGgGyvw==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.19","@axelgar/opentree-darwin-x64":"0.1.19","@axelgar/opentree-linux-arm64":"0.1.19","@axelgar/opentree-darwin-arm64":"0.1.19"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.19_1783924728850_0.5936274265242822","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"@axelgar/opentree","version":"0.1.20","license":"MIT","_id":"@axelgar/opentree@0.1.20","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"ac00254ee4664cf75a83b12c2574c415d0aa0a20","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.20.tgz","fileCount":3,"integrity":"sha512-M1+JSqgwkby5lnZmQNr8xsZ71kvo+sy31LFMKZS2QFFaU5eiWnzqTJlH6EO7EL5uaxNAa2ah7A4QmjEYP4rSQg==","signatures":[{"sig":"MEYCIQDFpc/VkATRuqlsZ8Zw5QYURzA7K6Zsh5BgZqDglR/UjAIhAIguLdvnLHcISEDe9od2lw9yaxUUofZpcLRpWsOoGibw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13729},"_from":"file:/tmp/axelgar-opentree-0.1.20.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.20.tgz","_integrity":"sha512-M1+JSqgwkby5lnZmQNr8xsZ71kvo+sy31LFMKZS2QFFaU5eiWnzqTJlH6EO7EL5uaxNAa2ah7A4QmjEYP4rSQg==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.20","@axelgar/opentree-darwin-x64":"0.1.20","@axelgar/opentree-linux-arm64":"0.1.20","@axelgar/opentree-darwin-arm64":"0.1.20"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.20_1783934808992_0.8396455135459522","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"@axelgar/opentree","version":"0.1.21","license":"MIT","_id":"@axelgar/opentree@0.1.21","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"775bf54e7f3833bcf7c7c147336127f5aa79a9e5","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.21.tgz","fileCount":3,"integrity":"sha512-Dssd7p0aM9jvqSnq1dCsGiVP3tO1gRSj8lpv4M4XBRK/aspFPwwiWd9AyKlN0umfCZxfNqocH8oM5s+195nISw==","signatures":[{"sig":"MEUCIBsuNdvyO2JZGjgZl7HwBld3fcYxratNvInq5n7RzbptAiEA2EHH7uHIVrZe1uJ0tyPCUZ+qA2Bi2vqlFuDms4HxaOo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13805},"_from":"file:/tmp/axelgar-opentree-0.1.21.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.21.tgz","_integrity":"sha512-Dssd7p0aM9jvqSnq1dCsGiVP3tO1gRSj8lpv4M4XBRK/aspFPwwiWd9AyKlN0umfCZxfNqocH8oM5s+195nISw==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.21","@axelgar/opentree-darwin-x64":"0.1.21","@axelgar/opentree-linux-arm64":"0.1.21","@axelgar/opentree-darwin-arm64":"0.1.21"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.21_1784103425076_0.6233104196017214","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"@axelgar/opentree","version":"0.1.22","license":"MIT","_id":"@axelgar/opentree@0.1.22","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"cc455490359cbc18028f49682643c755d0d0a7cb","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.22.tgz","fileCount":3,"integrity":"sha512-DFtVDgKDavkC76syyeIwfdaX2i8EGcrzRZr+GLEBEMPy1smmEEObNDJ0GYRE8t+0iJbG+t7AUOJXQe2xZFJdLQ==","signatures":[{"sig":"MEQCIHBSXQ8MhAGk/IHZptENrLifKaVBIJrsVM50ftuz6t8bAiA7Tfu5zRvkAtyFRXYX1OfOZsF6UODlVbz7FdWsZkDacg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13805},"_from":"file:/tmp/axelgar-opentree-0.1.22.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.22.tgz","_integrity":"sha512-DFtVDgKDavkC76syyeIwfdaX2i8EGcrzRZr+GLEBEMPy1smmEEObNDJ0GYRE8t+0iJbG+t7AUOJXQe2xZFJdLQ==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.22","@axelgar/opentree-darwin-x64":"0.1.22","@axelgar/opentree-linux-arm64":"0.1.22","@axelgar/opentree-darwin-arm64":"0.1.22"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.22_1784115269472_0.355910642903833","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"@axelgar/opentree","version":"0.1.23","license":"MIT","_id":"@axelgar/opentree@0.1.23","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"2c8f880b26ecbb4d73d25b3a08c6c5522918e5ef","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.23.tgz","fileCount":3,"integrity":"sha512-op3ovJlgGJ0x8bkSTgjCu/3X5fCSGzxhwIafhdE0DvrJcMpqQKfgAFB52i1fm8nOJh4WNQAzf6B9jM5sgmy4VA==","signatures":[{"sig":"MEUCIFnVGyZIYro6wHzY0Bv487yYTnUraoWhxlT3qfVzvsEIAiEAsA/6DiXA8j4q3p1OcUQDsYtHckKZ+9PSI26CUIh3Rq4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14578},"_from":"file:/tmp/axelgar-opentree-0.1.23.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.23.tgz","_integrity":"sha512-op3ovJlgGJ0x8bkSTgjCu/3X5fCSGzxhwIafhdE0DvrJcMpqQKfgAFB52i1fm8nOJh4WNQAzf6B9jM5sgmy4VA==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.23","@axelgar/opentree-darwin-x64":"0.1.23","@axelgar/opentree-linux-arm64":"0.1.23","@axelgar/opentree-darwin-arm64":"0.1.23"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.23_1784197152703_0.05900922311806056","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"@axelgar/opentree","version":"0.1.24","license":"MIT","_id":"@axelgar/opentree@0.1.24","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"8e19a2a7fdc1f6f31bcd839f187b80168df2d455","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.24.tgz","fileCount":3,"integrity":"sha512-Yn70PCPLy38/q4AeZzGJM2RQjsltzEU1AIutKwvWRFGEZtCcUwPPqL0yWY3PNYExO7s7xk6QIIemEz5IRC3JXw==","signatures":[{"sig":"MEUCIFJxcVSspiCQ11M43QRp0TLRJrydGXNPFoPyFQW0WGyoAiEAh0Lsn9eJsLkvtgGPDDN8rbzV0RAPfPhAiREq8lt8NKU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14657},"_from":"file:/tmp/axelgar-opentree-0.1.24.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.24.tgz","_integrity":"sha512-Yn70PCPLy38/q4AeZzGJM2RQjsltzEU1AIutKwvWRFGEZtCcUwPPqL0yWY3PNYExO7s7xk6QIIemEz5IRC3JXw==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.24","@axelgar/opentree-darwin-x64":"0.1.24","@axelgar/opentree-linux-arm64":"0.1.24","@axelgar/opentree-darwin-arm64":"0.1.24"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.24_1784277955605_0.7907952876173561","host":"s3://npm-registry-packages-npm-production"}},"0.1.25":{"name":"@axelgar/opentree","version":"0.1.25","license":"MIT","_id":"@axelgar/opentree@0.1.25","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"65cf175518ef2c5a47b0ea97b44597754883966c","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.1.25.tgz","fileCount":3,"integrity":"sha512-geo4YrC/db4erEbp6Vd72MZHA+/RBlOfmH6ZQPB5rxxYJOYDDH4EDCi8ezGfns3/ARn1v1T5RTqPv1Az2C8F2A==","signatures":[{"sig":"MEQCIAhBEZ27TPhhbl177GY5n75gLTXsYCOQsbSmiGNjN9AWAiBZynto5cFO3pc/9bqen5Hnjw8ZoDeq2kJPtniNTuiB+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15233},"_from":"file:/tmp/axelgar-opentree-0.1.25.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.1.25.tgz","_integrity":"sha512-geo4YrC/db4erEbp6Vd72MZHA+/RBlOfmH6ZQPB5rxxYJOYDDH4EDCi8ezGfns3/ARn1v1T5RTqPv1Az2C8F2A==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.1.25","@axelgar/opentree-darwin-x64":"0.1.25","@axelgar/opentree-linux-arm64":"0.1.25","@axelgar/opentree-darwin-arm64":"0.1.25"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.1.25_1784804868829_0.22463201365530594","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@axelgar/opentree","version":"0.2.0","license":"MIT","_id":"@axelgar/opentree@0.2.0","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"600774b2fe24249d52008e1864306bc4df8450ec","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-0.2.0.tgz","fileCount":3,"integrity":"sha512-/DcK5k8gZUY1+pCHUIQiq1rAeFn1KW2/KRnFWBMingVZ1PWn+r8ShcHQXF2YgV1/gToHOqjIhGkz2tvLuU0KBQ==","signatures":[{"sig":"MEQCIBtNuYJyvwOF6UaJCGRi2U7Evl1DWCaK5kXXT0YDQcXlAiBIQBcAcpTUQDX9ymUOObrTD01dWdz/Zzj7C0O2I8pPCA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15187},"_from":"file:/tmp/axelgar-opentree-0.2.0.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-0.2.0.tgz","_integrity":"sha512-/DcK5k8gZUY1+pCHUIQiq1rAeFn1KW2/KRnFWBMingVZ1PWn+r8ShcHQXF2YgV1/gToHOqjIhGkz2tvLuU0KBQ==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"0.2.0","@axelgar/opentree-darwin-x64":"0.2.0","@axelgar/opentree-linux-arm64":"0.2.0","@axelgar/opentree-darwin-arm64":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/opentree_0.2.0_1784891592493_0.3328364343463428","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@axelgar/opentree","version":"1.0.0","license":"MIT","_id":"@axelgar/opentree@1.0.0","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"1fc6600244a4a892f24dacbe97040dfecc9f0d57","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-1.0.0.tgz","fileCount":3,"integrity":"sha512-B2OVJcR/skUg5pnCHpGkdZgw4fAAiNSDZYJ0PNcUsf/fSw+2J7my42FfxdPTeoR7fYCmhbV+ibtRNGWT3jE3xA==","signatures":[{"sig":"MEUCIQD71YHyCz2QDwzmKBwueOemPHPckLR/11ScotIVc2vVnwIgBfsUKkkk4Bwm56IyLx8kgeBjsF4GUTQ1s+IS3MuIZGk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29346},"_from":"file:/tmp/axelgar-opentree-1.0.0.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-1.0.0.tgz","_integrity":"sha512-B2OVJcR/skUg5pnCHpGkdZgw4fAAiNSDZYJ0PNcUsf/fSw+2J7my42FfxdPTeoR7fYCmhbV+ibtRNGWT3jE3xA==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"1.0.0","@axelgar/opentree-darwin-x64":"1.0.0","@axelgar/opentree-linux-arm64":"1.0.0","@axelgar/opentree-darwin-arm64":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/opentree_1.0.0_1786896437834_0.630075851520121","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@axelgar/opentree","version":"1.0.1","license":"MIT","_id":"@axelgar/opentree@1.0.1","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"f0369eb0c754fc0410edd8b1c87d8a7ac4d99367","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-1.0.1.tgz","fileCount":3,"integrity":"sha512-w0SpV2NiZ4yQ2h3wyyZRZBVHaWwfiewU9eJUB7FHXZgFYJrLkPOuE/opCgnKzsmaBv0IG0UT/3oHsfplVKmRzQ==","signatures":[{"sig":"MEUCIQC5w965v2yt2KLaXQo9x96j3Gp92//cFx3D/BrgFM7SsQIgWsJGo/2xNVXjoc3EI7d+Kxb3VagFqc9SHkTUkM6GX2Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29351},"_from":"file:/tmp/axelgar-opentree-1.0.1.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-1.0.1.tgz","_integrity":"sha512-w0SpV2NiZ4yQ2h3wyyZRZBVHaWwfiewU9eJUB7FHXZgFYJrLkPOuE/opCgnKzsmaBv0IG0UT/3oHsfplVKmRzQ==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"1.0.1","@axelgar/opentree-darwin-x64":"1.0.1","@axelgar/opentree-linux-arm64":"1.0.1","@axelgar/opentree-darwin-arm64":"1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/opentree_1.0.1_1786898535699_0.6144398589537245","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@axelgar/opentree","version":"1.0.2","license":"MIT","_id":"@axelgar/opentree@1.0.2","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"9b8e206bd7810b27c4fbfc71083f63fc9978ceee","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-1.0.2.tgz","fileCount":3,"integrity":"sha512-Buavc/NyxDn1PrN1ucDR9GbN/6kIb//HjHbfLRKtEoS8PlOQ9BGHlKJxf98r636N5CNInRPDp20KPNTmte45Iw==","signatures":[{"sig":"MEUCIQCS+Fza7PbBb8s/FlQ+0xKhk4J5rSiSVsfZkLASez/S/QIgbffRprprOBzUMEoXjRdKXnV9ygLpS8r845dGRZG8ct4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30834},"_from":"file:/tmp/axelgar-opentree-1.0.2.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-1.0.2.tgz","_integrity":"sha512-Buavc/NyxDn1PrN1ucDR9GbN/6kIb//HjHbfLRKtEoS8PlOQ9BGHlKJxf98r636N5CNInRPDp20KPNTmte45Iw==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.8.2","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"1.0.2","@axelgar/opentree-darwin-x64":"1.0.2","@axelgar/opentree-linux-arm64":"1.0.2","@axelgar/opentree-darwin-arm64":"1.0.2"},"_npmOperationalInternal":{"tmp":"tmp/opentree_1.0.2_1786952895130_0.20933052598089885","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@axelgar/opentree","version":"1.1.0","license":"MIT","_id":"@axelgar/opentree@1.1.0","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"bf7b3cbb06953a73bf9183570132ba6ce34be357","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-1.1.0.tgz","fileCount":5,"integrity":"sha512-j5h5AoIPX7X/DnJ4FclEOUvE/osdYX3XwyGyfPHn/Z0OkaikQyemD7yTtjz5m82HvmWxlKP+kJS5BeSbyzm1mQ==","signatures":[{"sig":"MEQCIEyZ7J9jb3pqVaj9aXukDSRH5feFtgpiKh0gIG7rPR8wAiAVYO3c0cH6FbgBmlAcoZ4QAMuIukjHa1gjbUIt6dyeEQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@axelgar%2fopentree@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":37031},"_from":"file:/tmp/axelgar-opentree-1.1.0.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-1.1.0.tgz","_integrity":"sha512-j5h5AoIPX7X/DnJ4FclEOUvE/osdYX3XwyGyfPHn/Z0OkaikQyemD7yTtjz5m82HvmWxlKP+kJS5BeSbyzm1mQ==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.9.8","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"1.1.0","@axelgar/opentree-darwin-x64":"1.1.0","@axelgar/opentree-linux-arm64":"1.1.0","@axelgar/opentree-darwin-arm64":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/opentree_1.1.0_1787408777378_0.9322405226281565","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@axelgar/opentree","version":"1.2.0","license":"MIT","_id":"@axelgar/opentree@1.2.0","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"homepage":"https://github.com/axelgar/opentree","bugs":{"url":"https://github.com/axelgar/opentree/issues"},"bin":{"opentree":"bin/opentree"},"dist":{"shasum":"50f3c8324acf984afa4b73453d5ab858e5ade871","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-1.2.0.tgz","fileCount":5,"integrity":"sha512-XL1jsTRrLewn6wgdETkB32TmSVVYGZP1jSdFCLV8YJDFNO/OcgydUpHzpd/BIGEKZTkckrdVl80geNeMYZcADw==","signatures":[{"sig":"MEQCIHlqtcO/9GeZ3xdzZhHXvAbbhCHEOYyFGCSk4Jx3zV7aAiAi4fyzCzrEkEl62FU4Gq+x576eASepno+0pm9ryomN2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDrsXToUh/W1RtTyNRvIg4lcqrmGVNXAowl/hZXNkT8+wIhAPery0gcKS8or0qCaDX7I8q+0+mTxCzGgLhHfyDgiaBU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@axelgar%2fopentree@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":57711},"_from":"file:/tmp/axelgar-opentree-1.2.0.tgz","engines":{"node":">=18"},"_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"_resolved":"/tmp/axelgar-opentree-1.2.0.tgz","_integrity":"sha512-XL1jsTRrLewn6wgdETkB32TmSVVYGZP1jSdFCLV8YJDFNO/OcgydUpHzpd/BIGEKZTkckrdVl80geNeMYZcADw==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.9.8","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"1.2.0","@axelgar/opentree-darwin-x64":"1.2.0","@axelgar/opentree-linux-arm64":"1.2.0","@axelgar/opentree-darwin-arm64":"1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/opentree_1.2.0_1789038397330_0.27764535581124394","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"_id":"@axelgar/opentree@1.3.0","bin":{"opentree":"bin/opentree"},"bugs":{"url":"https://github.com/axelgar/opentree/issues"},"dist":{"shasum":"621623842b0e22c4b1d0504e082c5335e85d115e","tarball":"https://registry.npmjs.org/@axelgar/opentree/-/opentree-1.3.0.tgz","fileCount":5,"integrity":"sha512-AX/Tmm96RY9vu5vQ+qtgO6hrphDYZ2RybCcx0mOllZOKdPEVVgWj5mw1QQ9UqBmY+cLoIVPwcoSW0EkOXmZ3NA==","signatures":[{"sig":"MEUCIQCQ2g25sMoytvojOW5WXxx9m64JIUkkLwgYrgYytmcSxAIgFjgecgH/Zy19R/Lr45i7/8wZQCx4g3zHFdpZhg/L/jo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCJyiwlKMzoNa8Dej2S5MurOhZdixUsjX4Hpix0icIhUgIgTZVRLTBUqUlXledlX8W78JWc+38ywPU2HNj5Tqv9cVI="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@axelgar%2fopentree@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":59412},"name":"@axelgar/opentree","_from":"file:/tmp/axelgar-opentree-1.3.0.tgz","engines":{"node":">=18"},"license":"MIT","version":"1.3.0","_npmUser":{"name":"axelgar","email":"axel.garcia94@gmail.com"},"homepage":"https://github.com/axelgar/opentree","_resolved":"/tmp/axelgar-opentree-1.3.0.tgz","_integrity":"sha512-AX/Tmm96RY9vu5vQ+qtgO6hrphDYZ2RybCcx0mOllZOKdPEVVgWj5mw1QQ9UqBmY+cLoIVPwcoSW0EkOXmZ3NA==","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"_npmVersion":"10.9.8","description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","directories":{},"maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@axelgar/opentree-linux-x64":"1.3.0","@axelgar/opentree-darwin-x64":"1.3.0","@axelgar/opentree-linux-arm64":"1.3.0","@axelgar/opentree-darwin-arm64":"1.3.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/opentree_1.3.0_1789043335740_0.5159872031760271"}}},"time":{"created":"2026-03-11T08:35:57.536Z","modified":"2026-09-10T12:28:56.176Z","0.0.0":"2026-03-11T08:35:57.835Z","0.1.14":"2026-03-11T08:59:41.858Z","0.1.15":"2026-03-12T14:15:19.945Z","0.1.16":"2026-03-13T08:11:00.582Z","0.1.17":"2026-05-19T13:36:28.258Z","0.1.18":"2026-07-12T12:07:02.029Z","0.1.19":"2026-07-13T06:38:48.973Z","0.1.20":"2026-07-13T09:26:49.154Z","0.1.21":"2026-07-15T08:17:05.207Z","0.1.22":"2026-07-15T11:34:29.597Z","0.1.23":"2026-07-16T10:19:12.830Z","0.1.24":"2026-07-17T08:45:55.770Z","0.1.25":"2026-07-23T11:07:48.983Z","0.2.0":"2026-07-24T11:13:12.650Z","1.0.0":"2026-08-16T16:07:17.974Z","1.0.1":"2026-08-16T16:42:15.838Z","1.0.2":"2026-08-17T07:48:15.254Z","1.1.0":"2026-08-22T14:26:17.523Z","1.2.0":"2026-09-10T11:06:37.426Z","1.3.0":"2026-09-10T12:28:55.834Z"},"bugs":{"url":"https://github.com/axelgar/opentree/issues"},"license":"MIT","homepage":"https://github.com/axelgar/opentree","repository":{"url":"git+https://github.com/axelgar/opentree.git","type":"git"},"description":"Git worktree manager CLI for orchestrating parallel AI coding sessions","maintainers":[{"name":"axelgar","email":"axel.garcia94@gmail.com"}],"readme":"# opentree\n\n**Orchestrate parallel AI coding sessions in isolated git worktrees.**\n\nThink [Conductor](https://conductor.build), but for the terminal.\n\nopentree is a cross-platform CLI tool that manages multiple AI coding agent sessions. Each session runs in an isolated git worktree with its own branch, orchestrated via tmux. Perfect for working on multiple features/fixes simultaneously without context-switching overhead.\n\n![opentree — orchestrate parallel AI coding sessions in isolated git worktrees](https://raw.githubusercontent.com/axelgar/opentree/main/docs/demo.gif)\n\n## Features\n\n- **🌳 Isolated Workspaces**: Each workspace = git worktree + branch + tmux window\n- **🤖 Agent Integration**: Launch your agent automatically in each workspace\n- **💬 Built-in Chat**: Every agent speaks the [Agent Client Protocol](https://agentclientprotocol.com) and runs inside opentree's own chat view — answer permissions, watch diffs, send images, and drive the agent from the dashboard without attaching\n- **📊 TUI Dashboard**: Interactive terminal UI for managing workspaces (press `?` for help)\n- **🔀 Parallel Development**: Work on multiple branches simultaneously without checkout overhead\n- **📝 Diff Viewer**: Read a workspace's changes with a file tree, search and syntax colour — and leave notes on lines that go to its agent as a prompt\n- **🚀 PR Creation**: Create GitHub PRs directly from the TUI with auto-generated title and body\n- **✈️ Autopilot**: After each agent turn, run your check command, feed failures back, and publish the PR when it passes — per workspace, opt-in\n- **📦 Dispatch**: `opentree dispatch 42 --headless` turns an issue into a PR with nobody watching, exiting with a code a script can branch on\n- **⑂ Fan-out**: `opentree new feat/x --agents claude,opencode,gemini` races the same task across agents — grouped in the dashboard, compared side by side, the winner promoted and the rest deleted\n- **🐛 Issue Workflow**: Create a workspace directly from a GitHub issue number\n- **✅ CI Status**: Live CI check status displayed per workspace\n- **🔍 Filter & Sort**: Filter workspaces by name, sort by name/age/activity/PR status\n- **🔌 Agent Plugins**: Install a plugin from the open [Agent Plugins](https://agent-plugins.org) standard once, and every agent in every worktree can use the skills it bundles\n- **🗂 ACP Registry**: `opentree agents add <id>`, or `a` on the dashboard's Agents tab, installs any agent the [ACP Registry](https://agentclientprotocol.com/get-started/registry) lists, and it becomes first-class everywhere the built-in four are — chats, fan-outs, per-workspace overrides\n- **🧹 Clean Lifecycle**: A merged PR marks its row `merged · ready to delete`, and `opentree delete --merged` clears them all at once\n- **⌨️ Shell Completion**: Tab completion for workspace names in bash, zsh, and fish\n\n## Requirements\n\n- **Git** (2.5+) - for worktree support\n- **tmux** (3.0+) - for session orchestration (3.2+ to type `shift+enter` in the chat)\n- **A coding agent** (optional) - OpenCode (the default), Claude Code, GitHub Copilot CLI or Gemini CLI\n- **GitHub CLI** (`gh`) (optional) - for PR creation and issue fetching ([install](https://cli.github.com/))\n- **Node** (optional) - only to run Claude Code through its ACP adapter\n\n## Installation\n\n### Homebrew (macOS/Linux)\n\n```bash\nbrew install axelgar/tap/opentree\n```\n\n### npm\n\n```bash\nnpm install -g @axelgar/opentree\n```\n\n### From Source\n\n```bash\ngit clone https://github.com/axelgar/opentree.git\ncd opentree\ngo build -o opentree ./cmd/opentree\nsudo mv opentree /usr/local/bin/\n```\n\n### Using Go Install\n\n```bash\ngo install github.com/axelgar/opentree/cmd/opentree@latest\n```\n\n### Uninstalling\n\n```bash\nopentree uninstall\n```\n\nRemoves what opentree wrote into your home directory: the agent adapters under `~/.opentree/tools` (a few hundred megabytes each), the agents installed from the ACP Registry under `~/.opentree/registry` along with its cached index, the plugins installed under `~/.opentree/plugins`, 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.\n\nIt never touches a repository, and it never touches a worktree. The worktrees under `~/.opentree/worktrees` (or wherever `base_dir` points) 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.\n\n## Quick Start\n\n```bash\n# Navigate to any git repository\ncd ~/my-project\n\n# Launch TUI dashboard (interactive mode)\nopentree\n\n# Or use CLI commands directly\nopentree new feat/add-auth       # Create workspace\nopentree issue 42                # Create workspace from GitHub issue #42\nopentree dispatch 42 --headless  # Issue #42 → agent → checks → PR, unattended\nopentree list                    # List all workspaces, with their paths\nopentree attach feat/add-auth    # Attach to tmux window\nopentree shell feat/add-auth     # A shell in the worktree, beside the chat\nopentree diff feat/add-auth      # Review changes\nopentree pr feat/add-auth        # Create GitHub PR\nopentree delete feat/add-auth    # Clean up workspace\nopentree skills list             # See every agent skill on this machine\nopentree skills sync             # Give every agent and workspace the repo's skills\nopentree plugins add <git-url>   # Install an Agent Plugin once, for every agent\n```\n\n## Usage\n\n### TUI Mode (Interactive)\n\nRun `opentree` without arguments to launch the interactive dashboard:\n\n```bash\nopentree\n```\n\n**Navigation:**\n\n- `↑`/`k` - move up\n- `↓`/`j` - move down\n\n**Actions:**\n\n- `n` - Create new workspace (prompts for branch name, then base branch)\n- `i` - Create workspace from a GitHub issue number\n- `Enter` - Attach to selected workspace\n- `d` - Open the workspace's diff (see *Reviewing a diff* below)\n- `D` - Compare a fan-out group: every sibling's diff in one scroll\n- `W` - Promote a fan-out's winner: keep this sibling, delete the rest\n- `p` - Create PR for selected workspace (auto-generates title and body from commits)\n- `o` - Open PR in browser\n- `x` - Delete selected workspace (shows diff confirmation if uncommitted changes)\n- `R` - Send the workspace's open PR review comments to its agent\n- `P` - Switch the workspace's autopilot on or off\n- `w` - Start or stop the workspace's dev server\n- `u` - Merge the base branch in (fetched from origin first); conflicts are offered to the agent\n- `t` - Open a shell in the workspace's worktree, in a tmux window beside its chat\n- `y` - Copy the worktree's path to the clipboard\n- `e` - Open the worktree in `$VISUAL`/`$EDITOR`\n- `b` - Jump to the workspace that has been waiting longest on a permission (press again to cycle)\n- `space` - Toggle multi-select on current workspace\n- `/` - Filter workspaces by name\n- `s` - Cycle sort order (name → age → activity → PR)\n- `E` - Toggle error log\n- `tab` - Switch between Workspaces, Agents, Skills, Plugins and Servers\n- `?` - Toggle full help\n- `q` - Quit\n\nThe mouse works too: the wheel scrolls, a click selects a row, and a\ndouble-click attaches to it.\n\n### Reviewing a diff\n\n`d` opens the workspace's changes — committed and uncommitted, each under its\nown heading — with the changed files down the left and the code on the right,\nsyntax-coloured, added and removed lines on a green and a red band. There is a\ncursor, and everything else is a question about where it is. Press `?` inside\nthe view for the full card.\n\n- `j`/`k`, `pgup`/`pgdn`, `g`/`G` move; `]`/`[` jump between hunks, `n`/`p`\n  between files; a click on a file in the tree jumps to it, a click on a line\n  takes the cursor there\n- `space` ticks the file under the cursor as reviewed; `t` hides the tree\n- `/` finds: type, `enter` keeps the query, and `n`/`N` step its matches until\n  `esc` clears it (with no query, `n` steps files again)\n- `L` shows line numbers, `w` wraps long lines, `W` marks the words that\n  changed within a changed line\n- `a` or `enter` writes a note on the line under the cursor, `A` on the whole\n  file; `@` lists them, `x` deletes the one under the cursor\n- `s` sends every note to the workspace's agent as one prompt: the path and\n  line, the code quoted, and what you said about it. A note that ends in `?`\n  (or carries `??` anywhere) is asked as a question rather than given as an\n  instruction — *why is this recomputed every frame?* gets an answer, *cache\n  this* gets a change.\n- `esc` closes; with notes unsent it warns first and closes on the second press\n\n`D` opens a fan-out group the same way, every sibling's diff in one view with\nthe tree grouped by sibling. Notes cannot be sent from there — three agents,\none prompt, no right answer about who gets it.\n\nEach row also carries what its agent is doing — working, waiting on a\npermission, stopped — plus cost and context use, read live from the chat's\ncontrol socket. Open PRs show **CI check status** badges.\n\n### Agents\n\nPress `tab` once for every agent this machine knows — the built-in four and\nwhatever was installed from the ACP Registry — with its readiness, where it\ncame from, and which one this repository uses. It is `opentree agents` as a\nplace rather than a set of commands:\n\n- `enter` - Use this agent for the repository (`g` for everywhere)\n- `a` - Browse the ACP Registry and install an agent (`/` filters the list)\n- `u` - Update the selected registry agent (`U` checks every one)\n- `i` - Fetch a built-in agent's ACP adapter\n- `x` - Remove a registry agent, or clear a broken install\n- `r` - Rescan the store, without touching the network\n\nEvery install shows the same consent card the command line prints — what will\nrun or what will be downloaded, and where — before anything is fetched. See\n[Agents from the ACP Registry](#agents-from-the-acp-registry).\n\n### Skills\n\nSkills are a filesystem convention rather than anything an agent exposes over\nits API — a directory holding a `SKILL.md` — so opentree reads them directly.\nPress `tab` twice for the inventory: every skill on the machine, which agents\ncan actually use each one, and what each agent will do with it.\n\n- `enter` - Open the SKILL.md in `$EDITOR`\n- `a` - Add a skill from a git URL\n- `c` - Copy a skill into another agent's directory\n- `x` - Delete a skill\n- `t` - Switch a skill off for the agents that can be told\n- `l` - Link the repository's skills to every agent and workspace that is missing them\n- `v` - Ask the agent itself what it loaded, and flag anything the list got wrong. Gemini keeps its skills out of the protocol, so it cannot be asked\n\nA `git worktree` carries only what git tracks, and most repositories leave\ntheir skills untracked — so opentree links the repository's skills into each\nworkspace it creates. `opentree skills sync` repairs workspaces that predate\nthis, and `opentree skills list` prints the same inventory for a script.\n\n### Plugins\n\nopentree is a client of the open [Agent Plugins](https://agent-plugins.org)\nstandard: a plugin is a directory with a `plugin.json` manifest, skills under\n`skills/`, and optionally an `mcp.json` naming MCP servers.\n\n```bash\nopentree plugins add https://github.com/someone/their-plugin\nopentree plugins list            # what each plugin declares, secrets masked\nopentree plugins remove <name>   # the store entry and every link into it\n```\n\nInstall one and every agent in every worktree can use the skills it bundles:\nthe clone lands once per machine in `~/.opentree/plugins`, is validated\nagainst the spec — a broken manifest refuses the whole plugin, a broken skill\nor server entry costs only itself and is reported — and its skills are linked\ninto each agent's own user-scope tree. On the Skills tab they wear their\nprovenance (`plugin:<name>` and `ro`); the Plugins tab shows each plugin as a\nunit, with `a` to install, `x` to remove, and every declared MCP server named.\n\nDeclared is as far as it goes: opentree lists a plugin's MCP servers with\ntheir env and header values masked, and neither launches them nor writes them\ninto any agent's own configuration. Nothing a plugin ships is executed.\n\n### Talking to the agent\n\nopentree talks to agents over the [Agent Client Protocol](https://agentclientprotocol.com)\n(ACP) and draws the conversation itself, rather than handing the tmux window to\nthe agent's own TUI. You get the same worktree-per-branch\nflow, but the agent's turns, tool calls, diffs, what each tool printed, and\npermission prompts are rendered by opentree, which means the dashboard knows\nwhat every agent is doing without scraping its output.\n\nPress `Enter` on a workspace to attach to its chat:\n\n```\n fix-auth  ◆ OpenCode                             claude-sonnet-4.6 · plan · 12% ctx · $0.0431\n\n┃ add a rate limiter to the login handler\n\n◆ Adding one keyed by client IP, and a test for the burst case.\n   ✓ grep -rn rate.Limiter pkg/\n     pkg/api/throttle.go:14: var limiter = rate.NewLimiter(rate.Every(time.Minute), 60)\n   ✓ pkg/auth/login.go  +18 -2\n     + limiter := rate.NewLimiter(rate.Every(time.Second), 5)\n   ⠹ go test ./pkg/auth/\n\n ╭──────────────────────────────────────╮\n │ go test ./pkg/auth/                  │\n │ [a] Allow once                       │\n │ [A] Always allow                     │\n │ [d] Reject                           │\n ╰──────────────────────────────────────╯\n permission needed · esc to cancel\n```\n\nEach agent has its own mark and colour — `◆` for OpenCode, `✻` for Claude Code,\n`◉` for GitHub Copilot, `✦` for Gemini CLI —\nso the chat header and every workspace row in the dashboard say which agent you\nare dealing with without being read word by word. An empty chat opens on the\nagent's own logo, in its own colours:\n\n```\n ▐▛███▜▌    Claude Code\n▝▜█████▛▘   fix-auth\n  ▘▘ ▝▝     ~/.opentree/worktrees/myrepo/fix-auth\n```\n\n| Key | |\n| --- | --- |\n| `enter` | send |\n| `shift+enter` | newline — `ctrl+j` where the terminal cannot report modifiers |\n| `↑` / `↓` | walk back through the messages already sent, and forward again |\n| `/` | slash commands — the agent's own, plus `/resume`, `/login`, `/model`, `/shell`, `/export` and the rest |\n| `@` | attach a file from this worktree |\n| `ctrl+v` | paste — an image on the clipboard is attached, anything else is text |\n| `esc` | interrupt the current turn — or clear an unsent message (`↑` brings it back) |\n| `shift+tab` | cycle the agent's mode (plan / build / …) — Claude Code's plan mode and accept-edits included |\n| `ctrl+g` | settings — model, reasoning effort, anything else the agent declares |\n| `ctrl+o` | show or hide the agent's reasoning |\n| `ctrl+x` | expand what the last tool call held back, and fold it again |\n| `ctrl+r` | retry a failed turn — the same message, pasted images included |\n| `ctrl+y` | copy — the last reply, any code block in it, the last tool's output, or the whole conversation as markdown |\n| `ctrl+f` | find in the conversation — `ctrl+n` / `ctrl+p` step through the matches, `esc` leaves the log where it stands |\n| `drag` | select text — it goes to the clipboard when the button comes up; double-click takes a word, triple-click a row. `shift+drag` (`option+drag` in iTerm2) is the terminal's own selection, which still works |\n| `click` | a permission option answers it; a `… 42 more lines` row opens the way `ctrl+x` does |\n| `?` | every key |\n\n**Prose.** The agent's replies render as markdown while they stream: emphasis,\nheadings, lists, quotes, and fenced code on its own background, syntax-coloured\nwhen the fence names a language — code is never rewrapped, so its indentation\nkeeps meaning. A half-arrived fence already reads\nas code and never snaps back to prose; a lone `**` stays two asterisks until\nits closer arrives. Tables render as the text they are.\n\n**Tool output.** A tool row shows a few lines of what it did — the diff, or\nwhat it printed — and holds the rest back behind `… 42 more lines · ctrl+x`.\n`ctrl+x` opens the most recent held-back row where you are reading, up to 500\nlines; the same key folds it again. There is no cursor to place: the row you\nwant open is the one that just said how much it was hiding.\n\n**Newlines.** `shift+enter` breaks the line instead of sending it, with nothing\nto configure. A terminal left to itself sends a bare carriage return for\n`shift+enter` — the same byte `enter` sends, and nothing downstream can tell the\ntwo apart — so the chat asks it for modified keys on the way in (xterm's\n`modifyOtherKeys`, level 1, put back on the way out), and sets `extended-keys`\non its own tmux session so tmux passes them through. That is the whole reason\nthe key works here and not in every terminal program.\n\nLevel 1 is the conservative request: only keys that had no encoding of their own\ngain one, so `esc`, `ctrl+j` and the arrows are the bytes they always were, and a\nwindow running something else is untouched — tmux only forwards modified keys to\nprograms that ask for them. In a terminal that cannot report modifiers at all\n(Terminal.app), `ctrl+j` and `alt+enter` still do it.\n\n**Images.** Press `ctrl+v` to attach a screenshot from the clipboard, or drag one\nonto the terminal. Either way the path collapses into `[image · shot.png · 412 KB]`\nin the message you are writing — backspace over it and the attachment goes with\nit — and it travels to the agent as a real image block. On macOS\nthat is `ctrl+v` and not `cmd+v`: `cmd+v` is the terminal's own paste, and a\nterminal asked to paste a picture sends nothing at all. An agent that does not\ntake images gets the path as a link instead, and the chat says so rather than\nletting the difference go unnoticed.\n\n**Messages you already sent.** `↑` puts the last one back in the box, `↓` walks\nforward again, and coming back past the newest returns whatever was half typed\nwhen you started looking — so a prompt worth repeating, or repeating with one\nword changed, is a keypress away rather than a retype. Inside a message the\narrows still move the cursor: they only recall from its first and last row.\nThey are kept per workspace, under `~/.opentree/history`, so a window closed\nand reopened — or a chat restarted after its agent died — still has the last\ntwo hundred.\n\n**Messages you have not sent yet.** Enter while the agent is still working\nqueues the message instead of dropping it: it waits as a `⏳` line above the\nbox, one fires after each finished turn — so each answer still gets read\nbefore the next question goes — and backspace on an empty box takes the\nnewest one back to be edited, pasted images and all. A failed turn drops the\nqueue by name rather than firing into a broken session; `↑` still has every\nmessage.\n\n**Earlier conversations.** `/resume` lists what this worktree has already\ntalked about — newest first, by what each conversation was about — and picking\none reopens it in place, history and all. The list is the agent's own where it\nkeeps one, merged with what opentree recorded itself, so the command works the\nsame whichever agent is running.\n\n**Getting the conversation out.** `/export` writes it as markdown — what was\nsaid, what was run and what it printed — to `~/.opentree/exports`, never into\nthe worktree, and says where. `ctrl+y` puts the same document on the clipboard.\n\nThe agent's live model, mode and effort sit on the right of the input, next to\nthe running context and cost. `ctrl+c` takes you back to the workspace list and\nleaves the chat running: the agent keeps working, its row keeps reporting, and\nattaching again drops you straight back into the conversation.\n\n**From the dashboard.** You don't have to attach to drive a chat. With a\nworkspace selected, `m` sends it a prompt, `a` answers a pending permission\nrequest, and `c` interrupts the current turn — the row shows what the agent is\ndoing, what it's waiting on, and what it has cost. A prompt sent to a busy agent\nis queued rather than refused.\n\n**Which agents.** OpenCode, GitHub Copilot CLI and Gemini CLI serve ACP\nthemselves, so having the binary is the whole setup. Claude Code is reached\nthrough the `claude-agent-acp` adapter, which opentree installs on request into\n`~/.opentree/tools` rather than your global npm root — open the dashboard's\nAgents tab, pick Claude Code, and it offers the download (340MB, needs `node`).\n\nThose four ship with opentree; the rest of the ecosystem comes from the\n[ACP Registry](https://agentclientprotocol.com/get-started/registry).\n`opentree agents add <id>` installs any agent it lists, and the install is\nfirst-class everywhere the four are — the picker, chats, fan-outs,\nper-workspace overrides. opentree drives agents over ACP and nothing else, so\nan agent without an ACP server has no way in — but shipping support and one\nregistry entry is now the whole path in. See\n[Agents from the ACP Registry](#agents-from-the-acp-registry).\n\n### Autopilot\n\nThe dashboard shows everything, but without autopilot you are still the event\nloop: watch the badge, forward the failure, press `p`. Autopilot closes the\nloop per workspace — when a turn ends, the project's check command decides\nwhether the work is done:\n\n```toml\n[workspace]\ncheck = \"make test\"        # the same thing a contributor runs before pushing\n```\n\n- The check runs in the worktree, streaming into the chat log. A failure goes\n  back to the agent as the next prompt — the tail of the output, where the\n  test runner's summary is — and the loop repeats.\n- A pass publishes: push what origin is missing, then create the PR with a\n  generated title and body, or bring the existing one up to date. Never a\n  duplicate — if the agent already pushed or opened the PR itself, publishing\n  notices and stands down.\n- You get a `pr_ready` notification when the PR exists, through the same\n  surfaces as `blocked`.\n\nSwitch it per workspace: `P` in the dashboard, `/autopilot` in the chat, or\n\n```bash\nopentree auto feat/add-dark-mode on    # off; bare reports where the loop stands\n```\n\nThe row shows `auto` while the loop owns a workspace, and `checking…` /\n`publishing…` while it works.\n\nAutopilot knows when to stand down. A cancelled or refused turn never triggers\nthe check. Your queued message always runs first, and any message from you\nresets the loop. Five autopilot-fed turns without a green check and it halts —\nthe row says `auto · halted`, the error log says why, and your next message\nstarts it again. `check` is executable code from a tracked file, so it sits\nbehind the same trust gate as `setup` and `run`: the first run asks, once,\nshowing the exact text.\n\nWithout a `check` command autopilot still pushes and keeps the PR current\nafter each turn — for projects whose CI is the check.\n\n**Once the PR exists, autopilot watches it.** Every two minutes the chat asks\nGitHub what is new: a failing check gets forwarded with the tail of its\nActions log, new review comments get forwarded the way `R` sends them — each\nas its own turn, CI before reviews, the moment the agent is free. Nothing is\nsent twice: the watermarks live in `state.json`, keyed on the commit a failure\nwas reported for and the fingerprint of the review set, so a new push re-arms\nCI forwarding by itself and a reopened window does not repeat its\npredecessor. `opentree ci <branch>` sends the same CI report by hand,\nautopilot or not.\n\n### Dispatch\n\nThe whole pipeline in one command:\n\n```bash\nopentree dispatch 42                    # issue #42 → workspace → agent → checks → PR\nopentree dispatch \"fix the login race\"  # the prompt is the task\nopentree dispatch 42 --headless         # no attach: wait, print the PR URL, exit\n```\n\nDispatch creates the workspace (branch `auto-<slug>` in prompt mode), starts\nthe agent in its tmux window, switches autopilot on and sends the task. By\ndefault it attaches so you can watch; `--headless` waits on the chat's socket\ninstead and exits with a code a script can branch on:\n\n| Code | Meaning |\n| --- | --- |\n| 0 | the PR was published; its URL is on stdout |\n| 1 | autopilot halted (the check kept failing) or reported an error |\n| 2 | the agent stopped, or the chat became unreachable |\n| 3 | blocked on a permission only a human can answer |\n| 4 | `--timeout` (default 30m) elapsed; the workspace is still working |\n\nEvery failure leaves the workspace alive — `opentree attach` picks up exactly\nwhere it stopped. Headless can ask nothing, so the repository's `setup` and\n`check` commands must be approved ahead of time with `opentree trust`, and a\ntmux server must be running (`tmux new-session -d` in CI).\n\n### Fan-out\n\nFour agents through one protocol makes a comparison no single-agent tool can\nrun: the same task, raced.\n\n```bash\nopentree new feat/x --agents claude,opencode,gemini --prompt \"add dark mode\"\ngit log --oneline | opentree new fix/y --agents claude,gemini  # or pipe the task in\n```\n\nOne sibling workspace per agent — `feat/x-claude`, `feat/x-opencode`,\n`feat/x-gemini` — all from the same base, each running its own agent, every\none handed the same prompt (queued until its agent is ready). A name a\nsibling would have taken is stepped past with a numeric suffix rather than\nrefused. Without `--prompt` or a pipe the siblings start idle, and `m` in the\ndashboard messages whichever you like.\n\nThe dashboard shows the group as one thing: siblings sort together under\nevery sort mode, each row wears a `⑂ feat/x` badge, and the cost, context\nand diff numbers already on every row become the scoreboard. `D` opens the\ncomparison — every sibling's diff in one view, the file tree grouped by agent.\n\nThen pick:\n\n```bash\nopentree promote feat/x-claude   # or W on the row in the dashboard\n```\n\nThe winner stays, every other sibling is deleted — worktree, branch, window —\nand the group dissolves. Dirty losers show their diffs and ask first, the way\ndelete does. **The winner keeps its suffixed branch name**: `feat/x-claude`\ndoes not become `feat/x`, because its worktree, chat and any open PR are all\nkeyed on the name it has. Rename it on the PR page if the suffix bothers you,\nor not at all.\n\n### Notifications\n\nThe cost of running four agents at once is that idleness becomes invisible: the\none workspace blocked on a permission prompt looks exactly like the three that\nare working, unless you are staring at the list. So each chat says something\nwhen it starts needing you:\n\n| Event | |\n| --- | --- |\n| `blocked` | the agent stopped to ask for a permission |\n| `done` | a turn finished |\n| `stopped` | the agent died, failed to start, or its setup commands failed |\n| `pr_ready` | autopilot opened or updated a pull request |\n\nTwo surfaces. In tmux the window's own bell rings, which tmux renders as an\ninverted window name in the status bar until you select that window — no\nconfiguration, and it clears itself. Outside the terminal, a desktop banner\n(`osascript` on macOS, `notify-send` on Linux) reaches you with the terminal\nbehind a browser or closed.\n\nNothing is sent while you are looking at the window it happened in, and nothing\nat all when the chat is not running inside tmux. The banners are signposts\nrather than buttons: pressing `b` in the dashboard is what takes you to the\nworkspace that has been waiting longest, and pressing it again walks the rest.\nEach waiting row says how long it has been at it — `blocked 12m`.\n\n```bash\nopentree notify test          # one of each, through the surfaces you have\n```\n\nWorth running once: macOS silently drops notifications sent by `osascript`\nuntil they have been allowed, which is otherwise a feature with no symptom.\n\n```toml\n[notify]\non      = [\"blocked\", \"stopped\", \"pr_ready\"]   # add \"done\"; [] switches everything off\ndesktop = true                                 # false: tmux bell only\n```\n\n`blocked`, `stopped` and `pr_ready` are on by default and `done` is off,\nbecause four agents finishing turns is a banner every ninety seconds — and a\nnotifier you mute is a notifier you deleted. `pr_ready` cannot spam: it fires\nonly from autopilot, which is opt-in, and only when a publish moved something.\n\nThis section is read from `~/.config/opentree/opentree.toml` only. A repository's\nown `opentree.toml` may configure how the project is built; how you like to be\ninterrupted is yours, and a cloned repository does not get to start sending you\ndesktop banners.\n\n### CLI Mode (Direct Commands)\n\n#### Create a Workspace\n\n```bash\nopentree new <branch-name> [flags]\n\n# Examples\nopentree new feat/user-auth           # Create workspace with branch\nopentree new fix/login-bug --base dev # Branch off 'dev' instead of 'main'\nopentree new feat/x --agent claude    # Run claude here, whatever the config says\nopentree new feat/x --agents claude,gemini --prompt \"task\"  # Fan out — see Fan-out\nopentree new feat/x --no-fetch        # Branch from the local base as it is\n```\n\nThe base is fetched from origin first, and the branch made from `origin/<base>`:\na `main` last pulled yesterday would otherwise start the workspace a day behind,\nand its PR would carry or conflict with commits already merged. Offline, the\ncommand says so and branches from the local base; `--no-fetch` skips the fetch\non purpose. `issue` and `dispatch` do the same.\n\nCreates:\n\n1. Git worktree at `~/.opentree/worktrees/<repo>/<branch-name>/` (see [Where worktrees live](#where-worktrees-live))\n2. New branch (or checks out existing)\n3. tmux window in `opentree-<repo>` session\n4. Launches the configured coding agent in the workspace\n\n#### Create Workspace from GitHub Issue\n\n```bash\nopentree issue <number> [flags]\n\n# Examples\nopentree issue 42              # Workspace from issue #42\nopentree issue 42 --base dev   # Branch off 'dev'\n```\n\nFetches the issue from GitHub and auto-generates a branch name (e.g. `issue-42-add-dark-mode`). Requires the `gh` CLI.\n\n#### List Workspaces\n\n```bash\nopentree list\n```\n\nShows table with: branch name, status, last modified time.\n\n#### Attach to Workspace\n\n```bash\nopentree attach <branch-name>\n```\n\nAttaches to the workspace's tmux window. Detach with `Ctrl+b d`.\n\n#### Get Into the Worktree\n\n```bash\nopentree path <branch-name>          # print the worktree's directory\ncd \"$(opentree path feat/x)\"         # …which is what it is for\nopentree shell <branch-name>         # a shell there, in a tmux window beside the chat\n```\n\nThe chat's window is opentree's, holding the conversation. When the agent asks\nfor something only a person at a prompt can do — run the tests, check a URL,\npaste back what a command printed — `shell` opens a window of your own in the\nworktree (`<branch>:sh`, reused while it lives) and takes you to it; `/shell`\nin the chat and `t` in the dashboard do the same. `path` prints the directory\nand nothing else, because a branch's directory is not its name: `feat/x` lives\nat `feat-x`, under `~/.opentree/worktrees/<repo>` by default.\n\n#### Show Diff\n\n```bash\nopentree diff <branch-name>\n```\n\nShows `git diff` between workspace and base branch.\n\n#### Create Pull Request\n\n```bash\nopentree pr <branch-name> [flags]\n\n# Examples\nopentree pr feat/user-auth                                    # Interactive prompts\nopentree pr feat/user-auth --title \"Add user auth\" --body \"...\" # Non-interactive\n```\n\nRequires GitHub CLI (`gh`) to be authenticated.\n\n#### Send PR Reviews to the Agent\n\n```bash\nopentree review <branch-name>\n```\n\nFetches the open PR's review comments and sends them to the workspace's agent as\na prompt, over the chat's control socket. The chat has to be running, but it\ndoesn't have to be the window you're looking at — and if the agent is mid-turn\nthe prompt is queued and runs when the turn ends, which the row's badge shows.\n\n#### Send CI Failures to the Agent\n\n```bash\nopentree ci <branch-name>\n```\n\nThe dashboard's badge says CI is red; this is how the agent learns why: the\nfailing checks by name, and the tail of each GitHub Actions log — where the\ntest runner's summary is. Same delivery as `review`, over the control socket.\nWith autopilot on, this happens by itself.\n\n#### Merge the Base In\n\n```bash\nopentree sync <branch-name>          # fetch origin's main and merge it into the branch\nopentree sync <branch-name> --ask    # …and on conflicts, hand the files to the agent\n```\n\nThe dashboard's row says `PR open · conflicts`; this is what to do about it.\nThe base is fetched from origin first — offline, the local one is merged and\nthe command says so — and merged rather than rebased, because the branch may\nalready be pushed and under review. Conflicts are not a failure: they are\nlisted, the merge is left in progress in the worktree with its markers, and\n`--ask` (or `y` in the dashboard's dialog) sends the agent a prompt naming the\nfiles and asking it to finish the merge.\n\n#### Delete Workspace\n\n```bash\nopentree delete <branch-name>\n\n# Examples\nopentree delete feat/user-auth\nopentree delete --merged          # every workspace whose PR has merged\n```\n\nRemoves the worktree, kills its tmux windows, and deletes the branch. If uncommitted changes are detected, a diff is shown and confirmation is required before proceeding. `--merged` does the same for every workspace the dashboard has seen merge — one question each for any that still hold something — which is how a week's worth of `merged · ready to delete` rows is cleared at once.\n\n#### Promote a Fan-out Winner\n\n```bash\nopentree promote <branch-name>\n\n# Example\nopentree promote feat/x-claude   # keep this sibling; delete feat/x-gemini, feat/x-opencode\n```\n\nKeeps the named sibling, deletes every other member of its fan-out group, and\ndissolves the group. Losers with uncommitted or unpushed work show their diffs\nand ask for confirmation first. The winner keeps its suffixed branch name.\n\n#### Install Shell Completion\n\n```bash\nopentree install-completion\n```\n\nAuto-detects your shell (zsh, bash, or fish) and installs tab completion. After installation, workspace names will be completed when using `attach`, `delete`, `pr`, and `diff` commands.\n\n## Configuration\n\nCreate `opentree.toml` in your repo root or `~/.config/opentree/opentree.toml`. opentree searches up the directory tree for the config file, similar to how git finds `.git`.\n\n```toml\n[worktree]\nbase_dir = \".opentree\"        # Where worktrees go — unset: ~/.opentree/worktrees/<repo>; relative: inside the repo\ndefault_base = \"main\"         # Default base branch\n\n[agent]\ncommand = \"opencode\"          # Agent to run: \"opencode\", \"claude\", \"copilot\" or \"gemini\"\n\n[workspace]\nseed  = [\".env\", \".npmrc\"]                  # Untracked files to link into each new worktree\nsetup = [\"pnpm install --frozen-lockfile\"]  # Commands run before the agent starts\nrun   = \"pnpm dev\"                          # Dev server, started on demand, PORT exported\ncheck = \"pnpm test\"                         # What autopilot runs after each agent turn\n\n[tmux]\nsession_prefix = \"opentree\"   # Prefix for the tmux session name\n\n[github]\nauto_push = true              # Push branch before creating a PR (set false to push manually)\n\n[notify]                      # Global config only — see Notifications\non      = [\"blocked\", \"stopped\"]\ndesktop = true\n```\n\n### Where worktrees live\n\nOutside the repository, by default: `~/.opentree/worktrees/<repo>/<branch>`,\nwhere `<repo>` is the name of the repository's directory. Worktrees used to go\nunder `<repo>/.opentree`, and every tool that walks a project found the extra\ncheckouts — test runners collected their tests twice, `tsc` compiled them,\nlinters and formatters walked them, watchers rebuilt on every save an agent\nmade, and a worktree without its own `node_modules` quietly resolved the\nparent's. Git was the only tool told to look away. Out of the working tree,\nnone of them can see a worktree at all.\n\nTwo clones with the same directory name get separate directories: the first\nclaims `<repo>` with a small `.repo` marker naming it, and the second gets\n`<repo>-<hash>`.\n\nTo keep worktrees inside the repository — where a plain `find` will meet them —\nset `base_dir` to a relative path, in the repository's own `opentree.toml` or\nglobally:\n\n```toml\n[worktree]\nbase_dir = \".opentree\"   # inside the repository, as before\n```\n\nAn absolute path, or one under `~`, is accepted from the global config only: a\ncloned repository does not get to point opentree at the rest of your\nfilesystem. Workspaces made before a change of `base_dir` stay where they were\nmade — opentree finds them through git — and `opentree doctor` says where the\nworktrees of the current setting go, and whether that is inside the working\ntree.\n\nThe state lives outside the repository too, at\n`~/.opentree/state/opentree-<hash>/state.json`. Nothing of opentree's is written\ninto the working tree, and nothing in `.git` is touched, so pre-commit hooks\nthat stage everything and automations that refuse a dirty checkout never meet\nopentree. A `state.json` an older release left under `<repo>/.opentree` is\nmoved out the first time any command runs.\n\n### Seeding a Worktree\n\nA git worktree carries only what git tracks, so a fresh one has no `.env` and no\n`.npmrc` — and the agent's first turn goes on discovering that. List the\nuntracked files a worktree needs and opentree links them in as it creates one:\n\n```toml\n[workspace]\nseed = [\".env\", \".npmrc\", \"config/local.json\"]\n```\n\nEach entry is a path relative to the repository root, and it lands at the same\npath inside the worktree. They are symlinks rather than copies: one credential\nset, shared, so rotating a token in the repository rotates it in every worktree\ninstead of in one out of five.\n\nFiles only. A directory is refused — `node_modules` is the output of an install,\nnot a file to link, and a worktree that deletes a linked one has just emptied\nyour main checkout's. A path that leaves the repository, by `..` or through a\nsymlink, is refused when the workspace is created rather than seeded quietly.\n\nA file the repository does not have is skipped, and one the branch tracks itself\nis left alone: git checking it out is the signal that the branch has its own.\n\nWhen one branch has to change a shared file, detach it — the link becomes that\nworktree's own copy, keeping what was in it:\n\n```bash\nopentree seed detach feat/add-dark-mode .env\n```\n\nThat can also happen by accident: tools that save by renaming over a file\nreplace the link with an ordinary one. `opentree setup <branch> --dry-run` reports\nwhich seeded files are still linked and which have quietly detached.\n\n### Setting Up a Worktree\n\nSeeding puts config where git could not. Setup is the other half — what has to\nbe built rather than copied:\n\n```toml\n[workspace]\nsetup = [\"pnpm install --frozen-lockfile\"]\n```\n\nThe commands run as the first phase of the chat, in the worktree, with their\noutput streaming into the window. The agent starts when they finish. That is the\npoint of running them there: an agent that starts against a worktree with no\n`node_modules` spends its first turn discovering it, and may \"fix\" your lockfile\non the way.\n\nWhile they run the dashboard shows the workspace as `setting up…`. Nothing is\ntimed out — a warm install is two seconds and a cold `cargo build` is twenty\nminutes — so `esc` is how a hung one ends, and it stops the whole process tree\nrather than just the shell. If a command fails, the panel offers `[r]` to try\nagain and `[s]` to start the agent anyway, and the failure is recorded in the\ndashboard's error log (`E`). It is never pasted into the conversation: whether\nthe agent should see it is your call.\n\nSetup runs once per worktree. It runs again when you edit the commands, and not\notherwise — losing a chat window relaunches one, and reinstalling on every attach\nwould make attaching cost a minute.\n\nNot sure what to put in the block? opentree will read the project and propose\none, from `package.json` or a `Procfile`:\n\n```bash\nopentree setup --suggest\n```\n\nIt prints; it never writes. What lands in `opentree.toml` is committed, runs on\nevery machine that clones the repository, and is approved by a prompt that means\nnothing if opentree wrote the thing being approved.\n\nTo repair a worktree, or run a setup you skipped, without restarting a chat and\ntearing down a live conversation:\n\n```bash\nopentree setup feat/add-dark-mode           # re-seed, then run the commands here\nopentree setup feat/add-dark-mode --dry-run # report what is seeded and what has run\n```\n\nBoth paths write the same marker, so a worktree prepared from the terminal is one\nthe chat will not prepare again.\n\n#### Approving what it runs\n\n`opentree.toml` is tracked in git, so `setup` and `run` are executable code that\narrives with a clone, from whoever last had commit rights. opentree asks before\nrunning them the first time, in the chat, showing exactly what it is about to\nrun. The answer is recorded per machine, per repository, and per exact text — an\nedited command is asked about again.\n\nFrom the command line, for CI or to answer ahead of time:\n\n```bash\nopentree trust          # approve what opentree.toml now says\nopentree trust show     # print those commands, and whether they are approved\nopentree trust revoke   # drop this repository's approvals\n```\n\nApprovals live in `~/.opentree/trust.json`, never in the repository — a\nrepository cannot vouch for itself.\n\n### Dev Servers\n\nFive worktrees of one project all want port 3000. Give opentree the command and\neach gets a port of its own instead:\n\n```toml\n[workspace]\nrun = \"pnpm dev\"\n```\n\n`opentree prune`, which already reaps workspaces whose worktree was deleted\noutside opentree, also stops server windows with no workspace left behind them.\n\nServers start on demand, never on creation — five worktrees each running\n`next dev` is several gigabytes nobody asked for. Press `w` on a workspace row\nto start or stop one, or open the **Servers** tab (`tab`) for the full list:\nevery workspace, what its server is doing, and its address.\n\nEach workspace is assigned a port between 20000 and 32000 once, and keeps it —\nso an OAuth redirect URI registered against `localhost:20431` keeps working. The\nport arrives as `PORT`; opentree never rewrites your command, so a stack that\nignores `PORT` can be told `--port $PORT` in the command itself.\n\nThe server runs in its own tmux window (`<branch>:run`), so `enter` in the\nServers tab attaches to it and all of its output is there. Deleting a workspace\nstops its server.\n\n#### Names instead of ports, with portless\n\nIf [portless](https://github.com/vercel-labs/portless) is installed and its\nproxy is running, opentree starts servers behind it and the Servers tab shows\n`https://<branch>.<repo>.localhost` — which reads as \"this branch of this\nproject\" — with the port still listed beside it.\n\nThe name is passed explicitly rather than left to portless's own inference,\nwhich reads `package.json` or the git root and so infers the same name for every\nworktree of one repository.\n\nopentree never installs or starts portless itself. Getting its proxy running\nmeans a certificate authority, an `/etc/hosts` entry and a root-owned service,\nand it asks for those with a sudo prompt — which in a detached tmux window\nnobody would see. If portless is installed but its proxy is down, the tab says\nso and serves on ports meanwhile.\n\n### Using Different Agents\n\nTo use one of the others instead of OpenCode:\n\n```toml\n[agent]\ncommand = \"claude\"            # or \"copilot\", or \"gemini\"\n```\n\nOr press `tab` in the dashboard for the Agents tab and pick one — it writes\nthe same config, and offers to fetch the ACP adapter if the agent needs one.\nFrom the CLI:\n\n```bash\nopentree agents list           # what's installed, and which is active\nopentree agents use claude     # switch this repo (--global for everywhere)\nopentree agents setup claude   # fetch its ACP adapter, if it needs one\n```\n\nAn agent opentree has no ACP spec for is refused up front, when you create a\nworkspace, rather than later inside a chat that cannot start.\n\n### Agents from the ACP Registry\n\nThe four built-in agents are a curated list, not a boundary. The\n[ACP Registry](https://agentclientprotocol.com/get-started/registry) — the\nsame index Zed and JetBrains install from — lists every agent that ships an\nACP server, and opentree installs from it:\n\n```bash\nopentree agents search             # what the registry has (add a term to filter)\nopentree agents add devin          # install one, into ~/.opentree/registry\nopentree agents use devin          # it is a normal agent from here on\nopentree agents update             # re-resolve every install against a fresh index\nopentree agents remove devin       # delete the install\n```\n\nInstalling executes code, so nothing is fetched before you have seen exactly\nwhat will happen: an npm-distributed agent shows the full install command —\npinned version, opentree's own prefix, npm's install scripts disabled, the\nsame posture as the Claude Code adapter — and a binary-distributed one shows\nthe archive URL and the sha256 it will be held to. Each install lands in its\nown directory under `~/.opentree/registry`, wears a `registry` tag in\n`agents list` and the version the index pinned; `agents update` builds the\nnew version beside the old and swaps it in only when complete, so a failed\nupdate leaves the old agent working.\n\nThe dashboard's Agents tab is the same feature without leaving the\nterminal you are already in: `a` fetches the index and lists it, `enter` on\nan entry shows the same consent card `agents add` prints and installs on\n`y`, `u` and `U` are `agents update`, `x` is `agents remove`. An agent\ninstalled there is a row the moment the install finishes — no restart.\n\nEverything else is indistinguishable from the built-in four:\n`--agents claude,devin,goose` races them, a workspace remembers which one it\nruns, and `opentree doctor` reports them.\nTwo honest gaps: a registry entry does not say where its agent keeps skills,\nso the Skills tab leaves registry agents out rather than guessing; and the\nfew agents distributed only via PyPI's `uvx` are listed by `agents search`\nbut not installable yet.\n\nOrdinary commands never touch the network — the loader reads installed\nagents from disk, and only `agents search`, `add` and `update` fetch the\nindex. Offline, the last index this machine saw answers, with its age noted.\n\n## How It Works\n\n1. **Worktrees**: Git worktrees allow multiple checkouts of the same repo in different directories. Each workspace lives in `~/.opentree/worktrees/<repo>/<branch-name>/` — outside the working tree, so the project's own tools never see it — unless `base_dir` says otherwise.\n\n2. **tmux Orchestration**: A single tmux session (`opentree-<repo>`) manages all workspaces. Each workspace = one tmux window. Attach to work, detach to switch.\n\n3. **State Persistence**: Workspace metadata (branch, created time, agent, issue number) stored in `~/.opentree/state/<repo-key>/state.json`, outside the repository.\n\n4. **Agent Integration**: When creating a workspace, opentree launches your configured agent inside the tmux window, ready to code. With no agent configured, it uses the first supported agent found on your PATH.\n\n5. **The Chat**: The tmux window runs `opentree chat`, never the agent's own TUI. It holds one JSON-RPC connection to the agent over stdio and renders the conversation, so opentree sees every turn, tool call and permission request as structured data instead of scraped terminal output. The dashboard reaches a running chat over a Unix socket, which is how `m`, `a` and `c` work without attaching. Session IDs are kept in `state.json` so conversations survive closing the window.\n\n## Workflow Example\n\n```bash\n# Start working on a feature\nopentree new feat/add-dark-mode\n\n# Or pick up a GitHub issue directly\nopentree issue 42\n\n# (tmux attaches automatically, agent launches)\n# (work with AI agent, make changes...)\n# (detach with Ctrl+b d when done)\n\n# While that's building, start a bugfix in parallel\nopentree new fix/header-overflow\n\n# (work on bugfix...)\n# (detach)\n\n# Not sure which agent will do a refactor best? Race them\nopentree new refactor/auth --agents claude,opencode,gemini --prompt \"extract the auth middleware\"\n# (press D in the dashboard to compare, then promote the winner)\nopentree promote refactor/auth-claude\n\n# Review changes for first feature\nopentree diff feat/add-dark-mode\n\n# Create PR when ready (auto-generates title and body from commits)\nopentree pr feat/add-dark-mode\n\n# Clean up after merge\nopentree delete feat/add-dark-mode\n```\n\n## Troubleshooting\n\n### Start here: `opentree doctor`\n\n```bash\nopentree doctor\n```\n\nPrints what opentree can see — its own version, the versions of git, tmux, gh\nand node, which config file it resolved and what it says, whether this\nrepository's setup commands are approved, where state and sockets live, and\nwhat each workspace's chat is doing. Everything it does is a read, so it is\nsafe to run and safe to paste into an issue.\n\nIf a problem needs reproducing rather than describing, point opentree at a log\nfirst:\n\n```bash\nOPENTREE_LOG=/tmp/opentree.log opentree\n```\n\nAn environment variable rather than a flag, because the interesting failures\nhappen inside `opentree chat`, which a tmux window starts rather than you — and\nthe variable is inherited by every process opentree launches. Off by default.\nThe file holds branch names, paths and session ids, and is written `0600`.\n\n### \"Error: not a git repository\"\n\nopentree must be run from inside a git repository. Navigate to your project root first.\n\n### \"Error: tmux not found\"\n\nInstall tmux:\n\n- **macOS**: `brew install tmux`\n- **Ubuntu/Debian**: `sudo apt install tmux`\n- **Arch**: `sudo pacman -S tmux`\n\n### \"opentree requires tmux >= 3.0\"\n\nopentree sets the agent's environment via `tmux new-window -e`, which needs tmux 3.0 or newer. Upgrade tmux with your package manager (e.g. `brew upgrade tmux`).\n\n### \"Error: opencode not found\"\n\nInstall OpenCode from [github.com/anomalyco/opencode](https://github.com/anomalyco/opencode), or configure a different agent in `opentree.toml`.\n\n### The chat says the agent needs an adapter\n\nClaude Code speaks ACP through `claude-agent-acp`. Open the dashboard's Agents\ntab, select Claude Code, and accept the download — it installs to `~/.opentree/tools`\nand needs `node` on your PATH. If you already have the package installed\nglobally, opentree uses that instead of fetching a second copy.\n\n### The chat says the agent needs credentials\n\nThe chat's stopped panel offers `[l]`. What that does depends on how the agent\nlogs in, and opentree takes the agent's word for it in this order: a command the\nagent names itself (Copilot sends its own path and `login`), the command opentree\nhas recorded for it (`opencode auth login`, `claude auth login`), or the login\nperformed over the protocol. Gemini CLI takes the last route and offers four\nways in — Google account, Gemini API key, Vertex AI, gateway — so `[l]` opens a\npicker. A terminal login hands the window to the agent and restarts it when it\nfinishes; a protocol login happens inside the running agent and needs no restart.\n\nCredentials also go wrong while an agent is perfectly happy to answer: a token\nexpires, a key is revoked, a login lands on the wrong account. `/login` reaches\nthe same picker mid-conversation, and the conversation survives it.\n\nAnything else that stops an agent offers `[r]` to restart it.\n\n### \"Error: gh not found\"\n\nInstall GitHub CLI from [cli.github.com](https://cli.github.com/), then authenticate:\n\n```bash\ngh auth login\n```\n\n### Workspaces not appearing in TUI\n\nState file might be corrupted. `opentree doctor` prints where it is (under `~/.opentree/state`); delete it and recreate workspaces.\n\n## Contributing\n\nContributions welcome! Please open an issue or PR. See [CONTRIBUTING.md](CONTRIBUTING.md) for the quality checks to run first.\n\n### Development Setup\n\n```bash\ngit clone https://github.com/axelgar/opentree.git\ncd opentree\ngo mod download\ngo build -o opentree ./cmd/opentree\n./opentree --help\n```\n\n### Architecture\n\n`cmd/opentree` is the CLI surface; `pkg/` is where the work happens.\n\n| package | what it owns |\n| --- | --- |\n| `tui` | the dashboard: the workspace list, the Agents, Skills, Plugins and Servers tabs |\n| `chat` | the conversation view, and the control socket the dashboard reaches it through |\n| `acp` | the Agent Client Protocol client — the agent subprocess and its stdio |\n| `workspace` | a workspace's lifecycle, over the four below it |\n| `worktree` | git worktrees and branches |\n| `tmux` | sessions and windows |\n| `state` | `state.json`, shared between the dashboard and every chat |\n| `github` | `gh`, for PRs, issues and CI status |\n| `bootstrap` | seeding a worktree, running its setup, and the trust gate over those commands |\n| `skills` | propagating agent skills into worktrees |\n| `plugins` | the Agent Plugins store: install, validate, list, remove |\n| `registry` | the ACP Registry client: the index, its cache, and installed agents |\n| `config` | `opentree.toml` and the agent registry |\n| `notify`, `diag`, `ui`, `fsutil`, `gitutil` | the small shared pieces |\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n## Trademarks\n\nopentree 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).\n\n## Acknowledgments\n\n- Inspired by [Conductor.build](https://conductor.build) by Sahil Lavingia\n- Built with [Bubble Tea](https://github.com/charmbracelet/bubbletea) TUI framework\n- Integrates with [OpenCode](https://github.com/anomalyco/opencode) AI coding agent\n","readmeFilename":"README.md"}