{"_id":"@d3ara1n/pi-hashline-edit","_rev":"24-37eb3537f206021ba20747da114f401a","name":"@d3ara1n/pi-hashline-edit","dist-tags":{"latest":"0.7.1"},"versions":{"0.1.0":{"name":"@d3ara1n/pi-hashline-edit","version":"0.1.0","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.1.0","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"eb6ea4a95bce486e0fa5a3b0ed8cb17616c8ecf6","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.1.0.tgz","fileCount":21,"integrity":"sha512-H+xm9i5WY69JxYeKNTqTbMAY0lm8lnA3wGoG5iON0GvCKRKWx9dsINJYJ3ngG4XPJtoZiY04zBaZ7mUkqUmQOw==","signatures":[{"sig":"MEUCICE46pxIlHyelln5lbooRqF5z9vytL22cSf/782eGHDhAiEAyznVOT+1hz/GtLvXXnKC+5XzWBm1kQIILveB5KdpiVs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59702},"main":"src/index.ts","type":"module","gitHead":"cbee8d76ddb67a9bcefe8e4ca06b77e9db3cda4c","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"d3ara1n","email":"d3ara1n@outlook.com"},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"12.0.1","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.1.0_1784986050186_0.015837329604303285","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@d3ara1n/pi-hashline-edit","version":"0.1.1","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.1.1","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"f9738d0757b4650d630f9c1dde2bb03c72e17eee","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.1.1.tgz","fileCount":21,"integrity":"sha512-wkL4L2s2BDL9xVefmPia/dacwxsO0R4poFpWgkLM1PJeIukuS1g3ifKdkqNN3fSTZcDe0iegLKnwtCb94P8vnw==","signatures":[{"sig":"MEYCIQDORFVP77JOqbYtyICUDQ23z6ofL8qOIYnImmNPfOpGNwIhAMwnB7YJockrH15zg7y/b+1pBFcuJPg22Sgv0UH4Y4A3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":63819},"main":"src/index.ts","type":"module","gitHead":"bb87e484f46ef9f70f8d62cda079ded74f4f64f4","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.16.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.1.1_1784987381595_0.7988100960208249","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@d3ara1n/pi-hashline-edit","version":"0.1.2","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.1.2","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"ff4e953577bdc611ca438dda6c4c73fc7a805501","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.1.2.tgz","fileCount":17,"integrity":"sha512-gkG3C8R/7PUmJ+nwmq3Jnfft7jUnRqDx3Q6HIREO5SQ+fOWdgSyi16O3PZ4N89x2Q5xY8gxNVFrQlh5XYvZbbw==","signatures":[{"sig":"MEUCIQCZK0SwsXnpJz8v2ylO2eWpRNIihrmaDqgmGLsBPOfi7gIgEm6u1CxHMYAmaoKzF+XkOOpC8wEH9NRGWw6M4kxwPC4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":53270},"main":"src/index.ts","type":"module","gitHead":"34c39f8e2e7184256cecf687b3fd1a9090865292","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.16.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.1.2_1784998257723_0.7208839807069607","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@d3ara1n/pi-hashline-edit","version":"0.2.0","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.2.0","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"f76a4997f8468c562050223800e067165a429aae","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.2.0.tgz","fileCount":18,"integrity":"sha512-exuf1j047B39+fHrEbbRZHaUHcb4/UoyhyDKRvGv4TxiT0hcnSroHAL1VYq79gqeTj1NO+MNB5ACcU9uwibb4Q==","signatures":[{"sig":"MEUCIQCjcmrxQ34FPV7YoUlOa8AC6t617L1lgkyWiEM9Ben/dAIgcF5qwOhANz4X8SLYg3ZQiL8v1TGzJG+mgBsyoMM+sRQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":81832},"main":"src/index.ts","type":"module","gitHead":"4712ea0f51c461c6124744235e33c6cba792fd87","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.16.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.2.0_1785010313969_0.0635414097296958","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@d3ara1n/pi-hashline-edit","version":"0.3.0","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.3.0","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"afdaf3a0780279be53f55fc7992b02942c0163b7","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.3.0.tgz","fileCount":20,"integrity":"sha512-1UxdcDziNctzdLgrKU54p+outJdMJbcN4COZkHB+6PXtmeuNqHECU1feAxAK3x/V3Fuvil18Umxfu9cjpWl8sA==","signatures":[{"sig":"MEUCIQCnmrEnelXq9wpyujhrBv1pymhttzCpiS56JnFHF/r17AIgBIpGUXRyUT2Bk7g6B8FCk13hSa7YnCjE6OcO1RyWNWo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":109495},"main":"src/index.ts","type":"module","gitHead":"9b1ca11c794c9d2901da09143a3cc501a2854337","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.16.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.3.0_1785416891139_0.44614353410652674","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@d3ara1n/pi-hashline-edit","version":"0.3.1","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.3.1","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"99f3496a62f271d9c27b348e9c90b7fc3c1c706f","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.3.1.tgz","fileCount":21,"integrity":"sha512-Gbz0MQTkq0k+0EQJBe7aqD/WFmfSpT0C5CZCcP2Lh2mJ4qAoBKIj0Pqr+uoIjt6+IkBkG89TNVGkVNORTo3n1w==","signatures":[{"sig":"MEUCIC7sDAqvlyT8WdMyMIFywsE3jJIUDGwdMcv6/LgEyoDXAiEAjVjn6ECkuxb1nbyextaoTXlOvnepMwgJJoNwm6tF5TQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":114453},"main":"src/index.ts","type":"module","gitHead":"804ec98f7d13fc60f7b29b5566ab1339588e4980","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.16.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.3.1_1785466672532_0.23212866350458494","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@d3ara1n/pi-hashline-edit","version":"0.3.2","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.3.2","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"6afa4e8b6980ed8c7e329c83b9ca238734ecea6c","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.3.2.tgz","fileCount":21,"integrity":"sha512-iUEv9JVT+ObjZOxdEcBVMBRzPN2RCSEwA0vIZNsNsiNAddJXUxAj8CVzn+qEPmxG9GEqw7ZESJ7Qp7DnauQHJw==","signatures":[{"sig":"MEUCIQDgu2ceeRDZr1hkiatMLa6FyVGx3OMQFUdd5iiysB0upwIgfOtrYWwDoJWKKDwhLRGWZBO5f+HJ+NvkAQsBcqHw6HQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":114679},"main":"src/index.ts","type":"module","gitHead":"83b50ea9afafce753a21d8f45ee9ebb65e63b729","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.16.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.3.2_1785819753241_0.7800500661161673","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@d3ara1n/pi-hashline-edit","version":"0.3.3","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.3.3","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"16f2b76ca61559e9f4c5d5028a0aa400b0b9306e","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.3.3.tgz","fileCount":21,"integrity":"sha512-ylnsy6p/h0Z47ClgPIQZfQqEWZFhE0sZnOSsanV4u25OGI6CFnbN3rCht2aH3oyHl3ymEIXC0NwjK/QXoo1ygQ==","signatures":[{"sig":"MEUCIHBj9py4xyEQlJVOLYQfwK29zr+DGHdm6KadD9QhF3hnAiEAkqLi6hkgontMaREtE8J9l9btKUnKmgw0dMRX3Yrr8Fk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116160},"main":"src/index.ts","type":"module","gitHead":"8bd13c734ef6477de1f9d7d58645a989e65d8d9b","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.16.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.3.3_1786004074764_0.8378611161483567","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@d3ara1n/pi-hashline-edit","version":"0.3.4","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.3.4","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"91391f2149eddf9295eb46b67cf97445c3dcc96c","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.3.4.tgz","fileCount":21,"integrity":"sha512-ugKqATTZ9un63QmQ2z2ruMmGyoLSeM4/88FjwJpzblABr04p8ZAaBitVwkfjfz9ysfNaGPSlKpJZMiXHRMxDsw==","signatures":[{"sig":"MEUCIQDDJGVwsODSTQiyUDNTb/ZzPGitG4POItaHNApXTwsYNwIgORCLjAr1UgPt16RT6lXVDRb74Dy6ZQGqAdCy/lMfOMk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":115970},"main":"src/index.ts","type":"module","gitHead":"8ed041cd536f1109a6fca477829136f9570c2741","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.17.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.3.4_1786705877930_0.7788732134159106","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@d3ara1n/pi-hashline-edit","version":"0.4.0","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.4.0","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"31abfb4e377a1ce6c084d00e871f5f8be7915eb7","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.4.0.tgz","fileCount":21,"integrity":"sha512-NePZkDWEKjb+132rtCeqEyjTgLvG+DI5tW60mvKZg7E7lu/an6JujwyWVBZ5Xd81xGzbtv57hWp3i8fFitrbag==","signatures":[{"sig":"MEQCIDApkh6D9fidBs0Ynv4X1/mv2FWnnIkXdRV4Z4OcWyaFAiBMcELUd0NCikcMfDIBwqQnCSDNIzJ1s1yFbr7Dvf1Crw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":123036},"main":"src/index.ts","type":"module","gitHead":"a7fd82fe8c9adeffd45ede5660982f58ae17d660","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.17.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.4.0_1786886982154_0.025722383573130614","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@d3ara1n/pi-hashline-edit","version":"0.4.1","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.4.1","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"49405d09e84d2f1654a8802f457449db1aad139a","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.4.1.tgz","fileCount":21,"integrity":"sha512-6l4zHgUWAiaaLgRf4Eqif+isHzmwOt+Mt9HFFu1qPZML7gZltrCXdEy7b6bxks5q1/ypSO59PHB8cUSlp16hew==","signatures":[{"sig":"MEYCIQCeuSrTSMkYHyOs+CnbsBmrwm3DRLDOgvH1LeMkncCEEQIhAIrrnoAx8l8hjDaGexcal/r09WG56VPNVdaCbSj/iYfC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":126494},"main":"src/index.ts","type":"module","gitHead":"39b2f963076aba246fa1ab14ddfc34402f23e149","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.17.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.4.1_1786897246738_0.8719585355387982","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@d3ara1n/pi-hashline-edit","version":"0.5.0","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.5.0","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"ead1c20a73a70f38ec7250f0f260cd6baa78827e","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.5.0.tgz","fileCount":22,"integrity":"sha512-RspooYkzGbygtI3oO6l2UkBsMMywv+x0Jz04WvwwhXf5q11244HISpdli82aRUc7STnw6BZURN7C1FjzJ+hHLw==","signatures":[{"sig":"MEYCIQDvwx8xvcwDQmPOLkwFgpqG3S8F20TPiVb4U/lNMtebHgIhAMb6AT4spZhjp7FGpBoAhQnmfBqbBjN3bbw3UsL1bpy1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":145591},"main":"src/index.ts","type":"module","gitHead":"218ab784ea11f918027a0fb6efbd18f884f4775a","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.17.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.5.0_1787227629816_0.7752880693963293","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@d3ara1n/pi-hashline-edit","version":"0.5.1","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.5.1","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"5adb8fc63b133aab6b0d75a77550cbc776280aa4","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.5.1.tgz","fileCount":23,"integrity":"sha512-7FEmNFoQeWUYnYZch2nvcDyVbA3SiBbWUkLCqRP66bASJ8VXxGJEmy9t1cwV2jSXGoHIdnGn4EBKXbPXIQr6Nw==","signatures":[{"sig":"MEYCIQDNXvIa+cmmmpvW7eccjb+PkxSFlFQltSNN2q+GWicPEwIhANvIIQDUHo/WaMjlv3uDgKf5DzwQk4Bwz061dHQ6q7qQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGfeji+xvc3mE346MWiu7f9w3Chn8S83OvFx5MB2CmflAiAE+dUVRtaXUWqXm0cIgVlYIO4OC8AM2Ckp4VjJb5+TdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":166499},"main":"src/index.ts","type":"module","gitHead":"cb70eb46f3cacd66cec3b14d3b3d4a81ee2ae0a5","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.5.1_1789645744316_0.912974045881161","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@d3ara1n/pi-hashline-edit","version":"0.5.2","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.5.2","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"36899e749d4e8b11e09e697ceeb0029b04a44154","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.5.2.tgz","fileCount":23,"integrity":"sha512-eSNqVoOfdlBcBhieiDVsLQoB7/K5cmGwDT3Pb7mq6fzNx3Bnq+N0DTlY0CCffN2MGWFhdlO9/IY6M/kk4tQbRg==","signatures":[{"sig":"MEYCIQDo+rzJ3n6PD72fmlU+RqDVl0amXfNlas032QRSBh7PMgIhAO4qVnWnyKJ2t9EBEczC6nmJrf1b5nWtSbFCeI/TbCMY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAw0fkhGF5X8l96POqFZ+NYXnGzzBhypEwQmAhQUh0VIAiBkdPaUbc1ErAiXDsN/bqL1teEuipUG4bX5TgJnNkRo0g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":166756},"main":"src/index.ts","type":"module","gitHead":"7ac1dc80fb3a36cf431cda354b5a70348f152889","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.5.2_1789655372612_0.14841573211701053","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@d3ara1n/pi-hashline-edit","version":"0.5.3","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.5.3","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"06e780366c735e6688141923c885f66f01713fab","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.5.3.tgz","fileCount":23,"integrity":"sha512-YHoxlNe8PFBEMVp2Lc8CLPXmn11NUZMIgoLrH7MpXd9R5q0THMls1KGxArxiK8/iByKSlhPLxexo3Qkyqn3cBA==","signatures":[{"sig":"MEQCIC36jpzzOC+yG3jZhzknsPWjvzygLDB3XDQ9/bYMQ3pOAiA1uhjakri7QqwEe4/QS6Lc5bq8+a1dXXEcO2CjVTCYkw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCNhfSU63RyuP+1kMZaU+5uwKAbv7mqx3/mwXBIMzjp5wIgYNJxXCvOjqSg5MqUg2eWof9M1CrqG+uWLSkW232cWTw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.5.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":167832},"main":"src/index.ts","type":"module","gitHead":"23f16d335d71777fa253427656c3498855ca222f","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.5.3_1789691408732_0.6604746380527462","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@d3ara1n/pi-hashline-edit","version":"0.5.4","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.5.4","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"24f2a1df9871242eaeb4cbd9ce1a3c0eb52fc1c6","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.5.4.tgz","fileCount":23,"integrity":"sha512-M4U07dEYLQkYoJRGFyK4OCcZKC4VuO+Wi1rIPE96rItm1dZS7YTYH9J1aqn3P/QI3hKWvUXMEb31dr3asPvngA==","signatures":[{"sig":"MEUCIA9oakx0UC0kholdS7mjncRs9nacGLNDLdVDP1ZRq0wKAiEApGKId143V/Rdr7B+CwGkILFUo27031tKt8OIw98k3qI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDXsdX1Qm+sa7QThvZlAKez/eK4w88cSZsNrBDsmbRiIAiEA3IMEm06mqVM5HIptHAxXMTRLHFUvAL1UTe5SwpbEFng=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.5.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":167337},"main":"src/index.ts","type":"module","gitHead":"143f86e28e22c9c4f9284f780a1c0d1d4b3a52f5","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.5.4_1789691869819_0.46646697481958865","host":"s3://npm-registry-packages-npm-production"}},"0.5.5":{"name":"@d3ara1n/pi-hashline-edit","version":"0.5.5","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.5.5","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"0d2b118a98fdb61d8c0f3b3c639f59378f508f77","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.5.5.tgz","fileCount":23,"integrity":"sha512-Kar6x24/mcnva/od06HZJ2xR0qvdkB0Hwptlcb4KKnutQZeC0ADZQLvOj8Pnlwn8GZniglbNzhkjUM8fgQOvWA==","signatures":[{"sig":"MEYCIQCP6styI3FlmPneRJcID+S67H8z9Gxkn2+xSwsAFsDwxQIhAIlWN7vLHownGl8W6Mepix7Ezl21Ph8aprdsaVsj4T3N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFH1iOgYdCaeOkT6/1l6BMTgwsI+soF7lxGRsvjPuf7IAiAqiotdqck8FUjl/U8dXFC/gauMoJf+sskM2QvfR2dCSg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.5.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":173637},"main":"src/index.ts","type":"module","gitHead":"0ebb12bb0167844f552be58c20ef57d0a9cd8cf1","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.5.5_1789868183827_0.7414278611895411","host":"s3://npm-registry-packages-npm-production"}},"0.5.6":{"name":"@d3ara1n/pi-hashline-edit","version":"0.5.6","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.5.6","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"3a8ea4f43d6ba768fb3b2c4dbb934149e8c4795a","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.5.6.tgz","fileCount":23,"integrity":"sha512-SnKOJoHo8Ut04erSDsgbPkWQVsiMUOZLCVejp/E8Qco9OEFlGo+CBeS5dwC3NDXRlR7f7hof5bcMeT6ETzWvfA==","signatures":[{"sig":"MEYCIQCrHBlAt0mlXPQ4AtGF9q4oixObdnKM55kZ+0ysSdf46wIhAJahRZh2pAXrekFDovHIZpyz8gQUbEtEMgif0nxAh0f8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGJiL7qlpaLPluumUcUfgnaUVFpDpaca4m/uKqjUs3xGAiBMlCswp+MG5sYZ/JUE1v96fZnnvy7ncYkljf7LtQOZvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.5.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":173740},"main":"src/index.ts","type":"module","gitHead":"09d597f6568853f2ce4ce558db7ad706241a60a2","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.5.6_1789869210070_0.30438227843898025","host":"s3://npm-registry-packages-npm-production"}},"0.5.7":{"name":"@d3ara1n/pi-hashline-edit","version":"0.5.7","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.5.7","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"6976bd9666a9930dc67fa6502aba5a7729ab6fd0","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.5.7.tgz","fileCount":23,"integrity":"sha512-Q2WuL6fqBp5OtCiVcxoL4JVA0IKW0n+bS315kqCaIm91pZGxp+JNG1SYhyPJdPKYP/5pzwG7zEhgIgVAwXhQqA==","signatures":[{"sig":"MEUCIBpy0+ey2UEcHpKhikCtWVn2Hphkq/Fxdo1iWlOlWwfAAiEAsAO5+HPRifBXJpY70cJyoW3TZxfrevLMovL6Wa+MoLA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDuEKxdwxlv5xhR6iFDo5+G4PGJKACIGV1dDyHe43okTAIhANxLWvkQqLmxzTKDJ+M7S/V82iXx3N6tejaU2NFqNwqz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.5.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":175927},"main":"src/index.ts","type":"module","gitHead":"d524926d7489bc23e107fe7781da16b27375c11a","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.5.7_1789872119329_0.09645295583708635","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@d3ara1n/pi-hashline-edit","version":"0.6.0","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.6.0","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"b059e75f5f39ed270adec99fbe45e60809055e74","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.6.0.tgz","fileCount":23,"integrity":"sha512-56O1jPu2fSUEn2x/AHcYTk9g7yjPHrvFH7nYC/MRIqsRBYvkCyHDcRPhHfLVfd9I8rIfDmk5IRTjAAgftr6bKQ==","signatures":[{"sig":"MEQCIBbuiJDj/gseGdaraxMeTKNcGZPfA3mYllsZGEvDpj35AiAs15X/DwU/y9LE0epTHyeuWjAdZ4i6ADtbSb1bU8E5Nw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAMJ38xYMkIfwFaL5E8Jr+IZADa2lw+GGCO3wyOTf4ImAiEAjBDB6+zo8b4TbCyhc/Xoe1W2M0UHVNasy8S9Mn23934=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":177791},"main":"src/index.ts","type":"module","gitHead":"f2720178df8820d39cd6605acc25c3b77692f3d1","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.6.0_1789873425142_0.6681080262465917","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@d3ara1n/pi-hashline-edit","version":"0.6.1","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.6.1","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"0f59b7e7a4d17ad1d38e85dc5f3172edb46dcb82","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.6.1.tgz","fileCount":23,"integrity":"sha512-jVtN58hi/K5WaADuPb4UH3X3j0mGezF3lJ8oHmnN0MXck7izK4prJT/7G4Z2X7MjnK6GmLe3XEJHEhwdeQjVFg==","signatures":[{"sig":"MEMCIA51+AF76WXWkgKJbwpu31m4lzLXFX0FJ5vDUUMAi9gFAh9thDctwnmhLMQBQqhK5G1hbTMmyqRxgl6nBb2rwhr/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAXtD3C6QqCdEGRSZTFTOHP8ONgsAdQ1ryLuznE2WTjSAiEA2Ze7MaTrwXAep0dGmndLnh3mTkJHQoIC+FUlqGOWv0o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":185600},"main":"src/index.ts","type":"module","gitHead":"db78a6318317ee7231b7b1e52576fc2d9d498e4c","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.6.1_1789875403795_0.9484049554448652","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@d3ara1n/pi-hashline-edit","version":"0.6.2","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.6.2","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"ec3913c2e88141e4c781cb94a801867fff8c30d2","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.6.2.tgz","fileCount":23,"integrity":"sha512-LpKGUHPxgPfxB/lsm5bAn3Lqxj6g4MF9HBS936EMWgnj914vCuBRfs/iulqFBw9Vl4c2SAlbp9nGBfReplDm9A==","signatures":[{"sig":"MEUCIH/syGDm+HvD00OQHDc6H9U24uIv3wxArioNZditvTi2AiEA+S7q82IkMdYraBbQ7cfHtGmbpyE7lggl07AtUQ0bz48=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIE7ud9Bb5zsilJbpYk8RralPEXXPmDj7vMYahC3dJ5IkAiEA3k5J14h+MVDDoDWrJrr8CM4NxVSISfJ4IoDPLuMGDOw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":186056},"main":"src/index.ts","type":"module","gitHead":"5057a5bd7c8e0a9b42b2bdba9a75078147c759b2","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.6.2_1790004878936_0.15242623920943954","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@d3ara1n/pi-hashline-edit","version":"0.7.0","keywords":["pi-package","pi"],"license":"MIT","_id":"@d3ara1n/pi-hashline-edit@0.7.0","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"d116970f95429379db15cabe4258dd770e28b273","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.7.0.tgz","fileCount":24,"integrity":"sha512-eyW+9/URX9s3qdD6N6PN9I/8HXFAkkXUHQ6KXPCxYzkH+u4XYc8jdmhgjBUQw3W2NF4qW60ukjWkDD2lpJ7pyA==","signatures":[{"sig":"MEQCIDZ4zGRYFxYGYaVWfBRW9QGhyirY1H3Pg3WLQ+Ljdnc1AiBJJNbmUixH9P9x/raG8VBtuf/KHDszDcaVHPe2c2gpvg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEMCIEGXOxNZRDIr+hqfu1pncwKJsl0zERK/y+5qK9Jr94/uAh9hcIvqxHzfBFGx5fKVyq6fISiA554q2m1KbEbMmzQ4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":204677},"main":"src/index.ts","type":"module","gitHead":"438ada3233ecdcaa30d97b5a32da029fd1eaa76a","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"_nodeVersion":"24.21.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-hashline-edit_0.7.0_1790231925251_0.2774753133945316","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"pi":{"extensions":["./src/index.ts"]},"_id":"@d3ara1n/pi-hashline-edit@0.7.1","bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"dist":{"shasum":"df6bc10caae1577a1f824d4720435f150b75ec4b","tarball":"https://registry.npmjs.org/@d3ara1n/pi-hashline-edit/-/pi-hashline-edit-0.7.1.tgz","fileCount":24,"integrity":"sha512-RuRVJ7nTRUMulf5lS5KeNGOQo+sdPHUi+d5dANuXReg6GQpYPohq2hMojWC8LVU26EECZgabHAHDx+ZmHWAZBA==","signatures":[{"sig":"MEUCIFrGxNgMyAuo/xMlN1NnzMw3a5V9y0mDcsimZyZcPKgWAiEA62IZDLq/707Q/QrzxyhVa6GqqF4MVuM2rSOsZ8s3ehg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCsheMPjepn7LXAXGXkAR7F4cUfbfARzXXRt02SW+AcRQIgE7sDhruFNtAP98jHpAzViODgNURScsm6sBbk2EikMo4="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@d3ara1n%2fpi-hashline-edit@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":206114},"main":"src/index.ts","name":"@d3ara1n/pi-hashline-edit","type":"module","gitHead":"b272330ac1862463a6fc079c80e0bb8358ae1402","license":"MIT","scripts":{"test":"node --test src/core/*.test.ts src/pi/*.test.ts","test:integration":"node --test src/integration/*.test.ts"},"version":"0.7.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"f9f69b31-c30f-4e8f-bf89-02b8f35a1692"}},"homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","keywords":["pi-package","pi"],"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"_npmVersion":"11.19.0","description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","directories":{},"maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"_nodeVersion":"24.21.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-hashline-edit_0.7.1_1790645823866_0.5182786730750217"}}},"time":{"created":"2026-07-25T13:27:29.986Z","modified":"2026-09-29T01:37:04.296Z","0.1.0":"2026-07-25T13:27:30.333Z","0.1.1":"2026-07-25T13:49:41.755Z","0.1.2":"2026-07-25T16:50:57.852Z","0.2.0":"2026-07-25T20:11:54.148Z","0.3.0":"2026-07-30T13:08:11.271Z","0.3.1":"2026-07-31T02:57:52.675Z","0.3.2":"2026-08-04T05:02:33.378Z","0.3.3":"2026-08-06T08:14:34.903Z","0.3.4":"2026-08-14T11:11:18.061Z","0.4.0":"2026-08-16T13:29:42.308Z","0.4.1":"2026-08-16T16:20:46.885Z","0.5.0":"2026-08-20T12:07:10.230Z","0.5.1":"2026-09-17T11:49:04.408Z","0.5.2":"2026-09-17T14:29:32.698Z","0.5.3":"2026-09-18T00:30:08.826Z","0.5.4":"2026-09-18T00:37:49.906Z","0.5.5":"2026-09-20T01:36:23.932Z","0.5.6":"2026-09-20T01:53:30.150Z","0.5.7":"2026-09-20T02:41:59.432Z","0.6.0":"2026-09-20T03:03:45.234Z","0.6.1":"2026-09-20T03:36:43.882Z","0.6.2":"2026-09-21T15:34:39.045Z","0.7.0":"2026-09-24T06:38:45.402Z","0.7.1":"2026-09-29T01:37:03.952Z"},"bugs":{"url":"https://github.com/d3ara1n/pi-extensions/issues"},"license":"MIT","homepage":"https://github.com/d3ara1n/pi-extensions/tree/main/packages/pi-hashline-edit#readme","keywords":["pi-package","pi"],"repository":{"url":"git+https://github.com/d3ara1n/pi-extensions.git","type":"git","directory":"packages/pi-hashline-edit"},"description":"Hashline-style file editing for pi — line-anchored edits verified by content hash, replacing oldText/newText matching","maintainers":[{"name":"d3ara1n","email":"d3ara1n@outlook.com"}],"readme":"# @d3ara1n/pi-hashline-edit\n\n[![npm version](https://img.shields.io/npm/v/@d3ara1n/pi-hashline-edit)](https://www.npmjs.com/package/@d3ara1n/pi-hashline-edit) [![npm downloads](https://img.shields.io/npm/dm/@d3ara1n/pi-hashline-edit)](https://www.npmjs.com/package/@d3ara1n/pi-hashline-edit) [![license](https://img.shields.io/npm/l/@d3ara1n/pi-hashline-edit)](https://www.npmjs.com/package/@d3ara1n/pi-hashline-edit) [![Explicit Edit Benchmark](https://img.shields.io/endpoint?url=https://huggingface.co/datasets/alexshpunt/explicit-edit-benchmark/resolve/main/badges/d3ara1n-pi-hashline-edit.json&style=flat-square)](https://huggingface.co/spaces/alexshpunt/benchmark-explorer?card=harness%3Ad3ara1n-pi-hashline-edit%40latest)\n\n> Hashline-style file editing for [pi](https://github.com/earendil-works/pi-coding-agent) — line-anchored edits verified by content hash (replacing `oldText`/`newText` matching), plus a location-blind `replace` tool for bulk + regex transforms.\n\nEdits reference lines by `LINE#HASH` anchors (copied from `read`/`grep` output) instead of retyping the code to be changed — eliminating string-not-found loops and whitespace battles at the root.\n\n## Why hashline?\n\nThe built-in `edit` matches `oldText`/`newText` exactly. When the model can't reproduce the source verbatim — wrong indentation, a non-unique snippet, or a line that drifted since the read — the edit fails and you loop. Hashline sidesteps all of it:\n\n- **No string-not-found loops** — you edit by reference (`LINE#HASH`), not by retyping the line you want to change.\n- **No whitespace battles** — the new content is the only thing you type; nothing has to match what's already there. Indentation mistakes on the *old* code are impossible.\n- **Unique-by-construction hashes** — the line number is folded into the hash, so identical lines (blank lines, `}`) never share a hash and never collide.\n- **Chain edits without re-reading** — a successful `edit` returns fresh anchors for the lines it produced, so the next edit cites them directly instead of forcing a full re-read.\n- **Grep-to-edit, no detour** — search results carry the same `LINE#HASH` anchors (grouped by file, context lines included); grab one and edit directly, skipping the read you'd otherwise need.\n- **Surgical drift detection** — each cited anchor is rechecked against the current line only; an unrelated change elsewhere never blocks your edit.\n- **Self-healing stale anchors** — a drifted anchor (content shifted by an edit above it) doesn't force a full re-read: the applicator rescans ±lines for the original content and hands back a fresh `LINE#HASH` to retry with, only asking for a re-read when the content genuinely changed.\n\n## When to use it\n\nRoutine local code editing in pi — the common case. If you spend turns fighting \"old_string not found\" or fixing indentation the model dropped, this is the fix.\n\n## When to turn it off\n\nSet `hashlineEdit.enabled = false` (or uninstall) to fall back to the built-in `read`/`edit`/`grep` when you need **remote or custom-storage files** — the overrides read/write/search the local filesystem directly, so pi's custom `ReadOperations`/`GrepOperations` (SSH, etc.) aren't supported. The same switch lets you opt out per-project. All four tools — `read`, `grep`, `edit`, `replace` — are one set governed by this switch: when disabled the extension registers none of them and pi behaves as if it were not installed (reload pi after changing the setting).\n\n## Model Compatibility\n\nHashline replaces the edit protocol the main model was trained on, so real-world reliability depends on the model more than on anything else. Field observations from real sessions, one family per subsection (June 2026, single environment — directional, not benchmarks; vendors iterate fast, re-test on new releases).\n\n### DeepSeek family\n\n**Avoid — silent corruption.** Weak tool-call construction (tested: DeepSeek V4 Flash): ~50% of edits fail on the built-in string-replace, and each fix takes several more rounds — string-replace failures are *divergent*, the model retries from the same wrong memory, but at least they are loud. Hashline's rejected anchors *converge* — a mismatched anchor returns the live content plus a ready-to-resend `LINE#HASH`, so one retry closes the loop — but the raw failure rate is high (~80%), and hashline adds a failure class the built-in edit doesn't have.\n\n`insert_after` semantics invite wrong parameters even when the tool call itself is well-formed: the model fills `body` string-replace-style, copying the anchor line into it (observed on DeepSeek V4 Flash). The toolcall verifies and succeeds, and the line ends up duplicated. Nothing at the tool layer can catch this — the anchor is valid, the model's *intent* was wrong, and no prompt wording cures it (the schema description already forbids the copy). For a weak model, hashline effectively trades loud failures for silent ones: files come out corrupted edit by edit. Keep the plugin off for this profile; if you must run it, review the diff after every edit.\n\n### Kimi family\n\n**Turn the plugin off.** Strong, but not trained on hashline (tested: Kimi K3): built-in string-replace is excellent while hashline draws frequent anchor mistakes. Hashline assumes anchor discipline — copy hashes verbatim from read output, never invent one; a model that hasn't internalized that fabricates anchors no matter how capable. When a strong model keeps hitting anchor errors, the fastest fix is disabling the plugin, not more retries.\n\n### GLM family\n\n**The intended pairing.** Strong and follows the schema as given (tested: GLM 5.2): the occasional not-found / whitespace friction of built-in string-replace disappears — 100% in testing. Capable models never needed the wording in the first place: GLM used `insert_after` correctly even when the tool description didn't explain the op at all. The mismatch lives in the model, not the tool.\n\n### GPT family\n\n**No reservations.** Structured ops are home turf for this family (tested: GPT 5.6 sol/terra/luna): no fabricated or mistyped anchors observed, and `insert_after` was never misused — the anchor-line-into-`body` duplication (see DeepSeek above) never occurred. The few rejected anchors were the *expected* kind: a size-changing `edit` invalidating the hashes of the lines below it between edits — the documented hash-drift tradeoff rather than a model error, and exactly what the self-healing rescan exists to rescue. Even those ran fewer than expected; small-sample observation, take it directionally.\n\n## Gotchas (vs. the built-in `read`/`edit`)\n\nOnce hashline overrides the built-ins, a few things behave differently:\n\n- **`read` is globally overridden.** Every read shows the `LINE#HASH│` prefix on each line — even reads that won't lead to an edit. This is expected (it's the substrate the reliability is built on), just don't be surprised when the format changes for all files.\n- **Conservative overlap.** Two ops whose ranges touch (e.g. `insert_after` immediately followed by `replace` at the same line) are rejected to avoid backfill ambiguity — issue them as two separate `edit` calls.\n\n## `replace` — bulk + regex\n\nA separate, location-blind tool for transforms `edit` can't express: replace **all** occurrences of a string/regex across the whole file in one call. Use it for renames, normalizations, and pattern-based rewrites that would otherwise need many individual anchored ops.\n\n- **Two modes** — `regex: false` (default) treats `find` as a literal substring (replaceAll; the replacement is inserted verbatim, no `$` expansion); `regex: true` treats `find` as a JavaScript pattern source and `replace` supports `$1`, `$2`, `$&`, …\n- **Flags** — `flags` adds regex flags in both modes (`g` is always forced so every occurrence is replaced): `i` (case-insensitive), `m` (per-line `^`/`$`), `s` (dotall, `.` matches `\\n`), `u` (unicode).\n- **Safety** — a `maxMatches` cap (default 2000) errors *before writing* if exceeded, so a runaway pattern can't produce a catastrophic write. `0` matches is an error (no silent no-op).\n- **Shares the edit queue** — `replace` and `edit` on the same file are serialized via the same mutation queue, so concurrent edits never interleave.\n- **Returns a diff + fresh anchors** for the changed region, so a follow-up `edit` can chain on the new content without a re-read (when the region is small).\n\n`edit` vs `replace`: `edit` is **surgical and verified** (you point at a `LINE#HASH` and the tool confirms the line is unchanged before rewriting it). `replace` is **global and unverified** (you give a pattern, it rewrites every match sight-unseen). Pick by intent: change a known spot → `edit`; transform every occurrence → `replace`.\n\n## Design\n\n- **Per-line hash + line number, dual anchor**: `read` shows each line as `3#aF3│code`; `edit` references `LINE#HASH`. The line number is the address; the hash is a checksum that the line at that address is still what was read.\n- **Line folded into the hash**: each line's hash mixes its 1-based line number into its content, so every line is unique by construction — no in-file collisions, no length extension. The hash changes only when the line's own content changes, never when a neighbor changes.\n- **Live, surgical verification**: at apply time each cited anchor's hash is recomputed from the current line content and compared — no stored snapshot, no whole-file stale check. A line that changed (or was misremembered) fails its own anchor; an unrelated change elsewhere never blocks the edit. No fuzzy matching, no boundary repair.\n- **Shifted-anchor recovery**: a mismatched anchor isn't a dead end. The applicator rescans ±`shiftRadius` lines for the original content — holding the original line number fixed and re-hashing each candidate (`hash(line, candidate) === cited` iff the candidate *is* the original) — and returns a ready-to-resend anchor on a unique hit, the candidate list when ambiguous, or the cited line's live content when nothing matches. The model retries without a re-read in the common drift case.\n- **Atomic batches, all failures collected**: every op in one `edit` is verified against the same snapshot; if any anchor fails, *all* failures (each with its recovery) are returned together and nothing is written — partial writes would shift lines and invalidate the very recovery info just returned.\n- **Chain edits without re-reading**: a successful `edit` returns `Updated anchors` for the lines it produced (and the line that shifted into a deletion gap), so the next edit can cite them directly.\n- **Byte-faithful writes**: `edit` rewrites only the lines you name. CRLF files keep CRLF, and a file whose last line has no terminator does not gain one — the state `splitLines` discards is captured before the edit and restored after it. `read` states the fact in its header (`· no trailing newline`), since the numbered rows cannot show it.\n- **No legacy compatibility on `edit`**: `edit` accepts only structured hashline ops; sending legacy `oldText`/`newText` is rejected at the schema layer (never silently degrades) — so you always know whether hashline is actually in use. Bulk/regex replacement is a *separate* tool, `replace`, not an `edit` mode (see below).\n\n## Why line hashes, not file tags\n\n### The short version\n\nThis plugin is a line-hash editor: every line comes back tagged with a content hash that folds in its line number, and you edit by citing that `LINE#HASH`. That is, deliberately, the *original* hashline idea — the one omp shipped in February 2026 and then walked away from. omp's current engine anchors on a **whole-file** hash instead, and has since mid-2026. I looked at that route and stayed on the line-hash one on purpose. What follows is my case for that choice, stated as a tradeoff rather than a verdict — the honest limitations, including the ones that argue for the other route, come right after.\n\n### Where this comes from\n\nThe idea that a model should edit by pointing at a **stable, verifiable anchor** instead of retyping code it already saw is not mine — it is can1357's, argued in [*The Harness Problem*](https://blog.can.ac/2026/02/12/the-harness-problem/) (2026-02-12), and omp's first implementation was exactly this shape: every read line tagged with a short per-line content hash, edits expressed as structured `old`/`new` ops. That first design had a real problem, and omp and I fixed it in opposite directions.\n\n**Identical lines collide.** A per-line *content* hash gives every `}`, every `)`, every blank line the same hash — and a hash that is not unique is not an anchor. omp's fix was to stop hashing lines and hash the **whole file** instead: a 4-hex file tag, with no per-line hash in `read` output at all. My fix was to fold the line number into each line's hash, so two identical lines at different positions can never share one — unique by construction, no file-level state required.\n\nThat single divergence cascades into everything else. (It also means the picture most people have of \"hashline\" is the line-hash one: omp's own docs site still describes per-line anchors that its current implementation no longer emits.)\n\n### The case against the file-tag route\n\nI can't speak to omp's motives for the switch — collision-proofing a per-line hash is hard, and the file tag sidesteps it entirely. But the clearest *payoff* I see in a whole-file tag is one my design gives up: **awareness of edits made by anyone else.** If another process touches the file, its whole-file tag changes, the next anchored edit is rejected, and the model is forced to re-read fresh state. For a swarm of agents editing one tree, that is a genuinely good property. It costs three things I wasn't willing to pay:\n\n- **The tag can't tell whether the model actually *read* a line.** A whole-file hash proves the file is byte-for-byte what it was — not that the model ever saw the specific line it is now rewriting. To stop hallucinated edits on never-displayed lines, omp carries a separate `seenLines` guard alongside the tag. A per-line hash *is* the proof of having-seen: you cannot cite `LINE#HASH` without having read that line's content. No side array needed.\n- **It needs out-of-band state.** A 16-bit file tag \"is not meaningful outside that store\" (omp's own words) — it can collide, so omp keeps a `SnapshotStore`, an LRU of recent file versions, to disambiguate. My hashes are content-derived and self-contained: an anchor is verified by rehashing the current line at that number, at apply time, against nothing but the file on disk. **This plugin has no SnapshotStore, no seenLines array, nothing to keep in sync.** That is the point, not an omission.\n- **The verification is coarse.** A whole-file tag couples every edit to the entire file: an unrelated change *anywhere* invalidates the tag and drags the whole patch through recovery. Line hashes verify only the lines you cite — an unrelated edit elsewhere never blocks you.\n\n### Why a JSON schema, not a text DSL\n\nThe other visible difference: omp delivers edits as a **text patch language** (`PUT`/`CUT`/`REM`/`MV` today, `SWAP`/`DEL`/`INS` before that, JSON before *that*). This plugin uses **structured JSON ops**. Two reasons:\n\n- **Validation belongs to the tool, not the model.** A JSON schema rejects a malformed op at the parameter layer before any logic runs. A text DSL puts the burden of emitting exactly-correct syntax back on the model, and the error rate is high enough that the DSL route accretes layer after layer of lenient parsing and heuristic repair to compensate — omp has shipped both, including a documented incident where the repair silently dropped content. The whole reason to anchor by hash was to stop depending on the model reproducing text perfectly; a hand-written DSL quietly reintroduces that dependency on the other side of the call.\n- **The token savings aren't worth it.** A DSL saves a handful of structural characters per op. Against a higher malformed-edit rate and the cost of format churn — omp's patch syntax has broken compatibly five-plus times, stranding third-party ports on dead dialects — that saving is noise.\n\n### Compared by capability\n\nNot by version: omp's later generations refine the same whole-file-tag core, so the real comparison is *line-hash route* vs *file-tag route*.\n\n| Capability | This plugin (line-hash) | omp (file-tag) |\n|---|---|---|\n| Anchor identity | per-line `LINE#HASH`, line number folded in | whole-file 4-hex `#TAG`, bare line numbers |\n| Identical-line collisions | impossible by construction | n/a (no per-line hash); the file tag itself can collide in 16 bits |\n| Out-of-band state | **none** | `SnapshotStore` (LRU) + `seenLines` guard |\n| \"Did the model read this line?\" | proven by the anchor itself | needs the separate `seenLines` array |\n| Verification granularity | only the cited lines (surgical) | whole file — any drift enters recovery |\n| Concurrent external edits | not a goal; re-read to proceed | detected by design — tag change forces a re-read |\n| Wire format | JSON schema ops | text patch DSL |\n| Malformed edits | rejected at the schema layer | lenient parsing + heuristic repair |\n| Format stability | one schema | ≥5 breaking format generations |\n| Drift recovery | ±15-line rescan → fresh anchor, else re-read | line-remap replay, fail-closed |\n| Expressiveness | fine-grained ops + separate `replace` | syntax blocks, cross-file registers, `REM`/`MV` |\n| Read-time token cost | 2–4 chars per line | none at read time; cost moves to mismatch output |\n\n### Honest limitations\n\nIncluding the ones that argue *for* the route I didn't take.\n\n- **Hash drift after an edit.** Because the line number is part of the hash, inserting or deleting lines changes every subsequent line's hash. A successful edit hands back fresh anchors for the region it just produced, and the ±15-line rescan rescues nearby drift — but to cite lines well below a size-changing edit, you re-read. That is the price of stateless verification: I keep no snapshot that would track those shifts for you. I consider it a fair trade for having no out-of-band state to corrupt or resync; a clean core matters more to me than saving a read.\n- **No multi-agent story.** If several agents edit one tree, the file-tag route's external-edit detection is a real advantage this design does not have.\n- **Hash transcription is itself error-prone.** Anchoring assumes the model copies the hash verbatim. It doesn't always: *\"It sees `483:d4` in the input, writes `483:3a` in the output. Every model does this, including Opus.\"* ([geometricagi, *AST Edits*](https://geometricagi.github.io/2026/04/02/ast-edits.html), 2026-04-02). This is a failure class the built-in string-replace does not have — see Model Compatibility above; on a model that hasn't internalized anchor discipline, turn the plugin off rather than fight it.\n- **The edit format may not be your bottleneck at all.** An independent benchmark ([nwyin, *edit-bench*](https://nwyin.com/blogs/hashline-vs-replace-edit-bench.html)) found the hashline-vs-replace delta to be language-dependent — a real penalty on Python, neutral on TypeScript, a wash on Rust — and concluded that *\"edit format is not the bottleneck\"*: model-to-model differences dwarf format-to-format ones. It also found that the whitespace near-miss anchoring is meant to kill barely occurs — fuzzy matching triggered 0 times across 114 successful edits.\n- **A silent success is worse than a loud failure.** Any anchor scheme is only as safe as its implementation. opencode's early hashline port returned `Updated` while writing to the wrong line ([issue #15424](https://github.com/anomalyco/opencode/issues/15424)) — a buggy anchor check manufactures false trust. This plugin's recovery is built to fail closed and hand back live content instead of guessing, but the warning generalizes.\n- **Model dependence is real and not universally in my favor.** omp routes kimi, mimo, deepseek-v4-flash and step-3.7-flash *away* from hashline by default (they miscount anchors or drop the tag header). My own field notes agree on Kimi and disagree on DeepSeek — same model, opposite conclusions in different environments. There is no globally best edit format; there is a model × task × implementation triple.\n\n## Protocol\n\n`read` output (each line anchored by default):\n\n```\nsrc/foo.ts · 6 lines\n1#aF3│import { compute } from \"./util\"\n2#7Qk│\n3#mP0│export function foo(x: number) {\n```\n\n`grep` output (results grouped by file, each line anchored by default — copy `LINE#HASH` straight into an edit):\n\n```\nsrc/foo.ts · 2 matches\n3#mP0│export function foo(x: number) {\n4#kLp│  return x + 1\nsrc/util.ts · 1 match\n10#aF3│  const z = compute(x)\n```\n\nBoth `read` and `grep` accept `anchored:false` for a read-only model view. That\nview keeps line numbers and source indentation but omits the `#HASH` portion,\nso it cannot be used to construct `edit` anchors. The TUI display is unchanged\nin style: it renders from a structured snapshot, so unanchored output may show\nmore lines when the smaller model representation fits within the output budget.\n\nThe `grep` override also covers the compound queries that otherwise push models into bash pipelines:\n\n- `matchMode: \"all\"` — a line must match **every** pattern (`grep A | grep B` without the pipe)\n- `excludePattern` — drop matching lines (`grep -v`), applied after pattern matching\n- `wordMatch` — whole words only (`rg -w`)\n- `outputMode: \"files\"` / `\"count\"` — just the file paths (`rg -l`) or per-file counts + total (`grep -c`); `\"files\"` output pastes straight back as a `path` array\n- `pattern` and `path` accept arrays — several patterns combined per `matchMode`, several search roots in one call\n- `glob` accepts one pattern or an ordered array of ripgrep globs, e.g. `[\"*.ts\", \"*.md\", \"!**/*.test.ts\"]` to include TypeScript and Markdown files but exclude tests. It also filters explicitly named files; this requires a locally available ripgrep binary.\n\nFilters run before the match limit counts, and context windows are rebuilt from surviving matches, so `limit` and `context` compose cleanly with `matchMode`/`excludePattern`.\n\n\n`edit` takes `path` + `edits` (an array of ops, each with `op`, `anchor`/`end` `{line, hash}` from read, and `body` string[]):\n\n```jsonc\n{\n  \"path\": \"src/foo.ts\",\n  \"edits\": [\n    { \"op\": \"replace\", \"anchor\": { \"line\": 4, \"hash\": \"kLp\" }, \"body\": [\"  return x + 1\"] },\n    { \"op\": \"insert_after\", \"anchor\": { \"line\": 6, \"hash\": \"b2H\" }, \"body\": [\"\", \"export const bar = foo\"] }\n  ]\n}\n```\n\nOps: `replace` · `delete` · `insert_after` · `insert_before` · `append` · `prepend`. `anchor`/`end` = `{line, hash}` from read; `body` = new content lines (non-empty string[], omit for `delete`).\n\n`replace` takes `path`, `find`, `replace` (+ optional `regex`, `flags`, `maxMatches`) and substitutes **every** match:\n\n```jsonc\n{\n  \"path\": \"src/foo.ts\",\n  \"find\": \"oldName\",\n  \"replace\": \"newName\"\n}\n```\n\nRegex with a capture group (rename `getName()` → `get_name()` everywhere):\n\n```jsonc\n{ \"path\": \"src/foo.ts\", \"find\": \"get([A-Z]\\w*)\", \"replace\": \"get_$1\", \"regex\": true }\n```\n\nCase-insensitive literal rename across the whole file:\n\n```jsonc\n{ \"path\": \"src/foo.ts\", \"find\": \"TODO\", \"replace\": \"FIXME\", \"flags\": \"i\" }\n```\n\n## Configuration\n\nAdd a `hashlineEdit` field to `~/.pi/agent/settings.json` (global) or `.pi/settings.json` in a project (project replaces global):\n\n```jsonc\n{\n  \"hashlineEdit\": {\n    \"enabled\": true,     // set false to disable the extension entirely (built-ins remain; reload pi)\n    \"hashLen\": 4,        // hash length, 2–8 (default 4)\n    \"shiftRadius\": 15    // ±lines scanned to rescue a stale anchor (default 15; 0 disables)\n  }\n}\n```\n\n## Installation\n\n```bash\npi install npm:@d3ara1n/pi-hashline-edit\n```\n\nOr add to `~/.pi/agent/settings.json`:\n\n```jsonc\n{\n  \"extensions\": [\n    \"/absolute/path/to/pi-extensions/packages/pi-hashline-edit\"\n  ]\n}\n```\n\n## Dependencies\n\n- No additional `@d3ara1n/pi-*` dependencies; peer `@earendil-works/pi-coding-agent` ships with pi (framework-level, not listed by convention).\n","readmeFilename":"README.md"}