{"_id":"rn-iso","_rev":"30-59900211b3a7d7a7aa0843e42271d81d","name":"rn-iso","dist-tags":{"latest":"1.5.0"},"versions":{"0.1.0":{"name":"rn-iso","version":"0.1.0","_id":"rn-iso@0.1.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"f083b7d711f4741d85affbcb6f341183911feb88","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.1.0.tgz","fileCount":42,"integrity":"sha512-vHWfcS6hcK6Sgg51V5LYbkAEWf6ugjDQgUWiyiqQd3lR4Fsb+wE+g6Xj3REMtQxAdqGRtnC4biGJW3NZBAzprw==","signatures":[{"sig":"MEQCIE+BegFE0gG/IlCfiLIaziG9XGprSjpvnEVpC1lSmqlLAiBrag8yeS9qmANsyi1XlWRPLRjdxcaWpj3I3mWEFowYPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":221157},"type":"module","engines":{"node":">=20"},"gitHead":"087453e23da2c778149c92c44076be2562c32318","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.1.0_1777352322082_0.31231912652869","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"rn-iso","version":"0.2.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.2.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"3454c154305324d51287de3a2239013af27b360b","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.2.0.tgz","fileCount":23,"integrity":"sha512-E9FE7xukq9WXwN2BVQC5PAOjA2GcZW7IEhgW00NmaiNQHPFFSbsWC/eFVZr72WZIb2JngQxzRs+4fSXozomGcQ==","signatures":[{"sig":"MEQCIELdSMoAeUYxb8E7dRJTQNxaa9SlxivN8LnM1MuXhlMKAiB1BABUMS1LWMvCJ5Pn73eqTneE5WNqBIzaAHWFnjEzmg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82075},"type":"module","engines":{"node":">=20"},"gitHead":"752fb7f8165d1bc4cc9e61b69b40ad2f0d0b1327","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.2.0_1777388398232_0.9291535185939594","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"rn-iso","version":"0.2.1","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.2.1","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"d6670a95915c2d017172599d14a7dd87e896eeca","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.2.1.tgz","fileCount":23,"integrity":"sha512-tPeXyBfqbP+G/Qekcim2U9l9motZKLDFQPtevEPYCTwgSfRzJBfCDJGtTQMeR9m+cpXSS8lZbuWIswvj7eEU2Q==","signatures":[{"sig":"MEYCIQCEM3ajvV30zC8n5UxTpUvTn44+oaCRmdLBSFwmnO0IXwIhALpUHwr+rTV11zKXxwO20mEEfypQY1HQSaEPTMlrm8eJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82212},"type":"module","engines":{"node":">=20"},"gitHead":"29014835e96a0746909e68ca384641fdd521ea85","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.2.1_1777388860538_0.7413619409786774","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"rn-iso","version":"0.3.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.3.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"10e258d8372f53242bc14ade9917c60e52d08b15","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.3.0.tgz","fileCount":23,"integrity":"sha512-sgH+pSn2wFPFaNfNhsBzRU1jRaJw6epht5JHftt1Dty2IRv9fxCH6M0S7vIVWcSueCHPYgsDAcAyrE2VKvejCA==","signatures":[{"sig":"MEUCIFthqjjCpcVhfkjGjGcfOdAniyve70YG4ZJl6MvE5kuTAiEA73BTV3DIsC9dH6VwgIc2P2T4hYjbkJ5e5g3vX1gUQ9g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84741},"type":"module","engines":{"node":">=20"},"gitHead":"b9e4a0c19b3ca7467dd5178e4cdf47710d59cbf3","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.3.0_1777390207602_0.20374288723572542","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"rn-iso","version":"0.3.2","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.3.2","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"9b08ca68fcb0f2bd7d2fff93f45f262834d9d2be","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.3.2.tgz","fileCount":23,"integrity":"sha512-NSAIol98RSX1CeoCzNxV0GCWh5oJu5CQzHTZau8xqxZLxuAC/jPl1fr2VVWz/HrpZNIMRIre2GVFHOeL9AaAUA==","signatures":[{"sig":"MEQCIFv6OUwl0RxYI88BU8erAkIqUBKLooGG1nKGVlpBvr6GAiB+FHW8efo4NKCIdTFkJzas2OhXtDAL6WdFRtBTPu+Wgw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86401},"type":"module","engines":{"node":">=20"},"gitHead":"f743da3589af887367af6dd711dd65392c906f02","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.3.2_1777394198640_0.1387069743362659","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"rn-iso","version":"0.3.3","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.3.3","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"663729f593bd718fa767cdf12beb5b4e6ff00775","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.3.3.tgz","fileCount":23,"integrity":"sha512-G0Nva8mm1DrV9IoK8vaJwnl5oA9Nr+kXlYv2x4tqeEUQn/REgmDD+lw5H3zrJ4AqIMt2e2zS4y6bNMkJ4SYRZA==","signatures":[{"sig":"MEUCIQCuMrsIu7asaiv0VikvZspOTYSUImYTw6/E+ic3EwHyKQIgFrY+Lw0PWyhi7DnCI5Ybw4txHGKGnC87sjNU4rdNTEE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86549},"type":"module","engines":{"node":">=20"},"gitHead":"7b8d1815272f19767a47accd9660d389c38e18a4","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.3.3_1777395982422_0.6974117548196506","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"rn-iso","version":"0.4.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.4.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"c5a4a6654cad9e8b478b87536406301ba105c104","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.4.0.tgz","fileCount":24,"integrity":"sha512-jLP+Ty/KsfKfC4uajQ20IYqsFub1wEOMh16FS+J6GIQlmBS9ICK5DPcx08+IbFXPeC5miZPShHZSgn5gdBXHEA==","signatures":[{"sig":"MEQCIEXlx4WZwxZ9GVxuI1bSa0eNjU5Inbxjca0vPWn+H8i8AiB1Cf++X9hAtx5f+r0i8y+p0xAht56N0o5xo7bHdDW22w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93429},"type":"module","engines":{"node":">=20"},"gitHead":"a274a78b1290a200f67fae62b09113ef0a17cb16","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.4.0_1777400128243_0.2516858520509324","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"rn-iso","version":"0.4.1","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.4.1","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"94f637e33a3c78e9e4d8ec9e5c7a51ea53d84036","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.4.1.tgz","fileCount":24,"integrity":"sha512-rY9YAVpG7k6HtNR9zU8zjV8WOn67i2DBT67a1x9CQGYkL4/LXqis1BJL18vynpKDGRNbKx8yekt5piLk4JHhMA==","signatures":[{"sig":"MEQCIDPrFOQyZCWYikZGn306oTjAz7ZRLtGRxIaYn1WhVFw5AiAlnHLCrarlDH1Utm1d3YZotI0ChGf33u9yeYFmQvWCbA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95283},"type":"module","engines":{"node":">=20"},"gitHead":"f4b61950da3757acbd11f07971b519952df71023","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.4.1_1777412960727_0.34700538883989385","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"rn-iso","version":"0.4.4","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.4.4","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"d3c918d75c83bb002076481309a66c5d86b2d0d9","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.4.4.tgz","fileCount":25,"integrity":"sha512-rzrE7Hz8k793vGSpTnW9uhHpiiiHA0x4rDBmzQXJhERrNEsoRKY8n3jpF43ZR2Wny/OXM2rARdHvSFCG/RtN6A==","signatures":[{"sig":"MEUCIQDAFYHQGws7NTZx12vpK3uqOplB/mx5vs6WkpM5IWuc2QIgSxcqYLbEbQpKNt17bL+e6h/zSU8+bTZrZnSA6QHdx7E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109914},"type":"module","engines":{"node":">=20"},"gitHead":"0709a50c6492bd78647ae0fe4b9df79f45827c27","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.4.4_1778534958573_0.9032112385745807","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"rn-iso","version":"0.4.5","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.4.5","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"df0b56d9c2c0949d2633feef4519b7b002be69bc","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.4.5.tgz","fileCount":25,"integrity":"sha512-wt40LKGqvfnF8dbg6lzZ3M5tzjG/qCtG2V0bzR6BIv0rd4OCWS2fKlmSGKRFb2pua4xDgVBs0NaTqupyDFSMyA==","signatures":[{"sig":"MEQCIEue/hZ5H6Mm39eo73B+rqnn1qJzlz+VFx5uLTI6feTOAiA1ubM/Ow97FGdBN55y6aI9nlcqWxx2R0w7MnSXJIGuzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110826},"type":"module","engines":{"node":">=20"},"gitHead":"afeb30881f9e07e580d69b93f7124c249b7f8083","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.4.5_1778536448166_0.23409395964266055","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"rn-iso","version":"0.4.6","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.4.6","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"a4ebbeb0ac7ee4fecafc5b0408265b86d3e0b14a","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.4.6.tgz","fileCount":25,"integrity":"sha512-uSTJILtEuoGFSLX1DnSEeQUzz22qKzD6Fm0ZrrUrz7PZ/ElHvPa8iMB8itnnYXi+HCCFAnR08IG2q7mFkHvqcA==","signatures":[{"sig":"MEUCIB8iZT7KaReL23DSrn0X14z1FbpYz7lSExvfBwRJdVbgAiEArYWs3vrJgJ/8eP9ujhJS2OmPFX19GxhTV8j25JsU9/8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110818},"type":"module","engines":{"node":">=20"},"gitHead":"8598470778d267355f3c2db6e89cc560136a4b67","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.4.6_1779142136040_0.27293297852306275","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"rn-iso","version":"0.5.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.5.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"695c8e9763a4cc0db5a8609d5c06825ac842785f","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.5.0.tgz","fileCount":26,"integrity":"sha512-PDqW+I296fvguu5HkWi/jxJ7NxbIP/AaB8hHNlg6A2Ro7+apU0Or0oDwFfogvT7U0/oV2Jy+20trLTkvZhR9Ng==","signatures":[{"sig":"MEQCIHTaOAO8vWueWiV3jbLXk2dgdE8bwru5T9aOAJ5q1SXKAiBMBZXUM8w7+wB0wf7U079Nn6ETtoHFQ+5VjPxEtLe9fw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119099},"type":"module","engines":{"node":">=20"},"gitHead":"de075fba97ff7acec0ae1d8ef629d03cf2951c77","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.5.0_1781230696750_0.15869585968258582","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"rn-iso","version":"0.6.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.6.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"50280bc8329ce868292c6a84bd2fb98b08b87919","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.6.0.tgz","fileCount":27,"integrity":"sha512-ajH9m3HA98K+Omjd9jn24oElZdOEvAr77jiadKiCLGmpmK+RklezNFgrvySQ/xrgf/RseoyXVS12wwDq3RhnbA==","signatures":[{"sig":"MEQCIEOkIMUX1qMe4jOjIGGehnUPKAWnHwabWrj3Lnmfow3SAiA6M3kic+gMxoJv302qZNPYRxN9JcjwQ9oKZ0NS5U5M/w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122774},"type":"module","engines":{"node":">=20"},"gitHead":"296582fc5a9f68f864d587978471b20227eeb23e","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.6.0_1781232746166_0.11331544995064813","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"rn-iso","version":"0.6.1","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.6.1","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"2ef48d566d7a5d2e8b75ec0bf6d4d785cb53f20e","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.6.1.tgz","fileCount":27,"integrity":"sha512-gQh1qiQ9XfK2zW/FiA3UpmJkjBXP1vDH5qdng5voKbr+YOF4uUd+UYdw1qrIJQkxS6nZ1CHWg3+P0ob4UFF6zw==","signatures":[{"sig":"MEYCIQCKIcr9dSSvFiW1LkyjGV9rniX2SGG7/yHP78K5mGGy7QIhALANXyxMI2SbGIjZmdItAT61z6sbfkoTNL4MRN2RaPvf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":124422},"type":"module","engines":{"node":">=20"},"gitHead":"c26ccaf2e9ec8d7aaec1c3e72bd6c3caf7fc263f","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.6.1_1781839708868_0.17379795887608585","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"rn-iso","version":"0.6.2","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.6.2","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"32560cac70a54f039ffd1fb99d9b1f400204da04","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.6.2.tgz","fileCount":27,"integrity":"sha512-8Anu7MqXgEaSH35jVYIjIjQlwks5IMcL8jEBOcW+ZlrhZCm9ThA+vGbY0UxtDFc/o/dFCmqa4ZROjtVWxyL8Gg==","signatures":[{"sig":"MEQCIB6An9G9SCt5Q0ml+iYe223KtG8IrYp9LAd6CGHVcLJnAiBVaEk3GM2xRYWpusb8/oUUSkB13mSkp5Jst77vGcKGEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125017},"type":"module","engines":{"node":">=20"},"gitHead":"3b891e4314e10887cd06c415d9e2f9150b1cac53","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"10.9.7","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"22.22.2","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.6.2_1782946417845_0.44918552658657385","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"rn-iso","version":"0.7.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.7.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"d3b4cb27d0f86aaeafac853f8ebc08ece93f5507","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.7.0.tgz","fileCount":29,"integrity":"sha512-OL8Wg7uaNsN/lMhppRIHghvieq+oIYmYHa845Ady0IpdGCPiQ0/1n+yFXptAftK1No0aklmcLTGR6YQQrwXCFw==","signatures":[{"sig":"MEYCIQDth5Bi8098khVx62RipdBQnB39eirA0XshEpI4ibLPlQIhAMMYnHQfVrgXyUr5qSaAU/H4/AlkcO7JN6H1/XvnT8sX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204805},"type":"module","engines":{"node":">=20"},"gitHead":"34800a5dddfb9b2c513b7ecd163721dabf3bdadb","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.17.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.4.0","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.7.0_1787247293406_0.8942511138560789","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"rn-iso","version":"0.8.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.8.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"5f7a2a17a38e1d52d5c02e394a19e22b29978096","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.8.0.tgz","fileCount":27,"integrity":"sha512-Kdo68eGUGj77qu5DTI0B6vzIswqkh5VDUJEPlX7zd9wTGk+G7NW9zganShdzNll9dQPtWLBorrzVJDjVK7c83w==","signatures":[{"sig":"MEUCIEbWscD8DFOnmamzZY86BXIVYrBD6iSpPUDvYSgD0Y/tAiEAzFHSv06fxdUD9dV5jjuPK2PikLt0kYVQJRyMYlWEYZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203495},"type":"module","engines":{"node":">=20"},"gitHead":"82855f218b21e519acf1812923385465dbea7a17","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.17.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.4.0","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.8.0_1787252502742_0.18437331026880321","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"rn-iso","version":"0.10.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.10.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"7fd6d86357f23ecb4480de7591c695d6e9bd82a4","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.10.0.tgz","fileCount":27,"integrity":"sha512-qtJ4mEwFEK0ymyn2EM+6/MuCZIghYMEEYPhcSaqwtVFNYk7gITL2k32lFhdN72eOwmHXHDMzsqVZqXHvNaiytQ==","signatures":[{"sig":"MEUCIG7qQBIq3tZxUMs0Oy7r1FiQXuAQasDfj4/nr1B/tdk4AiEA44FXIFQYtEeS9azjUB5P26WGOPfOebyyMpY/OXFYh/c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203278},"type":"module","engines":{"node":">=20"},"gitHead":"034305251f908403feb8c236990cf8e48540b1d6","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.17.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.4.0","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.10.0_1787263277113_0.2829698916786656","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"rn-iso","version":"0.12.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.12.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"f56adce9a7305d0972ec664ddcee57fa10408456","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.12.0.tgz","fileCount":29,"integrity":"sha512-gwri/rdIzh4Ta71S/xbHn93Pcccn+o995TWgIxBJ+1isfCzE6Zgx4uYO/TYQkYnCpblmXADocB1ZbDHfyC9srw==","signatures":[{"sig":"MEQCICiA3DBvhqhebh71R960FuTh1fR2G4tiyvUlzUpRs2CqAiBxV4XlTciPAVIxRjYvYmRMzyZb6lUUc5/Fvnm6hwksPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215213},"type":"module","engines":{"node":">=20"},"gitHead":"c0016311ce9b8d27349320fc63f7b76c42ab5c30","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.17.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.4.0","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.12.0_1787335303913_0.5249884162834935","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"rn-iso","version":"0.13.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.13.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"e025f08aa05ced1a2c2c8f598ed6144b5fb8dd41","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.13.0.tgz","fileCount":29,"integrity":"sha512-DaHQw1h7/UZ04DZBvk5yLJnXwqY7PxE9MVQu3+ClfEqkYhbkBDbJHagVwj3G5ZX7lsCLk1RD/j6nGyJdHK2Stw==","signatures":[{"sig":"MEQCIG5oEaKLhgkNTADu2lVj3kP4meUajHjryKVo5S3s4IV/AiBLyBUuVgT/p5Eiln6FFmIaeKWaIoF0KkZ9vCz4GUUzSA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220563},"type":"module","engines":{"node":">=20"},"gitHead":"9ee4d4144435df4de740a2ef1d08a7fd9700a4e0","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.17.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.4.0","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.13.0_1787453159509_0.788848318338935","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"rn-iso","version":"0.13.1","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.13.1","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"bae8460a5ef4701308dd64e0eb228ab41036935a","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.13.1.tgz","fileCount":29,"integrity":"sha512-YyojJ5wgPIyuobLsVaRBPYLWKZlNIMghChhxyMpNsdw9YIbj44WQ8KDGIh9PA0MCCHdsojx2s3+34hQXVQHunw==","signatures":[{"sig":"MEUCIQCF0VUcNcoKH/bqvwXwwWuGwfedsAzHImaiHN61Ifpt9wIgEy8Zvdm9WB0DiSF98VIsemwPfjXnqQiU4mgQBoAOFXs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":221276},"type":"module","engines":{"node":">=20"},"gitHead":"e2ac2bfb55a03a5087df8cbc4d662582a5702c3c","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.17.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.4.0","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.13.1_1787530385615_0.6123322985317659","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"rn-iso","version":"0.14.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@0.14.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"2242e25f5b6e68524f95a67dce1e8c25d527713a","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-0.14.0.tgz","fileCount":38,"integrity":"sha512-qhRrimsf9PsxWTSKE6hrIZ5UppmTCy8blHMLu4dHnkg0n5UhCIzV9pd8fqQ1/ZlltbM5pRjavXSBuD0TYovZJg==","signatures":[{"sig":"MEUCIQCCdhzBrlT2Y/s6IzhiunZsZ7jvfOThTeoQfHktIWfU/AIgOg5JKtcSBxWch8Fc1w/+DNPEejkgJLnhLiyoO/RWjto=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":272001},"type":"module","engines":{"node":">=20"},"exports":{"./cache-manifest":"./src/cache-manifest.js"},"gitHead":"6a58488c0988b3f1bf29ebb12e7583721d4ae71a","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.17.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.4.0","dependencies":{"chalk":"^5.4.1","prompts":"^2.4.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_0.14.0_1787588532842_0.8941950885376717","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"rn-iso","version":"1.0.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@1.0.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"0e0690bbc46cc4a374195627da49406db9689e84","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-1.0.0.tgz","fileCount":54,"integrity":"sha512-MA2mze3GfyxE0P2OvwYOSoQTng5+SLGmRt2zKdNOdaK8pmjPDbLRFS+GnEl5sc5apUqhv9ytJfQ+IU+iVjagqg==","signatures":[{"sig":"MEUCIQDL2RWaAoQuSfHYc1CxHcKVu51Gx3Ok+e0cyZfPfm6/MQIgL4QfmojnAzxqjrcuYTLyY06VjzcMj3W3tWaCq8y/lt8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":791753},"type":"module","engines":{"node":">=20"},"exports":{"./cache-manifest":"./src/cache-manifest.js"},"gitHead":"229e2320303556abf218670b396385bc03e789e4","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.17.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.4.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0","@rn-iso/metro":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_1.0.0_1787707566883_0.0896474177672848","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"rn-iso","version":"1.1.0","keywords":["react-native","expo","metro","simulator","emulator","worktree","agent"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@1.1.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"bin/cli.js"},"dist":{"shasum":"3f77cb066a05c790fd51e2421a609549f14db5d2","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-1.1.0.tgz","fileCount":57,"integrity":"sha512-GUJ7DHMfTmiEHzBteQ5RQWDdFYsNpRXTtbYGqK3qJcAN+esxqp7mI1FGSpoRs/cYoD2slis2ycZ55xU0l8TDZA==","signatures":[{"sig":"MEYCIQDdiLAGI0hJl2POxyhqVKtNuJejerSxbj6gZrB/VvhkwgIhAPhiH0dBjRYxE+eWDwTdmvHkd8/+19gcXgpQTSYEgva8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":894669},"type":"module","engines":{"node":">=20"},"exports":{"./cache-manifest":"./src/cache-manifest.js"},"gitHead":"553b83261f35d06e670fae01ad1d2674c3270499","scripts":{"test":"node --test test/*.test.js"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.19.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.7.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0","@rn-iso/metro":"^1.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rn-iso_1.1.0_1787717685771_0.3612494680621947","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"rn-iso","version":"1.3.0","keywords":["agent","emulator","expo","metro","react-native","simulator","worktree"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@1.3.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"dist/cli.js"},"dist":{"shasum":"462e339010981dc2815baa2b2542f0b9b3d5ec27","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-1.3.0.tgz","fileCount":26,"integrity":"sha512-l6HzaxnUBZxigIKTD0q6PCWv3v4rVYa5dyjZSMh36vNZMdHZeO9W7bLCLELPfcI7HByA0cvSPt736lnDmvlscQ==","signatures":[{"sig":"MEYCIQDEgVNBadsldZ35BmFBgiGB8POob5B1IL/23FBfBA3F/wIhAJWQPAtPX9N2mwUMpiHpPRdlQFb3m7iXZx9OINVkbHoQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":520232},"type":"module","engines":{"node":">=22"},"exports":{"./cache-manifest":{"types":"./dist/cache-manifest.d.ts","default":"./dist/cache-manifest.js"}},"scripts":{"test":"node --test test/*.test.js","build":"tsdown"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.19.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.7.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0","@rn-iso/metro":"^1.2.0"},"_hasShrinkwrap":false,"devDependencies":{"@rn-iso/expo-build-cache":"*"},"_npmOperationalInternal":{"tmp":"tmp/rn-iso_1.3.0_1787769365844_0.8368035750663387","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"rn-iso","version":"1.3.1","keywords":["agent","emulator","expo","metro","react-native","simulator","worktree"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@1.3.1","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"dist/cli.js"},"dist":{"shasum":"df7094c50e334de42c6f76da74e6bcd8fae0e9d8","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-1.3.1.tgz","fileCount":26,"integrity":"sha512-ScPniKjddR+XVhaT4SfA5fA2VovUijUGRdw1pu76qMlWk1/ANZ9NCb/pa/Iz6IIcz17ZLq1lF1PhPt4D92f0Lw==","signatures":[{"sig":"MEUCIGwSGMeveatovXSdTIzfGZaa8YFn8jmP3ONaMMtntf4pAiEAjBVLOzCO5bpDNCk0RVBdFh65vvFZbIkpS6v95odKjp0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":522055},"type":"module","engines":{"node":">=22"},"exports":{"./cache-manifest":{"types":"./dist/cache-manifest.d.ts","default":"./dist/cache-manifest.js"}},"scripts":{"test":"node --test test/*.test.js","build":"tsdown"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.19.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.7.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0","@rn-iso/metro":"^1.2.0"},"_hasShrinkwrap":false,"devDependencies":{"@rn-iso/expo-build-cache":"*"},"_npmOperationalInternal":{"tmp":"tmp/rn-iso_1.3.1_1787773583772_0.009460274751058817","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"rn-iso","version":"1.3.2","keywords":["agent","emulator","expo","metro","react-native","simulator","worktree"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@1.3.2","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"dist/cli.js"},"dist":{"shasum":"f526653c5930b5b2bc5f9767e4ffad6145fb3801","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-1.3.2.tgz","fileCount":26,"integrity":"sha512-FcYrvAtaRWuJSqVL105Cay7YqPc6RwjWycjSToM8nPnFGdDxag4Cu0zRDir2TtGvTT0gU2p7cMLS2V3XX9z/SA==","signatures":[{"sig":"MEUCIQCFuYA1yIC243tG69g58tj8tK9BrRMZsRn181MduooVaAIgQ2rJ3E0sAZQ2fIYkKNLXAFYNK7w7bBfRI9ZE9wuepJo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":526346},"type":"module","engines":{"node":">=22"},"exports":{"./cache-manifest":{"types":"./dist/cache-manifest.d.ts","default":"./dist/cache-manifest.js"}},"scripts":{"test":"node --test test/*.test.js","build":"tsdown"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.19.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.7.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0","@rn-iso/metro":"^1.2.0"},"_hasShrinkwrap":false,"devDependencies":{"@rn-iso/expo-build-cache":"*"},"_npmOperationalInternal":{"tmp":"tmp/rn-iso_1.3.2_1787783213355_0.18643660383061111","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"rn-iso","version":"1.3.3","keywords":["agent","emulator","expo","metro","react-native","simulator","worktree"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@1.3.3","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"dist/cli.js"},"dist":{"shasum":"d5ead4d8cbaa36a2f5f63f29884ee81826f411e7","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-1.3.3.tgz","fileCount":26,"integrity":"sha512-aJ/qW6kesoG/yt2FKTxL2cTice5JUd1BIjvuFsa7TEsbd3BH4vUiI7/vF4rqJIp2Zcs4Vh5ht/630IGhI5TWiw==","signatures":[{"sig":"MEYCIQDnlOOcEg+Fv0uRFAuasExs4FPFfsy8JQT6LsbQh7BeAwIhANVMg+q6Hki4NpaqAacZa8gHHE4tcTu2+nXPl7AA0Icd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":526922},"type":"module","engines":{"node":">=22"},"exports":{"./cache-manifest":{"types":"./dist/cache-manifest.d.ts","default":"./dist/cache-manifest.js"}},"scripts":{"test":"node --test test/*.test.js","build":"tsdown"},"_npmUser":{"name":"janicduplessis","email":"janicduplessis@gmail.com"},"repository":{"url":"git+https://github.com/janicduplessis/rn-iso.git","type":"git"},"_npmVersion":"11.19.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"26.7.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0","@rn-iso/metro":"^1.2.0"},"_hasShrinkwrap":false,"devDependencies":{"@rn-iso/expo-build-cache":"*"},"_npmOperationalInternal":{"tmp":"tmp/rn-iso_1.3.3_1787790745841_0.9515399478665933","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"rn-iso","version":"1.4.0","keywords":["agent","emulator","expo","metro","react-native","simulator","worktree"],"author":{"name":"Janic Duplessis"},"license":"MIT","_id":"rn-iso@1.4.0","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"bin":{"rn-iso":"dist/cli.js"},"dist":{"shasum":"90212130f3c2d9c853cf8ac2dfdfd334ca6d1323","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-1.4.0.tgz","fileCount":26,"integrity":"sha512-08g/PslsEQ56JyDjGIJhQfKR+M1lO+xN6ZSxYFkefiLMIETJO50i4aB0NvCztWIvKFP2kmJcCjelO8JUiBQHZg==","signatures":[{"sig":"MEUCIHehpeNjD+AZdpYM8Q47skqldaf1ZhX1tP1X0xEWC5YfAiEAtoe8Ap0iTo3wcthhMyv9xnGDGGxU8WQ8qUN5rzwGY8I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rn-iso@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":528774},"type":"module","engines":{"node":">=22"},"exports":{"./cache-manifest":{"types":"./dist/cache-manifest.d.ts","default":"./dist/cache-manifest.js"}},"gitHead":"47efacecd2ec89919cbd7155d6ea3594864adb15","scripts":{"test":"node --test test/*.test.js","build":"tsdown"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cce0a042-9669-42b8-af51-8d2077817af4"}},"repository":{"url":"git+https://github.com/appandflow/rn-iso.git","type":"git","directory":"packages/rn-iso"},"_npmVersion":"11.17.0","description":"Isolated React Native dev environments per project/worktree","directories":{},"_nodeVersion":"24.19.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0","@rn-iso/core":"^1.4.0","@rn-iso/metro":"^1.2.0"},"_hasShrinkwrap":false,"devDependencies":{"@rn-iso/expo-build-cache":"*"},"_npmOperationalInternal":{"tmp":"tmp/rn-iso_1.4.0_1787804250608_0.3784371665862354","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"rn-iso","version":"1.5.0","description":"Isolated React Native dev environments per project/worktree","keywords":["agent","emulator","expo","metro","react-native","simulator","worktree"],"homepage":"https://github.com/janicduplessis/rn-iso#readme","bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"license":"MIT","author":{"name":"Janic Duplessis"},"repository":{"type":"git","url":"git+https://github.com/appandflow/rn-iso.git","directory":"packages/rn-iso"},"bin":{"rn-iso":"dist/cli.js"},"type":"module","exports":{"./cache-manifest":{"types":"./dist/cache-manifest.d.ts","default":"./dist/cache-manifest.js"}},"scripts":{"test":"node --test test/*.test.js","build":"tsdown"},"dependencies":{"@rn-iso/core":"^1.5.0","@rn-iso/metro":"^1.2.0","chalk":"^5.4.1","commander":"^13.1.0"},"devDependencies":{"@rn-iso/expo-build-cache":"*"},"engines":{"node":">=22"},"gitHead":"3809227f2ea65aa6d1c1eb4883fdd85f96c07be2","_id":"rn-iso@1.5.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-MsPEMfgIH87UgS75rlKexJU1mJH9NwKpu2p5RqadQw+KMUcnLLUYYG/l/EhH0cmMyf5iHHWeHGZVV1m2NTk24A==","shasum":"06912c7bbf8aee66a691f281c531f0e19d66d0e9","tarball":"https://registry.npmjs.org/rn-iso/-/rn-iso-1.5.0.tgz","fileCount":26,"unpackedSize":558155,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rn-iso@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEJVGHtcXo7Td3oSIHsNDWFZkXd5BdtTBPwdpr3NOZyiAiAYdg51IYpHWWnDxSfMwsnC+xeMfzN7K2RYEq8qIeajZA=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cce0a042-9669-42b8-af51-8d2077817af4"}},"directories":{},"maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rn-iso_1.5.0_1787839827485_0.2992434402730515"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-28T04:58:42.081Z","modified":"2026-08-27T14:10:28.018Z","0.1.0":"2026-04-28T04:58:42.218Z","0.2.0":"2026-04-28T14:59:58.366Z","0.2.1":"2026-04-28T15:07:40.731Z","0.3.0":"2026-04-28T15:30:07.739Z","0.3.2":"2026-04-28T16:36:38.820Z","0.3.3":"2026-04-28T17:06:22.563Z","0.4.0":"2026-04-28T18:15:28.389Z","0.4.1":"2026-04-28T21:49:20.898Z","0.4.4":"2026-05-11T21:29:18.724Z","0.4.5":"2026-05-11T21:54:08.320Z","0.4.6":"2026-05-18T22:08:56.195Z","0.5.0":"2026-06-12T02:18:16.931Z","0.6.0":"2026-06-12T02:52:26.314Z","0.6.1":"2026-06-19T03:28:28.988Z","0.6.2":"2026-07-01T22:53:37.981Z","0.7.0":"2026-08-20T17:34:53.555Z","0.8.0":"2026-08-20T19:01:42.891Z","0.10.0":"2026-08-20T22:01:17.262Z","0.12.0":"2026-08-21T18:01:44.118Z","0.13.0":"2026-08-23T02:45:59.638Z","0.13.1":"2026-08-24T00:13:05.782Z","0.14.0":"2026-08-24T16:22:13.004Z","1.0.0":"2026-08-26T01:26:07.074Z","1.1.0":"2026-08-26T04:14:45.914Z","1.3.0":"2026-08-26T18:36:06.012Z","1.3.1":"2026-08-26T19:46:23.926Z","1.3.2":"2026-08-26T22:26:53.538Z","1.3.3":"2026-08-27T00:32:25.980Z","1.4.0":"2026-08-27T04:17:30.763Z","1.5.0":"2026-08-27T14:10:27.636Z"},"bugs":{"url":"https://github.com/janicduplessis/rn-iso/issues"},"author":{"name":"Janic Duplessis"},"license":"MIT","homepage":"https://github.com/janicduplessis/rn-iso#readme","keywords":["agent","emulator","expo","metro","react-native","simulator","worktree"],"repository":{"type":"git","url":"git+https://github.com/appandflow/rn-iso.git","directory":"packages/rn-iso"},"description":"Isolated React Native dev environments per project/worktree","maintainers":[{"name":"janicduplessis","email":"janicduplessis@gmail.com"}],"readme":"# rn-iso\n\n[![CI](https://github.com/janicduplessis/rn-iso/actions/workflows/ci.yml/badge.svg)](https://github.com/janicduplessis/rn-iso/actions/workflows/ci.yml)\n\nThe React Native / Expo CLI for AI agents. One isolated dev environment per project or worktree: `rn-iso start` runs the dev server on a reserved, collision-free Metro port under a detached supervisor; `rn-iso ios` / `rn-iso android` boot a dedicated, **owned** simulator/emulator, install a build from a shared fingerprint cache when nothing native changed, and launch the app wired to that port; `rn-iso logs --errors` answers \"did that work\" from a captured timeline instead of a scraped terminal. Multiple worktrees or coding agents can each get their own environment and build the same app in parallel without port or device collisions.\n\nIt never prompts, prints on the order of ten lines, takes `--json` everywhere, and reports a failing build as the _extracted_ compiler diagnostic plus a log path rather than four thousand lines of transcript.\n\n> **Experimental.** APIs, flags, and on-disk state may change. File issues if anything breaks.\n\n## Why this exists\n\nCoding agents are moving to the cloud, and React Native is one of the places\nthat goes badly. A cloud agent needs macOS, a matching Xcode, a booted\nsimulator, a signing identity, and every MCP server re-authenticated -- on\nrunners that cost several times a Linux box and lag Xcode releases by months.\nPhysical devices are simply out of reach.\n\nLocally, none of that is a problem. The environment is already set up, the\nMac is already paid for, simulators work, you are already logged into\neverything, and the agent harness already provides the isolation that a cloud\nsandbox is there to provide.\n\nWhat breaks locally is that agents share one machine. Two of them reach for\nport 8081, or the same booted simulator, and both end up talking to the wrong\nbundler -- silently, because nothing tells you a build attached to somebody\nelse's Metro. When an agent is killed mid-run it leaves a simulator booted, a\nMetro squatting on a port, and an `xcodebuild` test runner pinning a device\nnothing can now delete.\n\nThat is the first job of this tool: arbitrate the contended resources, and\nreclaim them when the agent that owned them dies badly. The second is the dev\nserver, which every agent otherwise backgrounds by hand and then scrapes a log\nfile for: `start` runs it on the reserved port and captures its output as\nstructured records, so `logs --errors` replaces the scraping. What stays out is\nthe build -- which command, which flags, when to install -- because that is\njudgment a coding agent already has from reading the repo, and rn-iso\ndeliberately does not take it back.\n\n### Where local honestly loses\n\n- **CPU and memory are finite.** Two or three live environments on a 16 GB\n  machine, not ten. Cloud wins this outright.\n- **Paths are not stable.** CI checks out to the same path every run, so\n  path-keyed caches (ccache, Xcode's compilation cache, a CocoaPods sandbox)\n  just work. Locally every worktree sits somewhere different, and those caches\n  quietly miss everything -- measured on one project as 0 ccache hits out of\n  1094 across two workspaces. It is fixable, but it is a tax cloud does not pay.\n- **Disk grows without bound.** Simulators and the shared caches that make any\n  of this fast all accumulate. `gc` exists for that reason.\n\nState lives in `~/.rn-iso/config.json`, keyed by absolute project path. Worktrees count as separate projects. There is no shared mutex -- each project gets its own port and its own device.\n\n## Quick start\n\nRun via `npx` from any RN/Expo project directory -- no install needed:\n\n```bash\nnpx rn-iso start             # dev server on a reserved port, under a supervisor\nnpx rn-iso ios               # owned sim booted, app installed and launched on it\nnpx rn-iso logs --errors     # no output + exit 0 = nothing is broken\nnpx rn-iso stop              # supervisor down, sim shut down, port freed\n```\n\n```\n$ npx rn-iso start\nOK: dev server on port 8082, supervisor pid 41233 (expo-child) (6s)\n\n$ npx rn-iso ios\ndevice      rn-iso-myproject (BF2A..) booted (9s)\nfingerprint a3f9b1.. hit (2s)\ninstall     from cache (3s)\nlaunch      com.example.app (1s)\nOK: com.example.app launched on BF2A..\n```\n\nThe order is not optional: `ios` / `android` never start the bundler, so with nothing holding the reserved port they refuse in about a second with `RN_ISO_NO_METRO` instead of spending four minutes building an app that cannot load a bundle.\n\nEach command takes `--json` and then prints exactly one line of JSON on stdout, with every other line on stderr:\n\n```json\n{\n  \"platform\": \"ios\",\n  \"udid\": \"BF2A-...\",\n  \"deviceName\": \"rn-iso-myproject\",\n  \"fingerprint\": \"a3f9b1...\",\n  \"cacheKey\": \"...\",\n  \"cacheHit\": \"local\",\n  \"cacheSkipped\": false,\n  \"appPath\": \"/...\",\n  \"bundleId\": \"com.example.app\",\n  \"launched\": true,\n  \"metroPort\": 8082,\n  \"logs\": { \"dir\": \"/path/.rn-iso/logs\" },\n  \"durationMs\": 9412\n}\n```\n\n`cacheHit` is a LEVEL, not a boolean: `\"local\"` (this machine's shared cache), `\"remote\"` (the project's own Expo `buildCacheProvider`, whose artifact is copied into the local cache on the way past) or `false` (it was compiled). `cacheSkipped` is true only when `--no-build-cache` was passed, which is \"nothing was looked up\" rather than \"nothing was found\".\n\nIn a different worktree of the same app, the same two commands get a _different_ owned sim and Metro port, so both run side by side.\n\nTo set a repo up for that in the first place, run `rn-iso doctor` and work\nthrough what it reports:\n\n```bash\nnpx rn-iso doctor\n```\n\nThere is no `rn-iso init`. Every edit that setup needs lands in a file the\nproject already owns -- a `metro.config.js` with its own transformer, a\n`Podfile` with existing `post_install` logic, an app config that may be\nTypeScript -- and a generator that rewrites those eventually corrupts one. So\n`doctor` reports, read-only and always exit 0, and the bundled `rn-iso-init`\nskill is the playbook for applying each finding by hand. The one edit that\nneeded no judgement, `.rn-iso/` in `.gitignore`, is self-ensured: `start`,\n`ios` and `android` each add it if it is missing and say so once on stderr --\ncommit that line with the change you were already making, and it stops being\nrewritten in every fresh worktree.\n\nFor AI coding agents, install the bundled skills so the agent knows how to drive the CLI (the lifecycle, the facts contract, and the destructive-command rules). They install with the skills CLI, straight from GitHub:\n\n```bash\nnpx skills add appandflow/rn-iso\n```\n\n[Getting started](https://appandflow.github.io/rn-iso/docs/getting-started) is the whole human-side setup: install the skill, have the agent run `/rn-iso-init`, then describe what you want built.\n\n## Owned devices\n\nEvery simulator or emulator rn-iso uses is one **rn-iso created**, named `rn-iso-<label>`, and recorded with `owned: true`. rn-iso never boots, allocates, or destroys a device it did not create -- it cannot stomp a foreign tool's simulator, because it never touches devices it didn't make. Teardown of the owning project (`worktree remove`, or `gc` on an orphan) destroys the device, not just a claim on it.\n\nThat rule has **no exception**. rn-iso has no physical-device support: there is no code path that boots, installs onto, or even probes hardware. A legacy record naming a serial is reported once and replaced by an owned emulator; the serial itself is never touched.\n\nThis is a change from earlier versions, where rn-iso picked an existing, unclaimed simulator from the pool instead of creating one. That model existed to avoid accumulating junk simulators -- but the accumulation was really a symptom of creation _without_ a reaper. The reaper now exists, so creating a device and guaranteeing its eventual destruction is no longer the same hazard.\n\nA pre-pivot assignment without `owned: true` (\"legacy\") is reused only while it is actually running -- rn-iso will not boot, shut down, or delete it. It converges to an owned device naturally, once it is shut down and re-created.\n\n## Destruction lives in exactly two commands\n\n`worktree remove` destroys the workspace you name; `gc --delete` sweeps the machine. **Nothing else deletes anything.**\n\nThe one workspace `worktree remove` never destroys is the main checkout: git cannot remove the main working tree, and deleting the source tree is not what anyone meant. There -- and only there -- it reclaims the environment instead: the owned devices are deleted, the Metro port freed, the registry entries (including nested monorepo app dirs) dropped and `.rn-iso/` removed, while the tree itself stays exactly as it was. Because nothing in the tree is deleted, the dirty-tree and unpushed-work guards do not apply on that path. A registered project directory that is not a git repo at all gets the same environment reclaim.\n\nIn particular `stop` does not, by design: it shuts the owned device down and leaves it assigned, so returning to a branch costs a boot rather than a create, a provision and a reinstall. There is no `--delete` on it, because an agent reaching for `stop` to reclaim memory must not have one within reach of a typo. Destruction lives in `worktree remove` and `gc`, never here.\n\n**A delete is not occupancy-guarded.** An owned sim goes away even if another tool is still attached to it. It is a device rn-iso created, for a project that is going away, and the process holding it is almost always the caller's own UI-test runner, which has nothing to return to. Skipping occupied sims there leaked booted sims and live `xcodebuild test-without-building` runners out of `worktree remove`, and \"left for a later gc\" only asked the same question again forever.\n\n`stop` _is_ occupancy-guarded, because the device it spares survives the call and is still there to come back to: an iOS sim actively driven by a foreign UI-test runner is left running and reported instead of shut down. (Android has no occupancy probe, so an owned, identity-verified AVD is always eligible.)\n\nIf a delete fails, the failure is reported, the config record is **kept** so the device stays tracked, and the command exits 1. Dropping the record on a failed teardown is exactly what turns it into a simulator nothing references.\n\n## Commands\n\nAll commands below take the same `npx rn-iso` prefix.\n\n| Command                                                                                                        | Purpose                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n| -------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `start [--json] [--wait <seconds>]`                                                                            | Start this workspace's dev server on the reserved port under a detached supervisor, and block until it answers _and_ verifies as this project's (default 60s). Idempotent: a healthy dev server on the port is a no-op. Bare RN is hosted in-process with rn-iso's NDJSON reporter; Expo runs the project's own `expo start --port <n>` as a child. Structured logs land in `<root>/.rn-iso/logs`, and `.rn-iso/` is added to the project's `.gitignore` if it is not already there. A failure under `--json` still puts one line on stdout: the `{code, message, remedy}` contract (`RN_ISO_METRO_TIMEOUT`, `RN_ISO_SUPERVISOR_EXITED`, ...).                                                                                                                                      |\n| `logs [--source <s...>] [--level <l>] [--since <d>] [--grep <re>] [--tail <n>] [--errors] [--follow] [--json]` | Query the merged NDJSON timeline in `<root>/.rn-iso/logs`. Prints and exits; nothing matching is a successful, empty result (exit 0). `--errors` is the agent-loop query: errors and fatals since the last marker. `--follow` streams.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n| `ios [--json] [--no-metro-check] [--no-build-cache]`                                                           | Boot this workspace's owned simulator, verify the reserved port holds _this project's_ dev server, fingerprint the native inputs, install the cached `.app` if that fingerprint has one (otherwise prebuild / `pod install` / `xcodebuild` and store the result), install, launch wired to the reserved port, and attach a device-log collector. Refuses with `RN_ISO_NO_METRO` in about a second when nothing holds the port; `--no-metro-check` overrides. On an Expo project a local miss also asks the provider the project already configured (`expo.buildCacheProvider`), time-bounded, and a hit is stored locally on the way past. `--no-build-cache` looks nothing up and builds fresh -- it still stores (replacing the entry) and still uploads. Debug / simulator only. |\n| `android [--json] [--no-metro-check] [--no-build-cache] [--variant <name>]`                                    | The same over `gradlew assembleDebug` and `adb`, on this workspace's owned emulator, with `adb reverse tcp:8081 tcp:<port>` doing the port wiring. On a project with product flavors, `--variant productionDebug` (or the `android.variant` setting, which the flag overrides) runs `assembleProductionDebug`, finds the APK in `apk/production/debug/` and keys the build cache on the variant; the launched applicationId is always read from the built APK's manifest. Debug variants only.                                                                                                                                                                                                                                                                                      |\n| `stop [--force] [--json]`                                                                                      | The inverse of `start`: halt this workspace's supervisor, reap its device-log collectors, shut the owned device **down** (never deleted, so it stays assigned), and free the reserved port. Non-destructive and takes no target -- it acts on the current workspace. With no supervisor recorded it falls back to killing an identity-verified Metro on the reserved port; `--force` is only for an unproven listener there. Already-stopped is a success at every step.                                                                                                                                                                                                                                                                                                            |\n| `status [--json]`                                                                                              | Show every registered project (machine-wide by default; there is no `--all`): device assignments (owned/legacy), Metro state, supervisor pid / mode / health, last build (fingerprint, cache hit, duration), log directory and error count since the last marker, plus machine capacity and free disk -- on the boot volume, and on the current project's volume too when that is a different one.                                                                                                                                                                                                                                                                                                                                                                                  |\n| `gc [--delete] [--older-than <days>] [--all]`                                                                  | Report what rn-iso has left behind: entries for projects whose directory no longer exists, orphaned `rn-iso-*` devices, records naming a device that is no longer on the machine, and every shared build cache with its size. Reports and writes nothing by default; `--delete` reclaims the dead entries (freeing their Metro ports), reaps the orphaned devices, and clears the stale device records (the record only -- there is no device left to touch, so it issues no simctl/avdmanager command). `--older-than <days>` additionally reaps owned devices whose _project_ has gone untouched that long, and trims cache entries nothing has used in that time. `--all` (with `--delete`) empties the caches whole -- see below.                                               |\n| `doctor [--json]`                                                                                              | Report the configuration that makes a second workspace slower than it needs to be: a missing dev client, a per-project Metro cache, a compilation cache left at its default path, Gradle's build cache off, a ccache conflict, a configured build-cache provider on the key this SDK ignores, and -- last, because it computes a real fingerprint twice via a temporary worktree of HEAD (removed again) -- a checkout that does not fingerprint like a fresh worktree. Read-only, and always exits 0.                                                                                                                                                                                                                                                                              |\n| `worktree create <name> [--base <ref>] [--label <name>] [--carry-ignored]`                                     | Create an isolated git worktree: carries over gitignored files, prints the worktree path (and, on stderr, what it branched from -- ref and short sha). `--base` takes `fresh` (origin/HEAD, the default), `head`, or any ref `git rev-parse` resolves; an unresolvable one is refused before anything is created. Does not install dependencies unless `--carry-ignored` clones the source's working state: its gitignored paths (node_modules, Pods, build output) plus its uncommitted tracked changes, applied when they fit the base and reported when they do not.                                                                                                                                                                                                             |\n| `worktree remove [<path>] [--force]`                                                                           | Remove a worktree, reclaiming its build artifacts, Metro port, and owned devices (deleted, not just freed). Defaults to the current workspace. Refuses if it has uncommitted or unpushed work unless `--force`, naming the right restore command per class (`git checkout --` for modified tracked files, `git clean -fd` for untracked ones). The workspace's own `.rn-iso/` never counts as dirt -- it dies with the worktree by design. On the main checkout it reclaims the environment only (devices deleted, port freed, `.rn-iso/` removed) and never touches the tree.                                                                                                                                                                                                      |\n| `guide [topic]`                                                                                                | Print reference docs for the installed version (topics: facts, metro, logs, errors, lifecycle, cleanup, settings). Generated by the binary, so it cannot drift.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n\n## How it works\n\n- **Config** at `~/.rn-iso/config.json`, keyed by absolute project path. Symlinked worktrees collapse via `realpath`. Every write goes through a lockfile and lands by atomic rename, so several agents provisioning at once cannot lose each other's device records. A config that will not parse is reported by name and never reset automatically -- it holds the records of every device rn-iso owns, and resetting it would orphan all of them.\n- **Port allocation:** `start` scans upward from 8082 for a port that is both unclaimed in the registry and actually free on the machine, reclaiming ports from dead projects on the way. Claiming is race-safe: the write only lands if the config still shows the port unclaimed, so two parallel runs that probe the same free port cannot both take it. A project whose directory only _looks_ gone because its volume is unmounted keeps its port.\n- **Owned device creation:** on iOS, `ios` creates the newest iPhone device type -- highest generation number, base model rather than Pro/Pro Max -- on the newest installed runtime by default (or reuses the project's already-recorded owned sim, booting it if shut down). On Android, it creates an AVD via `avdmanager create avd` against the newest installed arm64 system image (rn-iso never installs system images itself -- it errors with install instructions if none is found). Override the defaults with `ios.deviceType` / `ios.runtime` / `android.systemImage` in a settings file -- see \"Settings\" below.\n- **Build output is workspace-local.** `-derivedDataPath` points at `<worktree>/.rn-iso/derived-data` and gradle builds under `<worktree>/.rn-iso/gradle-build`, so `worktree remove` reclaims them definitionally and there is no global DerivedData directory to reverse-map to a workspace.\n- **The port is never baked into a build.** The fingerprint cache shares binaries across workspaces, so a port compiled in would let a binary built for 8082 be served to a workspace holding 8083. iOS gets `RCT_jsLocation` written into the app's simulator defaults (or an `expo-development-client` deep link); Android gets `adb reverse tcp:8081 tcp:<port>`. `RCT_METRO_PORT` is deliberately not passed to builds.\n- **Starting the bundler yourself still works.** Both Expo and the RN CLI probe the port and skip spawning a second bundler when one already answers `/status`, and `ios`'s Metro gate accepts a server you started as long as it runs from inside the project -- but nothing is captured that way, so `rn-iso logs` stays empty. Teardown (`stop`, `worktree remove`, `gc`) finds Metro by port via `lsof` and only kills it after confirming it answers `/status` **and** runs from inside the project: a port is not identity, so an unidentified listener is reported instead of killed.\n\nIf you need a single shared sim with a mutex instead of one owned device per project, see [`react-native-worktree`](https://github.com/aleqsio/react-native-worktree).\n\n## The dev server and logs\n\n`rn-iso start` runs the dev server for you, on the port it reserves for this workspace, under a **detached per-workspace supervisor**. It blocks until the server both answers and verifies as this project's (the same identity check teardown uses, never a bare port probe), then exits leaving it running:\n\n```bash\nnpx rn-iso start --json\n# {\"port\":8082,\"supervisorPid\":41233,\"mode\":\"bare-inproc\",\"logsDir\":\"/path/.rn-iso/logs\",\"alreadyRunning\":false}\n```\n\nIt has two flags and will not grow more: `--json` and `--wait <seconds>` (default 60). Anything a project needs beyond that belongs in its own bundler command. Running `start` twice leaves one supervisor -- a healthy dev server on the port is a no-op, including one you started yourself, which is reported with `supervisorPid: null` and left alone rather than fought over.\n\nThere is no machine-wide daemon: one supervisor process per workspace, recorded in `<root>/.rn-iso/state.json` and in the registry before it starts serving, and gone (with its records) on any exit path. Two modes:\n\n- **`bare-inproc`** -- bare React Native: Metro is hosted _inside_ the supervisor, loaded from the project's own `node_modules`, with `@rn-iso/metro`'s NDJSON reporter attached. Bundler events, in-app `console.log` and redboxes all arrive structured. Hosting is the only way to get them: both CLIs overwrite `config.reporter` after loading `metro.config.js`, so a reporter wired in there is discarded.\n- **`expo-child`** -- Expo: the project's own `expo start --port <n>` runs as a child and its stdout is parsed into the same records. Expo's dev server is protocol-bearing (manifest, dev-client and expo-router middleware), so reimplementing it would be forking Expo; the cost is that levels are _inferred_ from each line, which those records mark with `raw: true`.\n\nEverything lands as one JSON object per line under `<root>/.rn-iso/logs`, and `rn-iso logs` queries the files merged into one timeline:\n\n```bash\nnpx rn-iso logs --errors            # errors since the last marker; empty + exit 0 = healthy\nnpx rn-iso logs --source client --since 5m --grep 'Profile'\nnpx rn-iso logs --follow --level warn\nnpx rn-iso logs --errors --json     # raw records, so stdout is valid NDJSON\n```\n\n**Nothing matching is exit 0.** `logs --errors` returning nothing is the pass condition of a build loop, so an empty result must never read as a failure; the only exit-1 paths are a malformed query and no project. `--errors` means level `error` or `fatal` strictly after the most recent record carrying `marker: true`, and the marker is searched across every source, so a marker in one file closes the window for all of them. Markers are written when a bundle build finishes -- which is what stops an error you already fixed from being reported forever. `rn-iso status` reports the same count per workspace.\n\nThe record is `{ ts, src, level, msg }` plus optional `event`, `stack`, `marker` and `raw`. `src` is one of `metro`, `client`, `device`, `build`: the supervisor writes `metro` (both modes) and `client` (bare only -- in `expo-child` mode Expo's client output arrives on the bundler stream), and `ios` / `android` write `build` (the transcript at level debug, the extracted diagnostics at level error) and `device` (via the `simctl log stream` / `logcat` collector they attach after launch). `.rn-iso/logs/supervisor.log` is deliberately _not_ part of the timeline: it is the supervisor's raw stdio, and it is what `start` quotes when a supervisor dies before it can write a structured record.\n\n`rn-iso stop` is the inverse: it halts the supervisor (identity-verified: a pid is only signalled when it is alive, recorded for this workspace, and holding the port this project reserved), SIGTERMs the device-log collectors recorded in the same `state.json`, shuts the owned device down without deleting it, and frees the port. It never escalates to `SIGKILL` -- a supervisor mid-write on the log files is exactly what `SIGTERM` handling exists to finish -- so a supervisor that will not exit is reported with its pid instead.\n\n## Device settings\n\nThe device model, runtime and system image can be pinned per project so rn-iso's defaults are not what you get. There is no `rn-iso config` command -- rn-iso's commands take no device flags, so settings are **files**. See \"Settings\" below for the layers; the one that travels with the repo is `.rn-iso.json` at its root:\n\n```json\n{\n  \"ios\": { \"deviceType\": \"iPhone 17 Pro\", \"runtime\": \"26.2\" },\n  \"android\": { \"systemImage\": \"system-images;android-36;google_apis;arm64-v8a\" }\n}\n```\n\nResolution order: the project layer, then the repo layer, then that committed file, then rn-iso's own default (newest iPhone, base model, on the newest installed runtime; newest installed arm64 system image). A pinned model is honoured on **reuse** as well as on creation: an existing owned sim of a different model is refused rather than silently booted.\n\n## Shared build caches\n\nEverything `gc` reclaims is _dead_: a project entry whose directory no longer\nexists belongs to nobody, and a `rn-iso-*` simulator nothing references is\nnever coming back. Shared build caches are the opposite -- alive by design,\nshared by every project on the machine, and pruned by nothing:\n\n- **Metro's `FileStore`** has no eviction logic whatsoever.\n- **Xcode's compilation cache** has no size cap.\n- **Metro file maps** accumulate one file per project root ever served.\n\nSo every `gc` run reports them -- in their own bucket, tagged _registered_ or\n_detected_, and never counted in the reclaim total -- and a plain `gc --delete`\n_never_ touches them:\n\n```bash\nnpx rn-iso gc                            # report everything, caches included\nnpx rn-iso gc --delete --older-than 30   # trim entries unused for 30 days\nnpx rn-iso gc --delete --all             # empty them completely\n```\n\nPrefer trimming. Most of these caches are a flat collection of independent\nentries -- one file per key for Metro's `FileStore`, one directory per\nfingerprint for a build cache -- so the ones nothing has touched in weeks\ncan go while the rest keep working. \"Unused\" means neither read nor written: a\ncache hit reads an entry without rewriting it, so pruning on modification time\nalone would evict exactly the entries that are earning their keep.\n\nXcode's compilation cache is the exception. It is an LLVM CAS whose `v4.actions`\nindex references its `v9.*.leaf` data files, so removing leaves individually\nwould leave the index pointing at data that is gone. `--older-than` reports it\nas left alone; it can only be emptied whole, which is what `--all` does.\n\nEmptying is a performance decision, not cleanup: the next build in every\nproject pays to refill what you removed. The summary says so.\n\n### Registering a cache rn-iso cannot detect\n\nA Metro `FileStore` root, a build-cache provider's artifact directory, a\nrelocated `COMPILATION_CACHE_CAS_PATH` -- all come from a project's own config,\nso rn-iso cannot guess them. The cache names itself instead, once, from code:\n\n```js\n// A setup script, a build-cache provider -- anywhere that creates the cache.\n// `rn-iso/cache-manifest` is ESM, so a CJS caller needs `await import(...)`.\nimport { register } from 'rn-iso/cache-manifest';\n\nregister({\n  dir: '~/.myapp-metro-cache',\n  name: 'Metro transforms',\n  entriesDepth: 2,\n});\nregister({ dir: '~/.myapp-cas', prune: 'atomic' }); // index-backed: emptied whole or not at all\n```\n\n`entriesDepth` says how far below the directory one entry sits, and it is\nwhat keeps trimming safe. The default, 1, is a flat store: every child of the\nroot is an entry. A root with a layer of grouping _above_ the entries registers\n2 -- Metro's `FileStore` shards its keys across 256 directories, and a build\ncache is keyed `<platform>/<key>` -- so `gc --delete --older-than 30`\ntrims one transform or one build instead of a 256th of every transform on the\nmachine, or an entire platform's builds.\n\nRegistration is idempotent and keyed on the directory, so a cache can call it on\nevery build; `@rn-iso/metro` and `@rn-iso/expo-build-cache` both do (by writing\nthe manifest directly, so they need no rn-iso installed at all).\n\nThe `caches` setting is the no-code alternative and is still read: a list of\npaths under `caches` in a committed `.rn-iso.json` is reported alongside the\nregistered ones. Every path in it is treated as a flat store, so register from\ncode for anything that needs a depth or `atomic`.\n\n```json\n{ \"caches\": [\"~/.myapp-metro-cache\", \"~/.myapp-build-cache\"] }\n```\n\n## The cache packages\n\nTwo optional packages ship alongside the CLI. Both register themselves with\nrn-iso the first time they run, so `gc` reports and trims them, and\nboth work fine without rn-iso installed -- it is an optional peer.\n\n- **[`@rn-iso/metro`](https://www.npmjs.com/package/@rn-iso/metro)**\n  -- one Metro transform cache shared by every worktree, instead of Metro's\n  per-project default that makes each new workspace re-transform the whole\n  module graph. It also carries the NDJSON reporter rn-iso uses to capture a\n  dev server's logs, which is not a cache and is not wired up by `init`.\n- **[`@rn-iso/expo-build-cache`](https://www.npmjs.com/package/@rn-iso/expo-build-cache)**\n  -- a local Expo build cache provider. When no native input changed, the Expo\n  CLI installs a cached `.app` / `.apk` instead of compiling. Wire it to\n  `expo.buildCacheProvider` on SDK 54+, or `expo.experiments.buildCacheProvider`\n  on SDK 53, which reads only that key and ignores the top-level one in silence.\n\nEach package's README has the wiring. Neither is needed for `rn-iso ios` /\n`rn-iso android`, which address the build cache directly: the Expo provider is\nfor builds run _outside_ rn-iso (`expo run:ios` by hand, or EAS), so that the two\nshare artifacts instead of filling two caches with the same builds. Bare React\nNative has no provider hook at all and needs none.\n\nWhat every entry point does need is `@expo/fingerprint`, resolved from the\nproject, to compute the key. It works on a project with no Expo in it at all.\nWithout it `rn-iso ios` refuses with `RN_ISO_NO_FINGERPRINT` rather than\ncompiling from scratch forever.\n\nEntries are keyed `<fingerprintHash>-<variant>-<target>`, identically by every\nentry point. The fingerprint covers what the project _is_, never how it was\nbuilt, so the variant (the Xcode configuration on iOS, the gradle variant on\nAndroid; `debug` when unset) and the target class (`sim` unless the device\nselector says otherwise) are part of the key. Without them a Release build would\nanswer a Debug lookup and a device build would answer a simulator one -- both\nsilently, both producing a binary that cannot run. rn-iso builds Debug for a\nsimulator and nothing else, so those fields are constant here; they exist\nbecause the Expo provider and any future release path share the same keyspace.\n\n## Project labels (--label)\n\nEvery project has a \"shortcut\": its `label` if one was set (e.g. via `worktree create --label`), else inherited from the enclosing worktree's label, else the directory basename. It is what names the owned device -- `rn-iso-<label>` -- and what `status` reports a workspace as.\n\n```bash\nnpx rn-iso worktree create feature-x --label agent-1   # its sim will be rn-iso-agent-1\n```\n\nTwo projects sharing the same basename with no distinguishing label collide, which is why `worktree create` registers a label for the worktree root: every worktree of a monorepo otherwise shares the same app-dir basename.\n\n## Worktrees\n\n```bash\nnpx rn-iso worktree create feature-x        # creates ../<repo>-worktrees/feature-x\nnpx rn-iso worktree remove                  # removes it, deleting its owned device(s) and freeing its Metro port\n```\n\n`worktree create <name>` does three things in one step: creates the git worktree itself (branched `worktree-<name>` off `origin/HEAD` by default -- pass `--base head` to branch off the current `HEAD` instead), carries over gitignored files (see \"Carry-over\" below), and registers a label for the worktree root so `rn-iso` shortcuts don't collide across a monorepo's worktrees (every worktree of a monorepo shares the same app-dir basename). Prefer it over a raw `git worktree add` for that reason. It prints only the resulting worktree path to stdout; everything else goes to stderr (see \"Wiring into Claude Code\" below).\n\nIt deliberately does **not** install dependencies. Which commands a repo actually needs -- a plain install, a workspace filter, a codegen step after it -- is project-specific judgment. Install them yourself (or from your agent) before building, or use `--carry-ignored` to clone the source worktree's `node_modules`.\n\n`worktree remove [<path>]` defaults to the current workspace. It reclaims the worktree's build artifacts, Metro port, and every owned device registered under it (deleting them, not just clearing the claim -- the environment dies whole) before removing the git worktree itself. It refuses if the worktree has uncommitted changes, untracked files, or commits that exist on no remote -- pass `--force` to override, but note `--force` only discards uncommitted/untracked state; committed work stays safe on the branch either way. On the main checkout it reclaims the environment only -- devices deleted, port freed, registry entries dropped, `.rn-iso/` removed -- and leaves the tree itself untouched; the dirty-tree guard does not apply there, since nothing in the tree is deleted.\n\nThere is no `worktree list`: `rn-iso status` shows the same worktrees _with_ their devices, ports and supervisors, including ones that have no environment yet.\n\n### Carry-over\n\nGitignored files (like `.env`, local certs, or IDE state) don't exist in a fresh worktree by default. `worktree create` copies any gitignored file matching a pattern from either:\n\n- `.worktreeinclude` at the repo root -- one gitignore-style pattern per line (`#` comments allowed), e.g.:\n  ```\n  .env\n  .env.*\n  **/*.local.json\n  ```\n- or the `worktree.include` setting (see \"Settings\" below), if no `.worktreeinclude` file exists.\n\nOnly files that are both gitignored and pattern-matched are copied -- tracked files are never duplicated into the worktree.\n\n#### `--carry-ignored`\n\nThat carry-over is file-by-file, which suits a handful of small config files but not the multi-gigabyte trees a worktree needs in order to build without reinstalling. `worktree create --carry-ignored` instead clones **every** gitignored path -- `node_modules`, `ios/Pods`, `ios/build` (React Native codegen output, without which `xcodebuild` fails on a missing `States.cpp` until `pod install` regenerates it) -- minus:\n\n- `.rn-iso/`, at any depth, **always**. It holds the workspace's own derived data, logs and supervisor pidfile: build output keyed to a path the new worktree does not have, and a pidfile for a process that is not running. That exclusion is in code, and no pattern file can turn it off.\n- anything matching `.worktreeexclude` at the repo root, same gitignore-style syntax as `.worktreeinclude`, e.g.:\n  ```\n  bench/results/logs\n  ```\n- or the `worktree.exclude` setting, if no `.worktreeexclude` file exists.\n\nIt is a skip list rather than a copy list on purpose: forgetting to name something you needed shows up months later as a confusing build error, while forgetting to skip something only costs a needless copy.\n\nEach path is cloned with `cp -Rc`, so on APFS the copy is copy-on-write -- a 3.6 GB tree costs roughly 12s and tens of MB of real disk. Off by default because that only holds on APFS, within one volume: elsewhere the clone is refused and the fallback is a real copy of every byte, which `worktree create` warns about.\n\nCloned dependencies match the source worktree, not necessarily the new branch's manifests -- the same contract as restoring a CI cache. Reinstall if the branch changes them.\n\n`--carry-ignored` carries the source's **working state**, not just its gitignored trees: after the clone it also carries the source tree's uncommitted **tracked** changes (`git diff HEAD --binary`, checked with `git apply --check` and then applied), because the cloned artifacts were installed and fingerprinted against that working tree, not against a clean HEAD. When the patch applies, the worktree says so on stderr and leaves the changes uncommitted:\n\n```\nCarried 2 uncommitted change(s) from the source (app.json, ios/Podfile.lock) -- uncommitted here too; commit deliberately.\n```\n\nWhen the worktree's `--base` diverges from the source HEAD and the patch does not apply, **nothing is changed** and a warning names the files instead: the carried artifacts were installed for the source's uncommitted state, so fingerprints and cache keys in the worktree will differ from the source's until the two are reconciled. Untracked (non-ignored) files are not carried, same as always -- and a plain `worktree create` without the flag stays pure HEAD: no clone, no diff carry, no warning.\n\n### Why worktrees live next to the repo, not inside it\n\n`worktree create` places new worktrees in a sibling directory (`../<repo>-worktrees/<name>`), never under the repo root. A worktree nested inside the repo puts a second copy of every `package.json` inside Metro's watch root, which causes jest-haste-map naming collisions (two files claiming the same module name). Its multi-gigabyte `node_modules` also gets walked by Metro, TypeScript, and ESLint on every run. Gitignoring the nested worktree directory does not fix either problem: those tools walk the filesystem directly, not `git`, so a `.gitignore` entry is invisible to them.\n\n### Wiring into Claude Code (`WorktreeCreate` hook)\n\nClaude Code's `WorktreeCreate` hook fires when a session for a new worktree starts, and uses the hook command's stdout as the directory for that session. `rn-iso worktree create` is built for exactly this contract -- it prints only the resulting path to stdout, and everything else goes to stderr. Wire it in `.claude/settings.json`:\n\n```json\n{\n  \"hooks\": {\n    \"WorktreeCreate\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"rn-iso worktree create \\\"$(jq -r .name)\\\"\" }] }]\n  }\n}\n```\n\n## Keeping the agent skills in sync\n\nThe skills other AI agents read ship inside the npm package. Because they are\ninstalled by copy, upgrading rn-iso does **not** refresh them -- a 0.14.0 CLI\nhappily runs against a skill from 0.6.x, and the only symptom is an agent\nfollowing instructions that no longer match the binary.\n\nAfter upgrading, refresh them the same way they were installed:\n\n```bash\nnpx skills add appandflow/rn-iso\n```\n\nThat installs both bundled skills: `rn-iso` (how to drive the CLI) and\n`rn-iso-init` (how to make a repo fast for parallel agents).\n\nThe `rn-iso` skill is deliberately thin: it carries the rules that don't change\n(the ownership model, the destructive-command rules, the parallel-agent rules)\nand defers everything version-specific to `npx rn-iso guide <topic>`, which is\ngenerated by the installed binary and so cannot drift.\n\n## Settings\n\n`worktree create`, `start`, `ios` and `android` resolve settings from three layers, merged with the first match winning (nested objects merge key by key; arrays -- like `worktree.include` -- are replaced wholesale, never concatenated):\n\n1. **Project settings** -- per absolute project path, stored in `~/.rn-iso/config.json`. Highest precedence.\n2. **Repo settings** -- shared by every worktree of the same repository (keyed by the repo's git common dir), also stored in `~/.rn-iso/config.json`. Local to this machine.\n3. **Committed settings** -- `.rn-iso.json` at the repo root, checked into git and shared with everyone who clones the repo. Lowest precedence, but the only layer that travels with the repo -- and, with the `config` command gone, normally the one you want.\n\nThe keys rn-iso reads are `ios.deviceType`, `ios.runtime`, `android.systemImage`, `worktreeDir`, `caches`, and, under `worktree`: `baseRef` (`\"fresh\"` or `\"head\"`), `include` (carry-over patterns, same role as `.worktreeinclude`) and `exclude` (the `--carry-ignored` skip list, same role as `.worktreeexclude`). **Anything else is ignored, and rn-iso warns about it by name on every run that resolves settings** -- a `worktree.install` pipeline, for instance, is not a key rn-iso reads. Example `.rn-iso.json`:\n\n```json\n{\n  \"ios\": { \"deviceType\": \"iPhone 17 Pro\" },\n  \"worktree\": {\n    \"baseRef\": \"fresh\",\n    \"include\": [\".env\", \".env.*\"]\n  }\n}\n```\n\n**Never put secrets in `.rn-iso.json`.** It's committed to git and readable by anyone with repo access. Secrets belong in gitignored files (`.env` and friends) that `worktree create`'s carry-over feature copies into each new worktree -- that mechanism exists specifically so gitignored, secret-bearing files reach a fresh worktree without ever being committed to `.rn-iso.json` or anywhere else in git history.\n\n## Requirements\n\n- macOS (iOS); macOS or Linux (Android)\n- Node 20+\n- Xcode (iOS), Android SDK + at least one installed arm64 system image (Android)\n- `expo` or `react-native` in the project's `package.json`\n\n## License\n\nMIT\n","readmeFilename":"README.md"}