{"_id":"loomctl","_rev":"34-170a25aa82365d6f28531b3a5c9df5b8","name":"loomctl","dist-tags":{"latest":"0.30.0"},"versions":{"0.2.0":{"name":"loomctl","version":"0.2.0","license":"MIT","_id":"loomctl@0.2.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"7bf22496ff5066b834f030046d49ba11386bc44a","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.2.0.tgz","fileCount":247,"integrity":"sha512-zoB1ZKiScUHCKuZ5+S+v/vQTsB1jzPeRc7g2ncwIOkmY2hjjZK+tGfs9mAIDhYR5B61mfk7AdscbJBINmH9trA==","signatures":[{"sig":"MEYCIQDfeQnCeKvmFFEG9ZQ8YNhmzrgBzD1tnqMOJkeJcy70eAIhAJ14rf72AB0fqKWC1dO3HBOzNIhmlnV0XKleR3tJTwSA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2699663},"type":"module","_from":"file:loomctl-0.2.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"danielc000","email":"dchini10@gmail.com"},"_resolved":"C:\\Users\\danie\\Documents\\GitHub\\loom\\loomctl-0.2.0.tgz","_integrity":"sha512-zoB1ZKiScUHCKuZ5+S+v/vQTsB1jzPeRc7g2ncwIOkmY2hjjZK+tGfs9mAIDhYR5B61mfk7AdscbJBINmH9trA==","_npmVersion":"10.9.2","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.16.0","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.2.0_1781567669232_0.25144655417958917","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"loomctl","version":"0.3.0","license":"MIT","_id":"loomctl@0.3.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"dd26caab3401aa15798b38cae0fb80299d3d215a","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.3.0.tgz","fileCount":266,"integrity":"sha512-Gze/I5cAwH1+mv085eenKiUa5mt2fegEs+n7jmN/hqDe1lpROfYuTnNFdTun74jPO8VGRV0vq06dDvRsnovjow==","signatures":[{"sig":"MEUCIQD0LptYF8h4qNJ53CLO5oJ1/LZr2kryl2qJ4bBuPptl/gIgTqUjTEZXOWcQs7TUUQX4v43xvfqDyyF8nb8XKerbSLQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2881384},"type":"module","_from":"file:loomctl-0.3.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.3.0.tgz","_integrity":"sha512-Gze/I5cAwH1+mv085eenKiUa5mt2fegEs+n7jmN/hqDe1lpROfYuTnNFdTun74jPO8VGRV0vq06dDvRsnovjow==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.3.0_1781648085396_0.4893708549255842","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"loomctl","version":"0.4.0","license":"MIT","_id":"loomctl@0.4.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"c6a4afb68302a111ab569a0c3c0a06ed5e5d88e1","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.4.0.tgz","fileCount":266,"integrity":"sha512-nQ7DDoQ8zHa4nBzFiPj1U9akXo+xjlAIEZYDKUDgqbfyGST2EEPaJtF0JEXZRulx7WxWFr17+6iDbwdjNeEkcg==","signatures":[{"sig":"MEUCIQC+tz7vGw9UJ8TOcQjkLQRaOmj2gHPtStUosRHI6i9xxwIgAxVq2CqAsy7BfdS89tqzITQKcErswCVcZPBo/r04bXY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2901138},"type":"module","_from":"file:loomctl-0.4.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.4.0.tgz","_integrity":"sha512-nQ7DDoQ8zHa4nBzFiPj1U9akXo+xjlAIEZYDKUDgqbfyGST2EEPaJtF0JEXZRulx7WxWFr17+6iDbwdjNeEkcg==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.4.0_1781656374818_0.176831545931885","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"loomctl","version":"0.4.1","license":"MIT","_id":"loomctl@0.4.1","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"107ce3979e77d76fb1754b4d26845d3a9e2b2b7a","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.4.1.tgz","fileCount":266,"integrity":"sha512-Pk3IvJbzIyB5qyQoPESSh2KJM1d9NQ9nI93ujjJGWIyksu8Zzfrqa0hbL8AIdNOoeBWYz3Y3AqXsaiGKLbBaAg==","signatures":[{"sig":"MEQCIHCKpzcirdXu2+rvcc/qo1OTGdZn4be15HBX2+2P/5+OAiA2dGFKgLjBlULx2CuGHH97+bBlTa0Lwk7UjxdfGOzkRw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2902083},"type":"module","_from":"file:loomctl-0.4.1.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.4.1.tgz","_integrity":"sha512-Pk3IvJbzIyB5qyQoPESSh2KJM1d9NQ9nI93ujjJGWIyksu8Zzfrqa0hbL8AIdNOoeBWYz3Y3AqXsaiGKLbBaAg==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.4.1_1781685026729_0.2953370219181608","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"loomctl","version":"0.4.2","license":"MIT","_id":"loomctl@0.4.2","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"02c306f9d9398ac7b6ffe80562403f5ada79811f","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.4.2.tgz","fileCount":266,"integrity":"sha512-l/bC2bI5l7ypT/mxLbSzJniwVaUAoQb3fiSFwiM6AMRdKC5RPJ/ges//lATT8xvsfWFxwp23ZMmU5csE9opV+g==","signatures":[{"sig":"MEUCIH78nydu06Mom0+3jCsW5b3+YIeYYF74E1T/BzlVuRAgAiEAz+0bQpeu9Q6pgZSQ3NTZx3h/IKJVB6qZ6WyfnsgUh6E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2901996},"type":"module","_from":"file:loomctl-0.4.2.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.4.2.tgz","_integrity":"sha512-l/bC2bI5l7ypT/mxLbSzJniwVaUAoQb3fiSFwiM6AMRdKC5RPJ/ges//lATT8xvsfWFxwp23ZMmU5csE9opV+g==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.4.2_1781703364355_0.8716726535976009","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"loomctl","version":"0.5.0","license":"MIT","_id":"loomctl@0.5.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"ae1c64a138d06ba06b33d8e3b4aeda088784b654","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.5.0.tgz","fileCount":279,"integrity":"sha512-8DMZ7r8TBGfj7irzDB4sZqFZLSC2W8JZVIHbtU/B3u8luwlybvfHFKhwBZaehc+uKVcMJJ9hGJ9KJ5/NVnCMMA==","signatures":[{"sig":"MEUCIQDutGTIhS8GUOKpeYaYUync2iJ6AF7Cg/oIQUIhSzHPAAIgU1a/XmdNsKHO4cyF84Fqjc/lAVFcuL2/uvsKI5wNZhM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3014251},"type":"module","_from":"file:loomctl-0.5.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.5.0.tgz","_integrity":"sha512-8DMZ7r8TBGfj7irzDB4sZqFZLSC2W8JZVIHbtU/B3u8luwlybvfHFKhwBZaehc+uKVcMJJ9hGJ9KJ5/NVnCMMA==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.5.0_1782235884151_0.20570408452562172","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"loomctl","version":"0.6.0","license":"MIT","_id":"loomctl@0.6.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"2da7456e7ddf31289b204ec6ca2bc19dbfeaf402","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.6.0.tgz","fileCount":283,"integrity":"sha512-Z7vrRel0tRLewH7tCcafCEvYOWfctCaRyppKbMBgGyIN21DC8hPhiM0HLEFw+PAtiX6twTkDgu1MysZc6MFIKw==","signatures":[{"sig":"MEQCIE0SOYvTlqZ0Wv/ekVaMGJ7sxqPIdBMA6XucRJMfFRweAiAUTfmsqXPtH76yM87n3wfssa6Z+pbbukGvBsTJKrcdgA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3132377},"type":"module","_from":"file:loomctl-0.6.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.6.0.tgz","_integrity":"sha512-Z7vrRel0tRLewH7tCcafCEvYOWfctCaRyppKbMBgGyIN21DC8hPhiM0HLEFw+PAtiX6twTkDgu1MysZc6MFIKw==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.6.0_1782251628495_0.659639305655118","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"loomctl","version":"0.7.0","license":"MIT","_id":"loomctl@0.7.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"095c286470b20d6e2c1f1aa752d2cf1c3e96dfb4","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.7.0.tgz","fileCount":308,"integrity":"sha512-n64zmae/xuZmUVdu9w2xlME65vupQGLNy2L3xU4GxIQ9pJBY2V1//oFV5u0wd9boO2qRiK3TLVg46iNWEU0QCw==","signatures":[{"sig":"MEYCIQDNh8jSz6EEHzvNO6eQuuykdzI1ajw0Nau/tY/KeuDl4QIhAKedwRUBzpix6TkwRwR70nrHhR1eXBD+4aZVGO9YiRax","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3289395},"type":"module","_from":"file:loomctl-0.7.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.7.0.tgz","_integrity":"sha512-n64zmae/xuZmUVdu9w2xlME65vupQGLNy2L3xU4GxIQ9pJBY2V1//oFV5u0wd9boO2qRiK3TLVg46iNWEU0QCw==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.7.0_1782317212791_0.7064912987949732","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"loomctl","version":"0.8.0","license":"MIT","_id":"loomctl@0.8.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"68957ae0a79ea90d34148f6d84987dd9300812aa","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.8.0.tgz","fileCount":320,"integrity":"sha512-3K8QOLXM4N3eLUAUpGN4geuRfdSKD0SaDzekoeLQbzEj/X5lBK0sWYQpME1vP9FPbNc7gpHHQtFWQ8KCGuk5Ig==","signatures":[{"sig":"MEUCIQC47hhy7QgbS+NHvERlh5xH7gE1gNAzWP59p1CQ7b+bdQIgH7vwfu9v7nm6UAP12wqTg1uTLnVEXN6GqGPI3x0A/HY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3463018},"type":"module","_from":"file:loomctl-0.8.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.8.0.tgz","_integrity":"sha512-3K8QOLXM4N3eLUAUpGN4geuRfdSKD0SaDzekoeLQbzEj/X5lBK0sWYQpME1vP9FPbNc7gpHHQtFWQ8KCGuk5Ig==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.8.0_1782369768992_0.7488952665396063","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"loomctl","version":"0.8.1","license":"MIT","_id":"loomctl@0.8.1","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"eeb4523e5bcf8d5a0ff34f870b989185a951385a","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.8.1.tgz","fileCount":320,"integrity":"sha512-1dn5gGmGFBvK6iRDhXmT2ib9882atRp1nzk4BKwvmEeVHsQfi0KLYCo4UsRvimtFV/74aAerjl6h78PHd4YinQ==","signatures":[{"sig":"MEQCIATr42Epafh291YznocoslBQZ/B8cDmbTndxNZe93AOAAiBzUBl+VR/e8QaswQNodzgyWKQmWRrD4qE3JCEHHpBF3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3483731},"type":"module","_from":"file:loomctl-0.8.1.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.8.1.tgz","_integrity":"sha512-1dn5gGmGFBvK6iRDhXmT2ib9882atRp1nzk4BKwvmEeVHsQfi0KLYCo4UsRvimtFV/74aAerjl6h78PHd4YinQ==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.8.1_1782381245831_0.3317079153024389","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"loomctl","version":"0.8.2","license":"MIT","_id":"loomctl@0.8.2","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"c81da253d9281f19b03bc5d8a1b4a58a0ac742a7","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.8.2.tgz","fileCount":320,"integrity":"sha512-PLZ+ceCLVmx6TzPHSnsOAmhEb/Pq8y+oaQaUmBOmiod+9XmOLM5npAb30y4saVyJvYuWrrRDgd34b/8U4wLCJA==","signatures":[{"sig":"MEYCIQDksi+Dd7zljxBWQn15LARJbXNgyzapnZg8BjV4acovBQIhALCKLImkKV4gW+kLwgVqPy186CEGV8TknIs6KI61MVNy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.8.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3501819},"type":"module","_from":"file:loomctl-0.8.2.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.8.2.tgz","_integrity":"sha512-PLZ+ceCLVmx6TzPHSnsOAmhEb/Pq8y+oaQaUmBOmiod+9XmOLM5npAb30y4saVyJvYuWrrRDgd34b/8U4wLCJA==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.8.2_1782391564127_0.3304997949946733","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"loomctl","version":"0.9.0","license":"MIT","_id":"loomctl@0.9.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"b52622324aa052c330451524028c14a623931198","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.9.0.tgz","fileCount":324,"integrity":"sha512-ANV5pK20H0goJzeaG66mUnZ85FI0JxPejDIqBWvZQkijUJzEee1jZXitYwdtb0Xlr35wGG18o7nAzn0BhWMoVQ==","signatures":[{"sig":"MEUCIEYZq1stKPFiBYR/bozK5RNHtsClmPb+z9LrLcX8QgQXAiEA1EcKYU2bAFlC8VEkeu1DbCtHfTKy3nZNXhwsEletR3E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3562092},"type":"module","_from":"file:loomctl-0.9.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.9.0.tgz","_integrity":"sha512-ANV5pK20H0goJzeaG66mUnZ85FI0JxPejDIqBWvZQkijUJzEee1jZXitYwdtb0Xlr35wGG18o7nAzn0BhWMoVQ==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.9.0_1782432677951_0.8648666884110605","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"loomctl","version":"0.10.0","license":"MIT","_id":"loomctl@0.10.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"4ae758f982cf01bf51c5f8b53bc5a6dd168ab8a6","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.10.0.tgz","fileCount":332,"integrity":"sha512-JmuHZO74Uwrd2si29sm3vcR7jFYr3VL0xBjh9rKNtmng4YsIN8ZGZmx8h+9BmpmV/TQ2ZRhMkYhMiyjdSEUEmA==","signatures":[{"sig":"MEUCIBHMYWKxzumzRR60WSTiNRNBgBy+29wbxS79YxhvCIITAiEAu9C9VRibEmdwYdjGbxeuDHBpquvTmrA5+rrLAXHa4s4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3695238},"type":"module","_from":"file:loomctl-0.10.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.10.0.tgz","_integrity":"sha512-JmuHZO74Uwrd2si29sm3vcR7jFYr3VL0xBjh9rKNtmng4YsIN8ZGZmx8h+9BmpmV/TQ2ZRhMkYhMiyjdSEUEmA==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.10.0_1782487571910_0.7704386979466991","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"loomctl","version":"0.11.0","license":"MIT","_id":"loomctl@0.11.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"ede330cf34f66bc0f78b64632c96e6e6f1f779b6","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.11.0.tgz","fileCount":332,"integrity":"sha512-0lKdG4YM1NAMr7kiWUlnMLJN9MVAQ1CdjcH8IwpXH4eUYJB92ytWFwZCOFrYDqPSDBQ9VZc2U4AYYco0iUqrWA==","signatures":[{"sig":"MEQCIAJYvQEvug86zidFv0gs3MxUUqKzQ0mfpqZiJJDWVCZnAiAJPOYBI6ulchcxZGtGJHgNm7cCfDQeg4KYgfZ235qyuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3755058},"type":"module","_from":"file:loomctl-0.11.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.11.0.tgz","_integrity":"sha512-0lKdG4YM1NAMr7kiWUlnMLJN9MVAQ1CdjcH8IwpXH4eUYJB92ytWFwZCOFrYDqPSDBQ9VZc2U4AYYco0iUqrWA==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first AI project workspace — weaves Claude Code sessions, Obsidian docs, and tasks into one fabric.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.11.0_1782525232938_0.33378406890592993","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"loomctl","version":"0.12.0","license":"MIT","_id":"loomctl@0.12.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"721a22f75b211b1e0ba62676e88cce0fc10b15ce","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.12.0.tgz","fileCount":344,"integrity":"sha512-WNMxB0/Wtl+SlzEpeqq6B/hXoj9sahUuudsFBdeouf8tflau9pUYExNXu/T1Dwqhs5aRlECxoeTVBuvtiHbgBw==","signatures":[{"sig":"MEUCIQCrRk+dFHHAEtAyn4uIeXDfwNSY8CmbgNmpKW0tjWNCQgIgQO7hKhe+zG/n0r5k622PipL2+LeGx1Erz04ffw/c8qI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3918538},"type":"module","_from":"file:loomctl-0.12.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.12.0.tgz","_integrity":"sha512-WNMxB0/Wtl+SlzEpeqq6B/hXoj9sahUuudsFBdeouf8tflau9pUYExNXu/T1Dwqhs5aRlECxoeTVBuvtiHbgBw==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.12.0_1782729896080_0.9789592452293143","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"loomctl","version":"0.13.0","license":"MIT","_id":"loomctl@0.13.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"4ddf224184d33c2526065597aa8bdd9520332bd8","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.13.0.tgz","fileCount":351,"integrity":"sha512-lyQLh9WveC/+X4iEVNdkTvKue0lvlwR1G4LpqOqBNqs37i3j7pc3TIHeN6bBaIZckysepotQ9nJ1LLIqXJXGnQ==","signatures":[{"sig":"MEYCIQDJGmOiYtF33lCCAVobTNdzFbS0kJzePZhEA1Uy/mP0fgIhAO/ezZJj8a2BiiTVOLrFroqoA+aoII+8+H3y+4bYD0k2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4092841},"type":"module","_from":"file:loomctl-0.13.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.13.0.tgz","_integrity":"sha512-lyQLh9WveC/+X4iEVNdkTvKue0lvlwR1G4LpqOqBNqs37i3j7pc3TIHeN6bBaIZckysepotQ9nJ1LLIqXJXGnQ==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.13.0_1782867748496_0.030594637600323216","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"loomctl","version":"0.14.0","license":"MIT","_id":"loomctl@0.14.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"3e6fc4b18c23a1cfe102f5f64b511dc53048bc7c","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.14.0.tgz","fileCount":434,"integrity":"sha512-WX1Edr0nHrxjFjaudauFUCfrjHOR/qvNsqgkwROIS1n3ZnoveTBOlfpdhYaX1r4HojdAQ5872eW6YhBH4oJuXA==","signatures":[{"sig":"MEYCIQC5ti0aHkWDYTd4X+xkj5/WIOxVFFvNcuxtQF8ykmWuYgIhAKX/RdWsNgXazAZtiuDfZjJhwK8Te2LbeQueEcj2EDt+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4724379},"type":"module","_from":"file:loomctl-0.14.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.14.0.tgz","_integrity":"sha512-WX1Edr0nHrxjFjaudauFUCfrjHOR/qvNsqgkwROIS1n3ZnoveTBOlfpdhYaX1r4HojdAQ5872eW6YhBH4oJuXA==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.14.0_1783031734469_0.2832471481342962","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"loomctl","version":"0.15.0","license":"MIT","_id":"loomctl@0.15.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"8245fe1d7152a85311001e2170bc05dabae600fb","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.15.0.tgz","fileCount":439,"integrity":"sha512-JvAjASASSW1RUeo18YPigVtSAu+YgBpRVwgA2+j3dRr0FecL6aZbvXGy792HtFbeofFwdVyOHRDtsLn2YQ/OPg==","signatures":[{"sig":"MEYCIQC8St7q1UCd+M2U2fbK264kgfttPCp8Tq/dJIGjDDZKQwIhALaqpkh++R0SWU/bQ0MmhZslVnJ2ytRQ2kIu/Q3mEIZ5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.15.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4934523},"type":"module","_from":"file:loomctl-0.15.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.15.0.tgz","_integrity":"sha512-JvAjASASSW1RUeo18YPigVtSAu+YgBpRVwgA2+j3dRr0FecL6aZbvXGy792HtFbeofFwdVyOHRDtsLn2YQ/OPg==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.15.0_1783128159247_0.3184515766624787","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"loomctl","version":"0.16.0","license":"MIT","_id":"loomctl@0.16.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"631fa8e86ed21c0ee7abf3b26f24454c5e1dd24f","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.16.0.tgz","fileCount":502,"integrity":"sha512-3sgdGNQwJtj57LijQGXz42crwB08Erj2S0APuOM5S7RcMGWEPxBffEp1rtraEV9+RfMH5yjZLvlz1hc5FQdE7A==","signatures":[{"sig":"MEUCIGbTkEkTJHBDeTdOXF+HaXOV6FJ5nq77wtk0flW4DCIiAiEAluygcsW2dXqHuYY984e+NFAXXOSjc76N9woZkodPdq0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.16.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6008112},"type":"module","_from":"file:loomctl-0.16.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.16.0.tgz","_integrity":"sha512-3sgdGNQwJtj57LijQGXz42crwB08Erj2S0APuOM5S7RcMGWEPxBffEp1rtraEV9+RfMH5yjZLvlz1hc5FQdE7A==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.16.0_1783542373733_0.2067194316873917","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"loomctl","version":"0.17.0","license":"MIT","_id":"loomctl@0.17.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"861ead69bdd582b7f24abcb922b9b53bbc4fc9bf","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.17.0.tgz","fileCount":527,"integrity":"sha512-fIgvJDq9qHmpQ6sLJrHLiuBaXa8cr03reV3M7LNeC5VhfBzWEoxNsKIbHGBfiMsMG/8QPI3xA9Lg5pQlKRLj0Q==","signatures":[{"sig":"MEUCIDPkOFYzQ2D/tqG7s+wj3IQP7D487Pio26qO9NKrYXM2AiEA+6R/MDr0hbgRIy/OJ+jaVFTHDYh236WoSFrCvsKBhgs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6684243},"type":"module","_from":"file:loomctl-0.17.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.17.0.tgz","_integrity":"sha512-fIgvJDq9qHmpQ6sLJrHLiuBaXa8cr03reV3M7LNeC5VhfBzWEoxNsKIbHGBfiMsMG/8QPI3xA9Lg5pQlKRLj0Q==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.17.0_1783679762735_0.8118843102928872","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"loomctl","version":"0.18.0","license":"MIT","_id":"loomctl@0.18.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"571c56d621b34cb53c15c2ff101600e0780bc15e","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.18.0.tgz","fileCount":596,"integrity":"sha512-tU5hIy7+IcNYjIFA8EAmmkHf3+eHH4d45ZYVCDlkjJ3ZJeJKoQp7/akLOMSemnMX2jKym9MkHZUDouo01AuNOw==","signatures":[{"sig":"MEUCIQCZH5oBbX97murM5n1EV7FSF1W9A205lNcvOMXe/G2HbAIgO2DF92w2xq1V+da1TIl5qGEsrzqz9O/6O4KmzUe+wCU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.18.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7619359},"type":"module","_from":"file:loomctl-0.18.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.18.0.tgz","_integrity":"sha512-tU5hIy7+IcNYjIFA8EAmmkHf3+eHH4d45ZYVCDlkjJ3ZJeJKoQp7/akLOMSemnMX2jKym9MkHZUDouo01AuNOw==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.18.0_1783825221485_0.2336455270174831","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"loomctl","version":"0.19.0","license":"MIT","_id":"loomctl@0.19.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"946e9574538f286206840b6ea5ad68725d6086de","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.19.0.tgz","fileCount":596,"integrity":"sha512-7/fH3Qmw/Iwun5ptupnQarrWA0DfUnRo/FQsJbUW8SK0a/C1PJqORFasA2zVLaVooWH00ac6TkWml7cpkl/xqA==","signatures":[{"sig":"MEYCIQDJKMhRD09Bd7XZ/JU17SW4SIndxaFJdLrEbp2CnVwpjQIhAOFcOWVTFpXEcVTXiUzX84VjQyexS2uCsUDY9q1R/K7t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.19.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7689653},"type":"module","_from":"file:loomctl-0.19.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.19.0.tgz","_integrity":"sha512-7/fH3Qmw/Iwun5ptupnQarrWA0DfUnRo/FQsJbUW8SK0a/C1PJqORFasA2zVLaVooWH00ac6TkWml7cpkl/xqA==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.19.0_1783871308571_0.4433398476990915","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"loomctl","version":"0.20.0","license":"MIT","_id":"loomctl@0.20.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"3cd220c9708b058f1d6a297455eff48a8b6c39cd","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.20.0.tgz","fileCount":607,"integrity":"sha512-RWExhtDuzVor88u1r6mf2P5oJjDwOkrH8Yysrq0C47CZTYgFRRtn7RzuUQcQb2ewkj7DnCbuU8mAWkKEWjEldw==","signatures":[{"sig":"MEUCIQCPJ6OLUe1Kbi8PvrFbsyfLpBOZSWGgzjsmseJeNmLEWwIgYx0UVwW0ulPrnykGWJII8hSsV4VudyT4e5iUMe1et5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.20.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7852108},"type":"module","_from":"file:loomctl-0.20.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.20.0.tgz","_integrity":"sha512-RWExhtDuzVor88u1r6mf2P5oJjDwOkrH8Yysrq0C47CZTYgFRRtn7RzuUQcQb2ewkj7DnCbuU8mAWkKEWjEldw==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.20.0_1784124722874_0.6617594142448162","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"loomctl","version":"0.21.0","license":"MIT","_id":"loomctl@0.21.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"e9d530aeb2c9a320b3ac2f4d631467bbcdac6b9b","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.21.0.tgz","fileCount":636,"integrity":"sha512-n2WUAriXPv3075+3TJZxsPwWOr8ZtoHGtD77k0eGnATzY9kHdj/2GCbAQnIFUOdBYNyOeeKGuSr9PFwGilhiWA==","signatures":[{"sig":"MEUCIQD4qXVLWd9iJ8VfBn3ONfBxIxD5/jNcmIdABBebQnXulAIgH7Pv/jjBb9T/a9W2kW/gN7kclkg20Bz4anr5D8QiT3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.21.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8127842},"type":"module","_from":"file:loomctl-0.21.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.21.0.tgz","_integrity":"sha512-n2WUAriXPv3075+3TJZxsPwWOr8ZtoHGtD77k0eGnATzY9kHdj/2GCbAQnIFUOdBYNyOeeKGuSr9PFwGilhiWA==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.21.0_1784184779366_0.8722657126739972","host":"s3://npm-registry-packages-npm-production"}},"0.21.1":{"name":"loomctl","version":"0.21.1","license":"MIT","_id":"loomctl@0.21.1","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"b6d3afe066504bfa1834938ece63b677c2740fec","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.21.1.tgz","fileCount":636,"integrity":"sha512-kUtt2qmHkicJi4lXySfeer/IyUYgiqT4HUIMVacjYgUFXoIeCZq2UZX14gvo7AvNXpMfDDnkMuENyMC2AbS2vg==","signatures":[{"sig":"MEUCIQCjNEEHbJpg6viw/Qxc2krggfWLTkWBmwB9jhd0y88jSwIgIYExoOhNRiC4X63uVZu4o1UzP/Ray7YtopCU/Rh9C3M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.21.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8130583},"type":"module","_from":"file:loomctl-0.21.1.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.21.1.tgz","_integrity":"sha512-kUtt2qmHkicJi4lXySfeer/IyUYgiqT4HUIMVacjYgUFXoIeCZq2UZX14gvo7AvNXpMfDDnkMuENyMC2AbS2vg==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.21.1_1784191303057_0.6086570586405842","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"loomctl","version":"0.22.0","license":"MIT","_id":"loomctl@0.22.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"314290aac6bb3ffdce4d5cd8e3c8f989c8c6c27a","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.22.0.tgz","fileCount":652,"integrity":"sha512-90LxBwvqPnkdGyaD6HaTldN/BUubY39fio6XdTD1KDQoqhKER9WseDWHtlwF/J80Y93mKCDCZu0/EFGQ1geFlQ==","signatures":[{"sig":"MEUCIQCSh2ys/3j5Q9+OB+U0oLQH6XdlUCBDyvuX4cQgp0126QIgC6bAmbttlcBSpGqmwy+Jtwxogsp2wbIhAeVDH1R3dGs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.22.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8603112},"type":"module","_from":"file:loomctl-0.22.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.22.0.tgz","_integrity":"sha512-90LxBwvqPnkdGyaD6HaTldN/BUubY39fio6XdTD1KDQoqhKER9WseDWHtlwF/J80Y93mKCDCZu0/EFGQ1geFlQ==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.22.0_1784331477924_0.4480695172808722","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"loomctl","version":"0.23.0","license":"MIT","_id":"loomctl@0.23.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"ab763f41777d9ba62e86579ee240b6fd80e08afd","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.23.0.tgz","fileCount":656,"integrity":"sha512-2M9z5PZomLJj0UK4CzWEUnlBk5F2pRasDyXBQgAqOT4DfxiSn0HL2ZPGLYo8I3TpbPEm+xjF3i+GAV1eQLxmsg==","signatures":[{"sig":"MEUCIHu6MdDUq/MRMX/AffOI25ntRPYhFjbXH21rscBym/OqAiEAmlCIJwVuW9jpghPD840kYPYdLPM7UuOmtvcgF8Ykxzk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.23.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8608410},"type":"module","_from":"file:loomctl-0.23.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.23.0.tgz","_integrity":"sha512-2M9z5PZomLJj0UK4CzWEUnlBk5F2pRasDyXBQgAqOT4DfxiSn0HL2ZPGLYo8I3TpbPEm+xjF3i+GAV1eQLxmsg==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.23.0_1784555100710_0.547932408165789","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"loomctl","version":"0.24.0","license":"MIT","_id":"loomctl@0.24.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"88456f1a14bbba82d021e0a14852ab7d826ec871","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.24.0.tgz","fileCount":660,"integrity":"sha512-zD2XrJu4llnTaGMzC4c99nO+FRaeeQ1W5QjDH2c4A0XI6y0sS/gTf3RfnviyF+mZa5LGY+gkXhXp/b6Bl4pX1g==","signatures":[{"sig":"MEQCICig+33LYa9HkkZH338PFCGVmajnTIWDquXeeF3kp/ZuAiBak5rLvwTaECOOKuapNKwNJAxUjhTpllmO2fn0xlXJvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.24.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":9071172},"type":"module","_from":"file:loomctl-0.24.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.24.0.tgz","_integrity":"sha512-zD2XrJu4llnTaGMzC4c99nO+FRaeeQ1W5QjDH2c4A0XI6y0sS/gTf3RfnviyF+mZa5LGY+gkXhXp/b6Bl4pX1g==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.24.0_1784658183270_0.963903857455628","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"loomctl","version":"0.25.0","license":"MIT","_id":"loomctl@0.25.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"29263e59587d2834e1fa24230ecf15de31991ed8","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.25.0.tgz","fileCount":714,"integrity":"sha512-uWARoapW5+8Q64JS7VmtWtt8V3SL5M9gOkK6D6Cc6o7ardfeoZ75CtjlQCLAavEpGRpCE/5eGSBudiUbY0XrwA==","signatures":[{"sig":"MEUCIQCj+2SP5GBhs2Ssgts18Dd2un5a9K/h+z+258nP0fnW9AIgPk9Y4ACmRpwGlJhRsNP78V161DuU95QrZOYIMXgpSYA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.25.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10202378},"type":"module","_from":"file:loomctl-0.25.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.25.0.tgz","_integrity":"sha512-uWARoapW5+8Q64JS7VmtWtt8V3SL5M9gOkK6D6Cc6o7ardfeoZ75CtjlQCLAavEpGRpCE/5eGSBudiUbY0XrwA==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.25.0_1784889724820_0.21547870534103786","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"loomctl","version":"0.26.0","license":"MIT","_id":"loomctl@0.26.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"625c540cc88a7b2d821f4ec3af594569d2a3d517","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.26.0.tgz","fileCount":726,"integrity":"sha512-5JTYSKBdRV9AiCozN5/3sC1sukOX86s5b6BmsX17RlDG2mRFMqewwSSDb2ABJwUzEWM3/d/rxT8xtcykmxJTdA==","signatures":[{"sig":"MEYCIQCFhTKbwwcNjYZDxF7569SHPeBbYB96zln8TG/JrG9xLwIhAOjXDUevAJG5IuptIAjbAbxQqhf3tiuXl6XJZodUFk5Z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.26.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11877947},"type":"module","_from":"file:loomctl-0.26.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.26.0.tgz","_integrity":"sha512-5JTYSKBdRV9AiCozN5/3sC1sukOX86s5b6BmsX17RlDG2mRFMqewwSSDb2ABJwUzEWM3/d/rxT8xtcykmxJTdA==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.26.0_1785893966411_0.2520870103879984","host":"s3://npm-registry-packages-npm-production"}},"0.27.0":{"name":"loomctl","version":"0.27.0","license":"MIT","_id":"loomctl@0.27.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"e94621cfd6487519cba3ac86b88f595cf2d5623b","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.27.0.tgz","fileCount":726,"integrity":"sha512-4cq44Kt8R6q+hT/ytso9ECplHh8GfcvPiC4zmdjaHYMiLrcprXTiQfPCqhG2tOxKwu9L40z8S3NM8Z7R5jw+Kg==","signatures":[{"sig":"MEUCIQDVR9elFa8fO9XbP0GKvLhLLCFbhUp5HCczoeE1zd8VYwIgbMCkWbYq3t0SsodzDssrQ5OFEbJJkQuGiajY4D15cdQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.27.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12377618},"type":"module","_from":"file:loomctl-0.27.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.27.0.tgz","_integrity":"sha512-4cq44Kt8R6q+hT/ytso9ECplHh8GfcvPiC4zmdjaHYMiLrcprXTiQfPCqhG2tOxKwu9L40z8S3NM8Z7R5jw+Kg==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.27.0_1786014359174_0.7004243492771585","host":"s3://npm-registry-packages-npm-production"}},"0.28.0":{"name":"loomctl","version":"0.28.0","license":"MIT","_id":"loomctl@0.28.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"afdfec38280d303aeb4f4886e793505222160ccc","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.28.0.tgz","fileCount":730,"integrity":"sha512-bM3q4TI6fqy/eYjkdPyoxGtGA1WN1e4fh8Mzh9dK0csellxWqxXu0TAykHhiSPc4A+iOusu8FWCxTz1OybVXHA==","signatures":[{"sig":"MEUCIA/ue6aYtN+q8DCOhE5arcWyAA7olSkyj5JLLzqAIkHeAiEAxluXCj5jd5LdxM1RzU1PqgMfujW8Whjv279zSEOJi3Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.28.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12653939},"type":"module","_from":"file:loomctl-0.28.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.28.0.tgz","_integrity":"sha512-bM3q4TI6fqy/eYjkdPyoxGtGA1WN1e4fh8Mzh9dK0csellxWqxXu0TAykHhiSPc4A+iOusu8FWCxTz1OybVXHA==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.28.0_1787479449706_0.8701611173078478","host":"s3://npm-registry-packages-npm-production"}},"0.29.0":{"name":"loomctl","version":"0.29.0","license":"MIT","_id":"loomctl@0.29.0","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"homepage":"https://github.com/DanielC000/loom#readme","bugs":{"url":"https://github.com/DanielC000/loom/issues"},"bin":{"loom":"bin/loom.mjs"},"dist":{"shasum":"191b96af7c8724a4b0a685b377946414b42180f2","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.29.0.tgz","fileCount":848,"integrity":"sha512-sieQlbcLchC3R/HqnteYKxz4+Hm3o7F6eZymsOoBt8gwyYz2Mdcfk5TzPjn5kevP8AHu178IT6rgpHzBpRJkKw==","signatures":[{"sig":"MEUCIQCAWD+lFgHmFIW1DT9oqbxDO5/VJWvVL51SA8mxtTsZWgIgMYrh5W+oXyQs6rTgthCoNhFRULRRAgQVvk2ob0uPzFw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCq9gRBMDJ0ARH40CSWRHHbgFrE/PeLRslEBoDWWiFWIAIgachadl9fTYAyRx4dEQK82gxUiwma/csgFrwccy6y7pM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.29.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":15864871},"type":"module","_from":"file:loomctl-0.29.0.tgz","engines":{"node":">=22"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"_resolved":"/home/runner/work/loom/loom/loomctl-0.29.0.tgz","_integrity":"sha512-sieQlbcLchC3R/HqnteYKxz4+Hm3o7F6eZymsOoBt8gwyYz2Mdcfk5TzPjn5kevP8AHu178IT6rgpHzBpRJkKw==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"tmp":"tmp/loomctl_0.29.0_1788705627365_0.2029063371041253","host":"s3://npm-registry-packages-npm-production"}},"0.30.0":{"_id":"loomctl@0.30.0","bin":{"loom":"bin/loom.mjs"},"bugs":{"url":"https://github.com/DanielC000/loom/issues"},"dist":{"shasum":"994fb9662959e5ff01e141228048f633169f1476","tarball":"https://registry.npmjs.org/loomctl/-/loomctl-0.30.0.tgz","fileCount":958,"integrity":"sha512-UbhdyyC00pyPBJYQA0+h6SZPEPj0G46J4oA++8EHddJemuNbDgZHnMT1EIDEj5lTqnPP/md3RBf9UFU2j+CVog==","signatures":[{"sig":"MEQCIEdPiDesFOcOh05EK20xjv4sE7rH9t0EbQzuHZbjumUXAiAkG9MQwau1KKOp+bQOYB/NKDET2skZsX+RB72Ii0NyEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC5UVmHQoUnw440BdFzQeLrNQa8YGgtR+8JWkQqSkrCKwIgV/qYwP5GOp1dOVHJdR8r0RZ31/jM9QS57jOwTYBc9Ds="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loomctl@0.30.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16920313},"name":"loomctl","type":"module","_from":"file:loomctl-0.30.0.tgz","engines":{"node":">=22"},"license":"MIT","version":"0.30.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:089bcf2c-c659-4637-b3fe-dd37e8843deb"}},"homepage":"https://github.com/DanielC000/loom#readme","_resolved":"/home/runner/work/loom/loom/loomctl-0.30.0.tgz","_integrity":"sha512-UbhdyyC00pyPBJYQA0+h6SZPEPj0G46J4oA++8EHddJemuNbDgZHnMT1EIDEj5lTqnPP/md3RBf9UFU2j+CVog==","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"_npmVersion":"11.18.0","description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","directories":{},"maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"ws":"^8.18.0","ajv":"^8.17.1","zod":"^4.4.0","grammy":"^1.30.0","fastify":"^5.2.0","chokidar":"^4.0.0","node-pty":"^1.1.0","node-diff3":"^3.1.2","simple-git":"^3.27.0","cron-parser":"^5.5.0","@loom/shared":"0.0.0","better-sqlite3":"^11.8.0","@fastify/static":"^8.0.0","@playwright/mcp":"0.0.75","@fastify/websocket":"^11.0.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"bundleDependencies":["@loom/shared"],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/loomctl_0.30.0_1790626419114_0.777667181289488"}}},"time":{"created":"2026-06-15T23:54:29.058Z","modified":"2026-09-28T20:13:39.635Z","0.2.0":"2026-06-15T23:54:29.413Z","0.3.0":"2026-06-16T22:14:45.623Z","0.4.0":"2026-06-17T00:32:55.122Z","0.4.1":"2026-06-17T08:30:26.921Z","0.4.2":"2026-06-17T13:36:04.556Z","0.5.0":"2026-06-23T17:31:24.328Z","0.6.0":"2026-06-23T21:53:48.745Z","0.7.0":"2026-06-24T16:06:53.023Z","0.8.0":"2026-06-25T06:42:49.192Z","0.8.1":"2026-06-25T09:54:06.020Z","0.8.2":"2026-06-25T12:46:04.365Z","0.9.0":"2026-06-26T00:11:18.127Z","0.10.0":"2026-06-26T15:26:12.128Z","0.11.0":"2026-06-27T01:53:53.132Z","0.12.0":"2026-06-29T10:44:56.256Z","0.13.0":"2026-07-01T01:02:28.730Z","0.14.0":"2026-07-02T22:35:34.668Z","0.15.0":"2026-07-04T01:22:39.428Z","0.16.0":"2026-07-08T20:26:13.906Z","0.17.0":"2026-07-10T10:36:02.900Z","0.18.0":"2026-07-12T03:00:21.712Z","0.19.0":"2026-07-12T15:48:28.788Z","0.20.0":"2026-07-15T14:12:03.104Z","0.21.0":"2026-07-16T06:52:59.555Z","0.21.1":"2026-07-16T08:41:43.261Z","0.22.0":"2026-07-17T23:37:58.165Z","0.23.0":"2026-07-20T13:45:00.916Z","0.24.0":"2026-07-21T18:23:03.498Z","0.25.0":"2026-07-24T10:42:05.068Z","0.26.0":"2026-08-05T01:39:26.655Z","0.27.0":"2026-08-06T11:05:59.415Z","0.28.0":"2026-08-23T10:04:09.937Z","0.29.0":"2026-09-06T14:40:27.553Z","0.30.0":"2026-09-28T20:13:39.311Z"},"bugs":{"url":"https://github.com/DanielC000/loom/issues"},"license":"MIT","homepage":"https://github.com/DanielC000/loom#readme","repository":{"url":"git+https://github.com/DanielC000/loom.git","type":"git"},"description":"Orchestrate a fleet of real Claude Code agents on your Claude subscription (Pro/Max), not per-token API bills — durable sessions, multi-agent orchestration, all local-first on your own machine.","maintainers":[{"name":"danielc000","email":"dchini10@gmail.com"}],"readme":"<div align=\"center\">\n\n<img src=\"docs/images/logo.svg\" alt=\"Loom\" width=\"320\" />\n\n### Orchestrate a fleet of real Claude Code agents — durable, review-gated, and entirely on your machine\n\n<p>\n  <a href=\"LICENSE\"><img alt=\"License: MIT\" src=\"https://img.shields.io/badge/license-MIT-blue.svg\" /></a> <a href=\"https://github.com/DanielC000/loom/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/DanielC000/loom/actions/workflows/ci.yml/badge.svg\" /></a> <a href=\"https://github.com/DanielC000/loom/releases\"><img alt=\"Release\" src=\"https://img.shields.io/github/v/release/DanielC000/loom?sort=semver\" /></a> <img alt=\"Node 22+\" src=\"https://img.shields.io/badge/node-%3E%3D22-brightgreen.svg\" /> </p>\n\n</div>\n\n<p align=\"center\">\n  <img src=\"docs/images/hero.png\" alt=\"Loom's Mission Control: live agent fleets across three projects on isolated git branches with context meters, an attention queue of decisions and inputs awaiting the owner, and a real-time activity feed — one phosphor-on-dark cockpit.\" width=\"100%\" /> </p>\n\nLoom orchestrates the **real interactive `claude`** — the same terminal session you'd run by hand, driven over a PTY, never a headless `claude -p` one-shot or an API-key agent loop. A daemon on your own machine owns those sessions, so they're **durable**: closing the window — or rebooting — never kills the work. Around them, one lead agent decomposes a goal, delegates to workers on isolated git branches, **reviews each diff, and merges through a build gate** — while your code, transcripts, task board, and the knowledge the fleet accumulates all stay **local, on your hardware**. It even self-hosts: Loom is built using Loom.\n\nBecause every agent is a genuine `claude` session rather than an API-key agent loop, a whole fleet of them also runs on the **Claude subscription (Pro/Max)** you already pay for — there's no separate per-token API bill for the orchestration the way there is with tools that drive the Anthropic API directly. That's an honest property, not the headline: the agents still consume your subscription's usage and live within its rate limits (Loom rides the plan you already pay for, it doesn't make Claude free), and how that usage is billed is Anthropic's policy to set and evolve.\n\n## Features\n\n- **🖥️ Durable real sessions.** Real `claude` sessions that survive a closed tab or a reboot without losing the thread.\n- **⛓️ Review-gated orchestration.** A lead agent delegates to workers on isolated git branches, reviews each diff, and merges through a build gate (docs-only diffs skip it; a human can switch the gate off per project, or with it off set an interval N so N merges land ungated and the next one runs the gate).\n- **🚦 Gates page.** A read-only view of every merge, deploy and self-check gate: what's running, what's queued, and past results.\n- **🗂️ Multi-repo projects.** One project can span several repos, with each board card routed to the right one.\n- **✦ A versioned knowledge layer.** An Obsidian vault of notes and decisions kept versioned with the code, plus a Memory view of what the fleet remembers across sessions.\n- **📌 Decision records.** Load-bearing decisions are written to `docs/decisions/` and linked from the code, so the reasoning reaches whoever edits it next.\n- **◧ A task board agents can use.** A per-project kanban that agents read and update as part of the same loop, with parent cards and blocks/related/discovered-from relations.\n- **💳 Runs on your subscription.** Uses your Claude Pro/Max plan instead of per-token API billing, within its usage and rate limits.\n- **❯ The terminal cockpit.** A web UI that attaches to live sessions and detaches freely, alongside your board, Memory and repository views.\n- **💬 A personal companion.** A long-lived agent you chat with over Telegram or in the app, with durable memory and reminders.\n- **🧪 An experimental second harness.** Off by default: a profile can run the Codex CLI instead of `claude`, with narrower support: a worker gets a condensed doctrine in its `AGENTS.md` while other roles get a pointer to their doctrine skill atop the kickoff, there is no context or usage telemetry, sessions can't be forked, and `allowDelta` is ignored (a profile's pinned skills only narrow the list Codex is told it may read; nothing is injected).\n- **🌐 Per-worker browser testing.** Opt-in: give a worker profile its own headless browser to test a running app.\n- **🚀 A Platform operator.** A built-in assistant that helps you set up projects, agents, and profiles, confirming big moves first.\n- **🔐 An Elevated Operator.** Off by default: a session whose Loom tools are limited to one project's branch, commit, push and vault — a tool boundary, not a sandbox.\n- **🔎 A suggest-only Workspace Auditor.** A read-only reviewer that files suggestions for your prompts and skills as cards on your board.\n- **🧩 Editable skills.** Bundled skills injected into every session, editable in the app, with an adopt step that three-way-merges shipped updates into skills you've edited.\n- **🛰️ Agents as API endpoints.** Expose an agent through scoped, capped API keys, with a Runs page for results.\n- **🔑 Connections.** Encrypted credentials that agents use through Loom without ever seeing the secret.\n- **⏱️ A built-in cron scheduler.** Off by default: run a manager or the Workspace Auditor on a cron schedule (restart the daemon after enabling it).\n- **📄 Document conversion.** Opt-in: worker profiles can convert PDFs, Office files, images and HTML to Markdown.\n\n## Quick start\n\nYou need **Node 22+** and a working `claude` CLI on your machine. **On Windows, Loom needs build 18309+ (Windows 10 version 1903, May 2019, or later, or Windows 11)** — that's node-pty's own floor for using ConPTY; below it node-pty falls back to winpty, a path Loom has never tested or claimed support for. `install.ps1` (see [One-line install](#one-line-install) below) checks this and refuses to install below it — installing directly via `npm i -g loomctl`, as below, runs **no such check**, so confirm your build meets the floor first if you're using that route. Install Loom globally from npm (published as [`loomctl`](https://www.npmjs.com/package/loomctl)) — that gives you the `loom` command:\n\n```sh\nnpm i -g loomctl\nloom            # boots the daemon (loopback only) and opens the cockpit in your browser\n```\n\n`loom` with no arguments starts the daemon in the foreground and opens your browser; press Ctrl-C to stop. To manage a background daemon, use the subcommands:\n\n```sh\nloom start --detach   # run the daemon in the background (writes a PID file under ~/.loom)\nloom status           # is it running? — prints version, URL and PID (exit non-zero if stopped)\nloom stop             # stop it gracefully and clean up\nloom restart          # stop, then start (honors --detach/--port/--no-open)\nloom open             # open the browser to a running daemon\nloom update           # update to the latest release (npm i -g loomctl@…), then restart\n```\n\n`loom update` upgrades the global install and restarts the daemon; `loom update --channel beta` switches to (and remembers) the beta track. When a newer release is available the cockpit also shows an \"update available\" banner you can act on from the UI.\n\nTo have Loom **autostart in the background on login**, register it with your OS service manager:\n\n```sh\nloom service install     # register autostart (systemd --user / launchd / Task Scheduler)\nloom service status      # is it registered? + is the daemon running?\nloom service uninstall   # remove the autostart registration\n```\n\n`install` runs `loom start --no-open` under the OS service manager, which owns keep-alive/restart — a systemd `--user` unit on Linux, a launchd LaunchAgent on macOS, and a per-user Task Scheduler logon task on Windows (no admin required). It is idempotent (re-installing replaces cleanly) and honors `--port`. So far only the Windows path has been verified end-to-end on real hardware; the macOS and Linux artifacts are generated to spec and structurally tested but still need a live check on a Mac/Linux host.\n\nCommon flags: `-p, --port <n>` (default `4317`, or `LOOM_PORT`), `--no-open`, `-d, --detach`, `-v, --version`, `-h, --help`. Prefer not to install? Run it once with **no install** via `npx loomctl` (same flags and subcommands, e.g. `npx loomctl status`).\n\n### One-line install\n\nFor a hands-off setup, the repo ships two installer scripts ([`install.sh`](install.sh) for macOS/Linux/WSL, [`install.ps1`](install.ps1) for Windows). They check for Node 22+ (and print a guide if it's missing — they do **not** download Node for you), run `npm i -g loomctl`, optionally register autostart, and launch Loom — all idempotent (safe to re-run; `npm i -g` upgrades in place):\n\n```sh\n# macOS / Linux / WSL\ncurl -fsSL https://raw.githubusercontent.com/DanielC000/loom/main/install.sh | sh\n\n# Windows (PowerShell)\nirm https://raw.githubusercontent.com/DanielC000/loom/main/install.ps1 | iex\n```\n\nBecause `curl … | sh` and `irm … | iex` have no interactive prompt, drive optional steps with flags\n(local-file runs) or env vars (piped runs):\n\n| Behaviour                  | sh flag / env                         | PowerShell flag / env                       |\n| -------------------------- | ------------------------------------- | ------------------------------------------- |\n| Register autostart         | `--service` / `LOOM_INSTALL_SERVICE=1`| `-Service` / `$env:LOOM_INSTALL_SERVICE='1'`|\n| Skip autostart (no prompt) | `--no-service` / `LOOM_INSTALL_SERVICE=0` | `-NoService` / `$env:LOOM_INSTALL_SERVICE='0'` |\n| Don't launch the daemon    | `--no-start` / `LOOM_INSTALL_START=0` | `-NoStart` / `$env:LOOM_INSTALL_START='0'`  |\n| Install a specific source  | `--source <spec>` / `LOOM_INSTALL_SOURCE` | `-Source <spec>` / `$env:LOOM_INSTALL_SOURCE` |\n| Port                       | `--port <n>` / `LOOM_PORT`            | `-Port <n>` / `$env:LOOM_PORT`              |\n\n> **⚠ Piping a script straight to a shell runs unreviewed code.** The one-liners above fetch the\n> installers from this repo over **HTTPS** (raw GitHub) and execute them. If you'd rather inspect first,\n> clone the repo and run them by local path (`sh install.sh` / `pwsh -ExecutionPolicy Bypass -File\n> install.ps1`), or download the script, verify its **SHA-256 checksum**, then run it. (A vanity/Pages\n> URL may front these raw links later; the raw-GitHub URLs above resolve today.)\n\n### From source (contributors)\n\npnpm is the contributor toolchain. From a clone of the repo:\n\n```sh\npnpm install\npnpm build          # builds the shared contract first\npnpm daemon         # the daemon on http://127.0.0.1:4317 (loopback only)\npnpm web            # the viewport on http://127.0.0.1:5317\n```\n\nOpen `http://127.0.0.1:5317` and you're in the cockpit. One catch on that dev origin: the **local access\ncredential** every UI write route needs is stored per browser origin, and the Vite dev server is a different\norigin from the daemon's own — so a token you captured on `:4317` is invisible on `:5317`. Without it the\ndev cockpit reads fine until your first write, then locks with a banner and a paste field; visit\n`http://127.0.0.1:5317/?token=<credential>` once instead and it never locks at all (the daemon prints this\ninstruction, and the path to the key file, on startup). See\n[`docs/releasing.md`](docs/releasing.md) for the packaging and release flow.\n\n## Reach Loom from another device\n\nThe daemon binds to **loopback** (`127.0.0.1`) by default, and that stays the recommended shape. The path that works end to end today is an **SSH local port-forward**: the daemon never leaves loopback, and there's nothing new to configure inside Loom.\n\n### An SSH tunnel (recommended)\n\nFrom the remote device, forward a local port to the daemon's loopback on the host:\n\n```sh\nssh -L 4317:127.0.0.1:4317 you@your-host\n# then open http://127.0.0.1:4317 on the device you're sitting at\n```\n\nThe SSH key authenticates you and encrypts the link; Loom still only ever sees loopback traffic, arriving on the interface it already trusts. (Use the daemon port — `4317` by default, or whatever you set with `--port` / `LOOM_PORT`.)\n\n**Then do the one-time token step.** The **local access credential** is required on every write and on the terminal socket, even over a tunnel, and a browser on the far end has never been handed it. It tells you so rather than failing silently — though only once something is actually refused: the cockpit loads and reads normally, then switches to a **writes-locked** state the moment the daemon turns down a write or a socket, showing a banner with a field to paste the credential into. A terminal pane also prints its own reason line in place of staying blank. Paste the credential and writes work again — nothing is replayed, so redo whatever was refused; terminals re-attach by themselves. Paste a wrong or stale one and the banner tells you that credential was refused, and keeps the field so you can try the right one.\n\nThe credential is the contents of `gateway-loopback.key` under `LOOM_HOME` (`~/.loom/gateway-loopback.key` by default), read off the **host** — the machine running Loom, not the one you're sitting at. Paste it once per browser, or supply it once in the URL instead:\n\n```\nhttp://127.0.0.1:4317/?token=<credential>\n```\n\nTo print that URL for you, run this **on the host** (never from `loom start` or `loom status`, which deliberately don't print it):\n\n```sh\nloom open --print-url --port 4317                 # http://127.0.0.1:4317/?token=…\nloom open --print-url --host localhost --port 4317\n```\n\n`--port` (and `--host`) are the address you'll browse at on the far device — your tunnel's local end — so use the local port you gave `ssh -L`. `--host` accepts only `127.0.0.1` (the default) or `localhost`, the two names the daemon serves the cockpit on; anything else is rejected, since the daemon would refuse it. They are different browser origins, so each keeps its own token — use the same one every time. The URL goes to stdout; a warning that it is a live credential goes to stderr. It's read straight from `gateway-loopback.key`, so it adds no network surface, but don't paste it into chat or tickets.\n\nEither way the browser keeps it and strips it from the address bar. It's stored per browser origin, so each URL you reach the cockpit by needs it once of its own — and anything holding it can drive the full loopback API, so treat it like a password.\n\n### Behind a reverse proxy (Tailscale Serve) — unverified on a live Tailscale node\n\n`tailscale serve` — or another same-host reverse proxy — in front of a loopback daemon works through a **trusted-proxy listener**: a third, `127.0.0.1`-only port that the proxy forwards to. It is **off by default**, it gives a read-and-steer cockpit rather than the full local one, and it has **not been run against a live Tailscale node** (see the note at the end of this section). What it does:\n\n- **Every request on that port is remote-class, whatever its `Host`.** It needs a gateway token (below), reaches the same Tier-1 surface as any remote caller (reads, answering and steering, view-only terminals) and can never *change* configuration, reach a human-only writer, `/internal/*`, or the local access credential. (Tier 1 does include reads such as profiles and the companion's configuration.) On this listener the class follows the *listener*, never a header a proxy might rewrite, so a proxy that rewrites `Host` to `127.0.0.1` still fails closed there.\n- **Never point a proxy at the daemon's own port (`4317` by default).** On that port the class still follows the peer address: a request carrying `X-Forwarded-*`, `Forwarded`, `Via`, `X-Real-IP` or `Tailscale-*` headers is treated as remote **whether or not proxy mode is configured**. With no remote access configured, or on a route only local callers may use (configuration, `/mcp`, the webhook ingress), it is refused with a `403` whose body carries `code: \"proxy-shaped-header\"` and names the header; with remote access configured it is simply a remote caller (a Tier-1 route needs the gateway token, and is served with one). But a proxy that rewrites `Host` to `127.0.0.1:4317` and adds none of them (nginx's default `proxy_pass` does exactly this) is indistinguishable from a local client and is served as **loopback** — the full local read surface, with no token. Point the proxy at `proxyPort` only. **Troubleshooting:** a `403` with `code: \"proxy-shaped-header\"` — or, in every case, the `[gateway] … proxy-shaped header` line in the daemon log (header names only, at most once a minute per header) — means something added one of those headers to a request aimed at the daemon's own port — point a reverse proxy at `proxyPort`, or, if a local HTTP proxy (`HTTP_PROXY`/`HTTPS_PROXY`: Fiddler, Charles, mitmproxy, a corporate agent) is relaying a local client, exclude `127.0.0.1` and `localhost` via `NO_PROXY`. Sessions Loom itself spawns (Claude, Codex, and the hook relay they launch) already have `127.0.0.1`, `localhost` and `::1` added to `NO_PROXY`/`no_proxy` automatically, so that advice now applies only to your OWN tools and browser outside Loom.\n- **The proxy must preserve the original `Host`** (nginx: `proxy_set_header Host $host;`) and, for the live panes, pass WebSocket upgrades (`proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \"upgrade\";`). Otherwise the `Host` no longer matches a trusted origin and every request is refused 403.\n- **The cockpit's static files are served without a token** (a browser has to load the app before it can present one); everything else needs the token. The browser keeps the token per origin and sends it on every request and WebSocket.\n- **`Host` must be one of `trustedProxyOrigins`, and any `Origin` must be that same entry** — exact scheme, host and port; no wildcards; `https` unless it is a `.ts.net` name; a loopback address is refused. A `Tailscale-Funnel-Request` header is refused on every route of the proxy listener, so **do not use Funnel**.\n\nSet it up (all human-only, over the loopback API; a config change needs `loom restart`; the daemon still boots without a gateway token but does not open the proxy port — it logs a warning instead — so mint the first token BEFORE the restart in step 3):\n\n```sh\n# 1. a gateway token (shown once) — see \"A direct authenticated bind\" below for the same call\ncurl -X POST http://127.0.0.1:4317/api/gateway-tokens   -H \"Authorization: Bearer $(cat ~/.loom/gateway-loopback.key)\"   -H 'content-type: application/json' -d '{\"name\":\"my-phone\"}'\n\n# 2. turn proxy mode on: the port Serve will target, and the exact origin your browser will use.\n#    The PATCH merges into any existing `remoteAccess` block, so a direct bind's fields are kept. Note: a trusted\n#    origin's host must NOT be a direct-bind bindHost/allowedHosts entry, or the proxy listener is refused.\ncurl -X PATCH http://127.0.0.1:4317/api/platform/config   -H \"Authorization: Bearer $(cat ~/.loom/gateway-loopback.key)\"   -H 'content-type: application/json'   -d '{\"remoteAccess\":{\"enabled\":true,\"proxyPort\":4319,\"trustedProxyOrigins\":[\"https://your-machine.your-tailnet.ts.net:8443\"]}}'\n\n# 3. restart the daemon detached, so the next step can run (a `loom service` install restarts via its service manager; from source, re-run your daemon command)\nloom restart --detach\n\n# 4. point Serve at the proxy port — a DEDICATED Serve port, never one shared with other content.\n#    --https needs HTTPS certificates enabled on your tailnet: https://tailscale.com/kb/1153/enabling-https\ntailscale serve --bg --https=8443 http://127.0.0.1:4319\n```\n\nThen open `https://your-machine.your-tailnet.ts.net:8443/?gwtoken=<token>` once; the browser checks it with the daemon, stores it only if it is accepted (a refused link never overwrites a token you already hold) and strips it from the address bar (or paste it into the banner). `proxyPort` has no default and must differ from `4317` and from the remote listener's port. Keep the origin to a port dedicated to Loom: any other page on the same origin can read the stored token.\n\n> **Unverified on a live Tailscale node.** This was built from Tailscale's source (`serve.go` preserves `Host`, leaves `Origin` alone, adds `X-Forwarded-*` and `Tailscale-*` headers) and tested against a minimal in-test Node reverse proxy in this repo's own tests — plain HTTP only; https through a proxy, nginx and Caddy were not tested — not against a live tailnet. Whether Serve relays WebSocket upgrades unchanged on your version is the one thing to check first (the live panes stay empty if not); the `tailscale serve` flags above also vary by version, so check `tailscale serve --help`. None of it weakens the boundary — the trust decision never depends on what Serve does with `Host`.\n\n### A direct authenticated bind (an API surface, not a cockpit)\n\nLoom can also bind a non-loopback interface itself. It is **off by default**, and it is best understood as an **authenticated API surface rather than a second way to open the cockpit** — the SPA's own routes are not on the remote allowlist, so a remote browser is refused the page itself. What is in place:\n\n- **A gateway token authenticates every remote caller.** Mint one over the loopback API\n  (`POST /api/gateway-tokens`); the plaintext is returned exactly once and only the hash is stored. Tokens can be rotated, paused, or revoked — but only over that same loopback API, never over the remote bind itself, so a remote caller can never mint or revoke its own access. There's no UI for this yet; today it's a loopback REST call, and like every other UI write it needs the local access credential:\n\n  ```sh\n  curl -X POST http://127.0.0.1:4317/api/gateway-tokens \\\n    -H \"Authorization: Bearer $(cat ~/.loom/gateway-loopback.key)\" \\\n    -H 'content-type: application/json' -d '{\"name\":\"my-laptop\"}'\n  ```\n\n- **TLS is mandatory** for any non-loopback bind that isn't a Tailscale `.ts.net` address (a tailnet link\n  is already encrypted). Point `remoteAccess.tls` at a cert and key; without readable material the daemon **refuses to open the remote listener and stays loopback-only** rather than serving plaintext.\n- **Routes are allowlisted, fail-closed.** Only an explicitly listed set — reads, plus the surfaces you\n  need to actually answer and steer (the Requests inbox, session input/stop/resume/end), plus the live session sockets: the terminal stream (view-only to a remote peer; steering goes through the governed REST input route, and host shells are never reachable remotely), the companion chat stream, and a fleet-status feed. Everything else, including every change to configuration, every human-only writer, and the SPA's own static routes, is loopback-only by construction: a new route is unreachable from the remote bind until someone deliberately allowlists it.\n- **Remote requests are rate-limited** per caller IP and per token; repeated wrong-token attempts from one IP are throttled (429), never hard-locked, so a valid token is never blocked by someone else's failures on a shared IP. The loopback path is exempt.\n\nThree things to know before you turn it on:\n\n- **The remote bind is a second listener on its own port; loopback never changes.** The daemon keeps answering on `http://127.0.0.1:4317` — plain HTTP, whatever you configure — so `loom status`, `loom stop`, `loom open`, every agent's tool connection and the admin curls above keep working. The remote listener is separate: it binds `remoteAccess.bindHost` on `remoteAccess.port` (default: the daemon port + 1, so `4318`), terminates TLS when `remoteAccess.tls` is set, and must use a different port from the daemon's. Remote clients dial `<scheme>://<host>:<remote port>`, where `<host>` is the `bindHost` (for a wildcard bind, any `allowedHosts` entry) and the scheme is `https` whenever `remoteAccess.tls` is configured — plain `http` only for a `.ts.net` tailnet bind with no TLS configured. If the remote listener can't open (no gateway token yet, TLS material that won't load, a wildcard bind without `allowedHosts`, a port clash, or a bind failure) the daemon logs exactly why and carries on loopback-only.\n- **A wildcard bind needs `remoteAccess.allowedHosts`.** `bindHost: \"0.0.0.0\"` (or `::`) listens on every interface, but a real client's `Host` is the address or name it dialled — never the literal `0.0.0.0` — and the DNS-rebind guard matches `Host` exactly. So list every hostname or IP your clients will use in `allowedHosts`; a wildcard bind with an empty list **does not open at all**. `allowedHosts` also works alongside a specific `bindHost` (a tailnet client may reach both the MagicDNS name and the `100.x` address). Matching is exact and case-insensitive — no wildcards or suffixes — and `0.0.0.0`, `::` and loopback addresses are rejected as entries.\n- **A remote browser's `Origin` must be the full remote origin** (`<scheme>://<allowed host>:<remote port>`, the same scheme and port the client dialled), and only requests that actually arrive from a non-loopback address may present one. A loopback caller keeps the loopback-only rule, so a web page served from some other local port can't borrow an allowed hostname to reach the daemon.\n\n`port` and `allowedHosts` are set exactly like the rest of `remoteAccess` — over the loopback API, human-only; no agent tool can change them. The direct remote listener is API-only: the cockpit itself is not served on it (the trusted-proxy listener above is the one that serves it).\n\nStep-by-step instructions live on the landing site's **Remote access** page ([`site/remote-access.html`](site/remote-access.html)).\n\n## Network\n\n- Your agents' own conversations with Anthropic — or, for a session on the opt-in Codex harness, with whichever provider your Codex CLI is set up to use. They carry your code, as any coding agent's do.\n- A plan-usage poll of `api.anthropic.com/api/oauth/usage` every 60s, only when Claude OAuth credentials exist (`LOOM_SUPPRESS_USAGE_POLLER=1` stops it).\n- npm-installed daemons check `registry.npmjs.org` for `loomctl` updates every 6h (none from source; not switchable off, `LOOM_NPM_REGISTRY` only redirects). New worker worktrees run your package manager's install.\n- Opt-in and able to carry session content: the Telegram companion, outbound alert webhooks, Agent Runs completion webhooks (they post the run's id, status, result and error — the result is agent output), and any Connection you bind.\n- Opt-in downloads that carry no session content: a profile with document conversion pip-installs `markitdown` from PyPI into Loom's own Python venv, and the GitHub capability downloads a pinned `github-mcp-server` release from github.com.\n\n## How it works\n\nA single local **daemon** owns everything durable — the sessions, the PTY host that drives `claude`, the Fastify HTTP/WS gateway, an SQLite store, git, and the vault auto-committer. An ordinary project agent gets **no git write on its tool surface**: checkout, commit and push live behind a human-only REST route, or behind one of the deliberate, opt-in grants above (the Elevated Operator, the companion's git lever). Read that as the tool-surface boundary it is rather than a sandbox — a worker still has an ordinary shell inside its own worktree, which is how it commits its work in the first place; what the boundary buys you is that no *agent tool* can push, and no Loom tool or route can reach a repo the session wasn't given. The **web viewport** is stateless: it attaches to a session over a WebSocket and detaches freely, while the session keeps running on the daemon whether or not anyone is watching.\n\nGive a **lead** agent a goal and it decomposes the goal into tasks, spawns **workers** — each on its own worktree branch, each driving a real Claude Code session — then reviews each diff, merges what passes, and keeps the vault and board versioned alongside the code. Plan, delegate, review, merge.\n\nA run, end to end:\n\n1. **You hand a lead a goal** — say *\"add rate-limit middleware and cover it with tests.\"*\n2. **It decomposes the goal** into cards on the project board and **delegates** each to a worker spawned on its own git worktree branch.\n3. **Workers build in parallel** — each drives a real `claude` session, commits to its branch, and reports back up when it's done or blocked.\n4. **The lead reviews each diff** and merges what passes through a build gate; a failing gate bounces the card back to the worker instead of merging.\n5. **The board and vault stay versioned** with the code, so the whole run stays legible after the fact.\n\nYou watch it live in **Mission Control** — the fleet, context meters, an activity feed, and an attention queue that surfaces a merge the moment it needs your review.\n\n<p align=\"center\">\n  <img src=\"docs/images/architecture.svg\" alt=\"Loom architecture: a loopback daemon owning SQLite, the PTY host, the HTTP/WS gateway, git, and the vault, with a stateless web viewport attaching over WebSockets and a lead agent orchestrating worker sessions on isolated branches.\" width=\"100%\" /> </p>\n\nThe monorepo (pnpm + Turbo) is three packages:\n\n- **`packages/shared`** — the contract: types (Project / Topic / Session / Task + the session FSM),\n  one config-resolution mechanism, and the ws/REST protocol.\n- **`packages/daemon`** — owns everything durable: SQLite, the PTY host, the gateway, the\n  project-scoped task MCP server, git, and the vault auto-committer.\n- **`packages/web`** — the stateless React/Vite viewport.\n\n## Your companion\n\nBeyond the orchestration fleet, Loom can run a **companion** — a single long-lived agent you chat with directly, over **Telegram** or an in-app web chat, on the same daemon-owned real-`claude` runtime. It's a personal assistant rather than a project worker: it stays running across restarts, holds the thread of an ongoing conversation, and reaches you on the channel you started from.\n\nThe companion grows with you. It curates a **durable memory** of what matters — your preferences, ongoing context, things it said it would follow up on — and recalls it silently at the start of each conversation. It sets its own **reminders**, both one-shot (\"remind me in 20 minutes\") and recurring (on a cron schedule), which fire back to your chat as a nudge. It writes its own private **skills** for tasks worth repeating, and — when you enable a cadence — proactively checks in only when there's something genuinely worth surfacing.\n\nWhat it may actually *do* is yours to grant, one lever at a time. Out of the box it talks; grant it more and it can commit and push on your behalf, against either the project's vault or its code repo — the target resolved by the daemon, never a path the agent supplies, and a push always asks you first. If you'd rather not hand out levers one by one, there's an opt-in **lead mode** that gives one companion full capability across every project; the UI states that blast radius plainly before you turn it on.\n\nYou set it up and run it from a single **Companion** page: chat on one side; configuration, channels, memory, reminders, capability grants, and its editable persona on the other. Every inbound message is treated as untrusted input, the bot token is encrypted at rest, senders are allowlisted, enrollment uses one-time DM pairing codes, and all configuration is human-only — never something the chat-reachable agent can change about itself. It can't be driven through a raw terminal either: text pushed at a companion session over the API or a terminal socket is refused outright, so nothing can put words in your mouth for it to act on.\n\n## Screenshots\n\n<p align=\"center\">\n  <img src=\"docs/images/screenshot-terminals.png\" alt=\"Loom's terminal cockpit: a lead session and its worker fleet tiled side by side — live interactive claude transcripts, per-session context meters, branch names, and voice controls in one phosphor-on-dark panel.\" width=\"100%\" /> <br /> <em>The terminal cockpit — a lead orchestrating its worker fleet, every pane a real interactive <code>claude</code> session with its own context meter and branch.</em> </p>\n\n<p align=\"center\">\n  <img src=\"docs/images/screenshot-board.png\" alt=\"Loom's per-project task board: a kanban of cards that both you and the agents read and move through columns, each card tagged with its priority and the repository it is routed to.\" width=\"100%\" /> <br /> <em>The per-project task board — a kanban you and the agents share. On a multi-repo project each card carries the repo it's routed to, so one board can drive several checkouts.</em> </p>\n\n<p align=\"center\">\n  <img src=\"docs/images/screenshot-gates.png\" alt=\"Loom's Gates page: the daemon-wide gate lanes across every project, showing semaphore occupancy on top and a history table of settled merge, worker and deploy runs with outcome, branch, worker, duration and how long ago each ended.\" width=\"100%\" /> <br /> <em>The Gates page — every merge, worker self-check, and deploy run across all projects, sharing one concurrency budget, with the failing test named on a rejection.</em> </p>\n\n<p align=\"center\">\n  <img src=\"docs/images/screenshot-terminal.png\" alt=\"A live Loom session terminal: the real interactive claude running in a daemon-owned PTY, attached over a WebSocket.\" width=\"100%\" /> <br /> <em>A live session terminal — the real interactive <code>claude</code>, attached over a WebSocket.</em> </p>\n\n<p align=\"center\">\n  <img src=\"docs/images/screenshot-companion.png\" alt=\"Loom's Companion page: a chat with a long-lived personal agent, on the same daemon-owned real-claude runtime, reachable over Telegram or in-app web chat.\" width=\"100%\" /> <br /> <em>The Companion — chat with a long-lived personal agent over Telegram or in-app web chat, on the same durable runtime.</em> </p>\n\n<p align=\"center\">\n  <img src=\"docs/images/screenshot-skills.png\" alt=\"Loom's Skills store (under Actors): a SKILL.md open in the editor with save and reset-to-shipped controls, beside the list of bundled skills.\" width=\"100%\" /> <br /> <em>The editable skill store — read, edit, and three-way-merge Loom's shipped skills; changes apply on the next session spawn.</em> </p>\n\n<p align=\"center\">\n  <img src=\"docs/images/screenshot-platform.png\" alt=\"Loom's Platform page: the standing Platform operator and the suggest-only Workspace Auditor, with the auditor's run-on-a-schedule control.\" width=\"100%\" /> <br /> <em>The Platform operator and suggest-only Workspace Auditor — set up your workspace and review your own sessions, on a deliberately narrow tool surface.</em> </p>\n\n<p align=\"center\">\n  <img src=\"docs/images/screenshot-projects.png\" alt=\"Loom's Projects page: the list of projects with live-session dots, a selected project's repo and vault, its agents, and an agent's editable startup prompt.\" width=\"100%\" /> <br /> <em>The Projects page — create and manage projects and their agents, each agent carrying an editable startup prompt injected as its first turn.</em> </p>\n\n## Docs & links\n\n- [`CLAUDE.md`](CLAUDE.md) — architecture, the validated gate-free spawn recipe, and the load-bearing\n  invariants (start here to hack on Loom).\n- [`docs/decisions/`](docs/decisions) and [`docs/adr/`](docs/adr) — the decision records the\n  `@decision` anchors in the source point at; [`docs/investigations/`](docs/investigations) holds the incident write-ups.\n- [`docs/releasing.md`](docs/releasing.md) — the packaging, versioning, and release runbook.\n- [`CHANGELOG.md`](CHANGELOG.md) — notable changes per version.\n\n## Contributing & community\n\nContributions are welcome. Please read [`CONTRIBUTING.md`](CONTRIBUTING.md) to get set up and [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) for the community standards we hold. To report a security issue, follow the process in [`SECURITY.md`](SECURITY.md) rather than opening a public issue.\n\n## License\n\nLoom is released under the [MIT License](LICENSE).\n","readmeFilename":"README.md"}