{"_id":"infinity-harness","_rev":"36-2cfcdf201f320be505a0952d7c62883e","name":"infinity-harness","dist-tags":{"latest":"2.8.14"},"versions":{"2.0.0":{"name":"infinity-harness","version":"2.0.0","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.0.0","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"383134ac6eefeb510ee7eeb6fbf842456ac63cd6","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.0.0.tgz","fileCount":80,"integrity":"sha512-elpkJ1nTSOMYQzMVCuLiSLYycpn4P6wdU06FVjumPMDwO92K6+l2R4yLAeaE9OuPU2gQhLzqFeFS7oZR4Nn8bA==","signatures":[{"sig":"MEUCIQCOHq/uZVyu7fViw9UcQZyVh4Pva1QjTxBGfNfOz+jJCAIgODm1CS5NDa4kmLo/tQt0ZSforgh4Zm6afy39mS0sZ6A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":477819},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"b2a7d9e197656b96d171564bb94296c502cb2e73","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.0.0_1787497805476_0.9712291511813951","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"infinity-harness","version":"2.0.1","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.0.1","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"7b52e68deb27a02fd0ad778d4b03344be273a34e","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.0.1.tgz","fileCount":81,"integrity":"sha512-Ou4yiZMR3deirmqiS9pNMVNrMnkfNbrq8EqH+sX+qPqzYo/WWzc92b+SywcFIhdZLmkMkMrmT8tRlBel/Lhmew==","signatures":[{"sig":"MEUCICq+BPO9RZANw9UBgY5JuHwdcn1fMt6geftsl8hZA3BLAiEA1LVkcc0JXbTlOdi22uBDOqvDIK3qHBPTsmGrSaofy/A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDqigSUVJMAC8t3kBMnW/wylNIM8216PA/iUHPo8wSEsQIgWqABFm9v9ZaIx2VcIEKGkiLf0nXi5n1L+sdLHzfWJ4Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":505976},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"5d2ea8d8fcda77af046e13c2dcf3dd1744431fa6","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.0.1_1787500188241_0.357339085787453","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"infinity-harness","version":"2.0.2","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.0.2","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"64ba6a45c7747d7f37b236859522ace802c232cd","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.0.2.tgz","fileCount":81,"integrity":"sha512-E5urJb5jIDsioMRXx+FJVSBR2/I1IKCJ4XUPSdSC4zwu4p6SjMOVdLxPG2vYaeMw8lUCPpU965Qi2jb0z2LUxQ==","signatures":[{"sig":"MEUCICdAReLAtxCGp8wss2OhiHWyOnWdRRAIhHLDeVN8PZ/uAiEAuK6EiWIpK2V/4mEGgQfwFCkiG0v3PMij7eQP7oStcJk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCezVJbTFfN52LCpkHGuSUq4FIjgVtCa9NOYKHScEp1GwIhAITv10yPjsP9ibhMSswc05jBJXaCFbW+SEQ36OdWzPp4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":508542},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"25a96a0070304dd310a842ad95ad667148bd149c","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.0.2_1787501040500_0.08439131474509454","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"infinity-harness","version":"2.0.3","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.0.3","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"f6c0e68094b7f959d18538e348dbcdbbcb0288ed","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.0.3.tgz","fileCount":81,"integrity":"sha512-VG5Hfvo2YfHcg6NDO3lEibJKiYlUVW2qEDvhRZIDKiRmE5NAu+c4rx/yxH5ryQekelVM3b0aJG6cH6tNxzpFZw==","signatures":[{"sig":"MEUCIEWBFzh/rj+LXGtdnhjtxy71FKQMwNFYuS/OTYUKnuYkAiEA3lXSOXu+DWt03XNVtimbX/6SakvpThom1ueArHA+7Dg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCa7l3q04jV/ytM3ka3JsJbJAXMaxBqY78VfogtcWG8lQIgNGfK9XPeveCxJwE8BOjcMGV7ii7D90rS4EYA/QxvoBo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":509060},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"89354ffd80f2a08ec831d3091d231a787ba0d9f1","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.0.3_1787501075730_0.1638554889619599","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"infinity-harness","version":"2.0.4","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.0.4","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"3ef46ac340e18339ed3681d84f4f8cdbfe4135f7","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.0.4.tgz","fileCount":81,"integrity":"sha512-1F+shvtdbo8CwF/5GO4zfoCyagU9Q9Se5G+IMiGOezlj14eKs83IlFK8mjk0fXbJPI9MhNiHZDkqTwtHbKdHYw==","signatures":[{"sig":"MEUCIQCKJTOJYzZyfgQ1J7LBZpfiJhOi/UiGaOLtr2Zk/e4hUQIgPLFtDjEg3INeRs2FCI5SFkTbl1b0MCn0DKmaXPxlFiQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEA7v3sJr2GOlqrh+2XEugOUXBvUQDYzAKylTtCjZk2FAiEAqQlPat8fOgQw2HHAFa+oS9DL62ygSjVdSyK3KvEGdWY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":509805},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"588e51424cb373300d1db16224b6d447f6c64b72","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.0.4_1787501681277_0.2914972400290645","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"infinity-harness","version":"2.1.0","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.1.0","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"5a45e184a470f18ffe456fe31bf0ed9df56a778b","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.1.0.tgz","fileCount":82,"integrity":"sha512-/cBt3tYt5A/h0HvaOYRQJ/rTei494oouobrc+6XJfrOjyIq1PGOhHY5aWK//ohA9i8iuWKdn7cdwAGbKuM+jUw==","signatures":[{"sig":"MEUCIQDfft6fee1sEDvnEPCjP5ZT+16uNh3mV7x5USZj5ECilwIgYwGRnIAHp8sUKYOVbEjJpMIo3MWiix15IDrTPK4Lb1Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDY7vjos5tY5AGoFG4yUq7kE5RgH4cpzcrsVxVBp/KGCwIhAJu6pufb5YjJoXrExyVYh4w8go3CIuw9ChdJ1FMr+BQ+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":541781},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"b24e098d36d7e168afb8e03c230ca89548c0aa15","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.1.0_1787526861769_0.15131837284051097","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"infinity-harness","version":"2.2.0","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.2.0","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"c077d53e5b5ddb53a483888b8fbb5a9a642bef08","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.2.0.tgz","fileCount":84,"integrity":"sha512-63KI/eHSrKsFL/HThQYUg934OXpQipWknitzZpLvFy1s+o4vlRWnTcZrPJovpH/OH0kr4IjfZtJE9H/Fc4j1lQ==","signatures":[{"sig":"MEYCIQDaHjvt2+KI4u14agHDEKC1sf5aBcrUgKyLbEj+hnj2ngIhALBbwr0bB20Oab6lhECGv1WcIRppaWEp1MZHvHPkXffh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFtP0j4kKa+T4SFmRL/HwS5rcliCmTlhNuiqAIDwsuPGAiA5HNfI1+UTX9TofwgPdfAPTtoB25Smedr/fgUFllS8pw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":609142},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"54557f39aa21bc2c64de9a5d3221f737d7bb4fe1","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.2.0_1787529026310_0.2846290664469284","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"infinity-harness","version":"2.2.1","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.2.1","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"fd54d5d71e781ee51b0aba7b5b54b1d1f2c72681","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.2.1.tgz","fileCount":84,"integrity":"sha512-tWI05NvpxaSD9ANSrUi1MVYw4d6rHNvKAm6Q/zN7uJ6vbx8rpbzqbI45ZEOrcvbJvW8eciMphwy8HBRcSsmgSA==","signatures":[{"sig":"MEQCICskWdDpOfkie932d3WEXFwfXF9+njaU4Y2pKq3Zn1s+AiB3IAyeEPwk0vGmbCVhr6kWxUCrRPAsibZHQWayHUt+6w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEFes0BxcJ0ASMPef8Y71i4JcRXtOeZXtdHeow2uuMGHAiAi9l6I1/Vnve4e6lzV2qemHFDbAiC3Ujui6KI6SyyW1g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":610543},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"06566d399f72759a8a1dbacc7288652ce751749e","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.2.1_1787529342678_0.5635079240453313","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"infinity-harness","version":"2.3.0","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.3.0","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"da1240cfc7d9ec22dc3ec31b5222e6a5f0083828","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.3.0.tgz","fileCount":92,"integrity":"sha512-a8wulCpSzZyz/IoiQSpyq/OFszlnKsWWmnvjjhYYbb/qhvOvtcAothQ+h/cWvGjmtTEIeoyplhqQEvIRB63kGg==","signatures":[{"sig":"MEYCIQCbzFLgV3iN/1YmIxCte7dREEma0qT9zadRVBQII6pw3wIhAPd6BG2LNYEXgnjdg3DYAXlg90bCgSlVIE+xU8KhXyn2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDKC3tVyOcwhfV0osxxEE+FiCz1ZKg9k/mruouRiAyqyAIgM5SrwjmytEg40MVdbzNpflRhJ2A7l+Fw8NB3Z7zKtUs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":731686},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"a2753badc08bd929ddc6a09292dfb8373377ac6e","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.3.0_1787570465711_0.6802600758385362","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"infinity-harness","version":"2.3.1","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.3.1","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"40c3901db682c2ef7a5565c243e78b1832a86f84","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.3.1.tgz","fileCount":92,"integrity":"sha512-nI0uWnMe+lNjFKKqgROC0Wz+t2sG1CyU2yF2k5JpD7PY4Pfc25FQtkmSpQ0TF6yv2YH8uzWzDsWxsjdn2fMnqw==","signatures":[{"sig":"MEUCIA59l2CPmwMVuTDo24//+9pZtmPsrNWANiX+dumsdBT5AiEAl/i9AwjO31qTWgIoC9K8dHJDpVyHGVlPCRjGCugS+Ok=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDvJeJ2Hw20DqLZG4FRJajAHXFQ8BRXkBhrkuxGi31d6wIgBwS8V9dAxRoujdQvvOjnBy6r2RSIvYcgYjCeKtAIkKc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":734270},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"db3a5e37ee125fd80f5d6dba893fa3a0d5504ec5","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.3.1_1787571329561_0.02756712878879375","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"infinity-harness","version":"2.4.0","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.4.0","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"193636c0b3bdc8bd10ad69671b4894c22765b725","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.4.0.tgz","fileCount":94,"integrity":"sha512-SrvP3TzfzyKD+AbS2/31lqEBhFJY0F8bW9f7N/daGk0FV+ivrXNC+4A1sIpegr4zCNkAtxre5nfJUfKns4hmjQ==","signatures":[{"sig":"MEUCIQDQ7o42sdqJdLBPXjGc+su6pB1dkWq49U4gwcjjopWuBwIgPyVbua8yYWL9XrGvjR2qoXgkZWLJbFjoqFDrGaWgMDk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDNIXwcSU2d2DTLdwVQSiI8xqdt7ZoePs4LGHbNr5oxmgIhAMisS1U8w44jgSkQcwhcT5wLnwTM2r9Nw8TmdVkKClRT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":791320},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"4174d461efd724578fbc63eac705f8124c5baeb1","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.4.0_1787575419926_0.6680824241099068","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"infinity-harness","version":"2.5.0","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.5.0","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"663c0a4092c8d20d8c0a3490c091bde993ed24a4","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.5.0.tgz","fileCount":94,"integrity":"sha512-5XiMdOu1B8ClcwBwiEAaaUq5i14XVrP0Sh5TmkE2C1jlA+wQL2xPI7/0dkO0gJ+7bhEuWkzVbnYf2YbfIu7JPw==","signatures":[{"sig":"MEYCIQDtywmO61uIXIA9xjMb+vfwmCVJpWeW6hETtEpkD4tWMAIhAKGRlPeqxOC9sxZnW464axMaMPXNGiOnQtKzt0Pup/OM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDFWpjRYOoty140Cxk3FnXXbAzJdIJkVk4fhnumZIJ3yAIgAPLMDDSpNVoc48jRC3iJU/hyvVZejH0OZCOjC4OI/Ts=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":818284},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"14a1d2ad30943577234a8ee35236281fc0a69d10","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.13.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.5.0_1787635845679_0.3721990644557669","host":"s3://npm-registry-packages-npm-production"}},"2.5.1":{"name":"infinity-harness","version":"2.5.1","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.5.1","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"022badd4d68fdf8475fcec9dedeb32250da42bda","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.5.1.tgz","fileCount":94,"integrity":"sha512-Dn0U0hCpiNNY9aH4+kIhZdJu22IKtVzvwKkIscaAVye2XNKybEoLs+2t0DRv9rFDdv/CUSAkyb1PETc9dbVeRg==","signatures":[{"sig":"MEQCIBbKQqkzO6pHTa9J6esEuGjT8DilSVqrTj3J6Gjnn62cAiBudGuAHtdhcwVkOM5WlQFqHOcUT8y2S4iwjrGzmzEthA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCULmzF2cHlLNfRAuNaZ7KP9RQBeV77iiGyBbtqXOJ0CwIgb3ddVM6Prh1L2GkHZ287T27Lzqx18V6/JMiRV3JJ1Hg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":827172},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"dc59fd3dd5e2c9a26cb9da5d8dac7e6d099822c0","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.13.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.5.1_1787648076710_0.9629307545416101","host":"s3://npm-registry-packages-npm-production"}},"2.6.0":{"name":"infinity-harness","version":"2.6.0","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.6.0","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"e39a1262368042dcf96a5b89e02b19251f3263bc","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.6.0.tgz","fileCount":96,"integrity":"sha512-DDYEqfjEuFVVUgnWOq8MW/bqwIPmc/Zv6MDITKU7D6jtirU2RE/zl54e+KpsoThbJrrwHHn/tn9UFhwkm1qzzA==","signatures":[{"sig":"MEQCIGJo24INMg6BSTWEMoCaU4HkPfie3Nu0utED7dpAVFWeAiBa+lkRLR5nBm9uJwSi1xMiqnYmJUoM3CGzRxqz3UNl5g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDf9jVlTMr5MkOJAAFDzjWtgGL6dyMTcxK3Q37BlxNjnAIhALKddJHZ5xqqdA5eoGuHHL5ETEwpk1tAQ6owR7YI4ImF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":879025},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"4b504fadb22c701d00ac1235dfaad4cd5a0bb545","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.13.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.6.0_1787664154047_0.25136980237901096","host":"s3://npm-registry-packages-npm-production"}},"2.6.1":{"name":"infinity-harness","version":"2.6.1","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.6.1","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"8c4c4db1d11fa05699027f7a39c1f03884558582","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.6.1.tgz","fileCount":96,"integrity":"sha512-aDFnAE3dyN/SJB+4mXqDtRmpXea0F8v6dyDfn5L9IBbXO/Ma60V2uF69UMvxYvjtcvShzpjP6GTlUuqSwtPXkA==","signatures":[{"sig":"MEUCIFvh+p+jC4YZly8GSW7pLzXMXZMjsU5L3jPm5xPKErtjAiEAzxcV3mHTOeoh4DBXlIRagVfP7jy2weFGTBq5sKg3mzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDdsv1x/scpDV3m++USO5HdsrMm3Y3GW2jNZF6HMIJmewIgcHnfDr2YYZyMa2mdR8/CSdTfxXaRE+xcaNT8zwVHBcI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":886209},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"c3a783213c401a311c5f61829dad7c5300af0bda","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.13.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.6.1_1787667562896_0.502248300801815","host":"s3://npm-registry-packages-npm-production"}},"2.6.2":{"name":"infinity-harness","version":"2.6.2","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.6.2","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"51fa6216bf294890cbd29ed53e51147db671a988","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.6.2.tgz","fileCount":96,"integrity":"sha512-2xBqmYlEjwvF9NpcAUMFS4q9nSqtpbn/cyRdnSupifrndmwY2eDLyBwyt+rqpzAZ/JpWv0zB9zEHc7fYjZTLnw==","signatures":[{"sig":"MEUCIQCOKAN5DAPX1MWKDRBMf133B3aFNlQUh4IUF6aZuqjxnQIgDSAGwgw6zjcUvnOkLAE//fIM9BFSsmqiUF6h8UcaO/A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDxGt63gFGkVt6DS3w9+phJ2eWPGSDZMOFZMr0Fg4FqRAiEAt/PAnGclJcENFqZcINzR3v8q2c5p4eVaZCEZMTmD/E8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":886449},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"2dd26c00aaad442c2a17d380acfea66902cd0dc5","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.13.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.6.2_1787667672945_0.5762545437750097","host":"s3://npm-registry-packages-npm-production"}},"2.6.3":{"name":"infinity-harness","version":"2.6.3","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.6.3","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"58834c01b7e72dc23219d797b763d20569548a02","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.6.3.tgz","fileCount":96,"integrity":"sha512-+mVoGK4/nwOaJKHcqO9YxqGic76rHwUFfFcpNfr5QPP+mdOrNXp9DNIrb00jYLfmd1rKebK2ZrlP9Ie/DoEgBg==","signatures":[{"sig":"MEUCIQC6dxgomKWLzWvn2cOzvEQVKYQXzSRBRYzIg+hk/B6vjQIgMVsvTqi2GGjrX1RyvikcPw32BDfnIiaKOeOSHXyB0zE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDZPMBooS3Mw02Si6VCv3cbtUWcqx9pU6wdxK1WR3SXQAIgB1MQ6rsC863btB+NBu3C8c6IUnjOz8e1qgv9DeMlDd8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":888528},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"6e20b79a0b188a6ee8ecbeed770b074bdc7fdc95","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.13.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.6.3_1787745847524_0.15663467315749635","host":"s3://npm-registry-packages-npm-production"}},"2.6.4":{"name":"infinity-harness","version":"2.6.4","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.6.4","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"7407ff9c626bbf39f048cc1fad8d3c6e47340163","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.6.4.tgz","fileCount":96,"integrity":"sha512-PamtOrF3EZ3bG/jLjbVBPY3XCcIZ3oXf9jvO1+iJ/7bWHWDfAoRLKVrsof4794fysev+5WVJL2ZZ8paNe37DBw==","signatures":[{"sig":"MEUCIBQWDUe4ilXMzhAbULQF/ykOXP96Ym3qqfo6MjlSBN1PAiEAiZbmC6Z5QQYLPHhh+XfTJoobqGiKbYLTmt88dhBSkLY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICIfB5Xu3Yhj2D4Ddg400Lx1WdiWMz1lP54MIMzbo+xYAiBdCm7PKfInA+QEqCGjNQiYVnSPEKeF6H8lwhJseKpDew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":888905},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"ab36b789192f07f167300027250349db1a486924","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.13.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.6.4_1787784522144_0.08783208165617262","host":"s3://npm-registry-packages-npm-production"}},"2.6.5":{"name":"infinity-harness","version":"2.6.5","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.6.5","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"4e4c25c60b4a15a320e04c466cdd4a8b9da71128","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.6.5.tgz","fileCount":97,"integrity":"sha512-oXN3x1XcuLW6kEZswil5PrrrtYWiD3CExNQNyh+Dg9FxK5Mvv/1QytlP5R9OzLkNNB+q3fXI7uYBbZAqJ+q/1g==","signatures":[{"sig":"MEUCIB4Xj/eCgoGzLSETehWqKFiKWYPEYy2ITHH2H7el3JTwAiEA37q7/HoriRn1nnPKG0vs7I4e/K8XCaGHJryov+2ORYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDPFmEz7ddvhxMFD/33Oe18Y4SSHAAWqBOxFZaOfeidcwIhAMYwojyJCqU3yvk9X5ux0p9jdlluUrzZTSZkyAo3Vd1m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":911392},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"28ab4ac5933a4c18ed6f75546924a421705c9cf1","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.13.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.6.5_1787835088638_0.8618006981619075","host":"s3://npm-registry-packages-npm-production"}},"2.6.6":{"name":"infinity-harness","version":"2.6.6","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.6.6","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"11a964ce32f42a82e76c28657c5f26cbbd0637fd","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.6.6.tgz","fileCount":97,"integrity":"sha512-kNyqtRXUi4twTyfv9xgy3+QUP/2WqRl5rwtVF+9ijJbqVfBHGPUKeSa/Q2BRvCFwokF2cCfHoPK3pKcp3QGAcA==","signatures":[{"sig":"MEQCIAe5FUFJ3ReH/Nem25sHAwFPGWkHOpUEsZsErC+Wmdw5AiA5mJacfpZyLWpxahJ+QbHlStw6BkWuGwZxozjO0ze1Jg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIC9oITeAAlX0oEiBTFegazN7zW7J0wB4MXyjrX+/JNstAiBMB5yWZaRGCgSl8uo8ogn3TgiDsYle0KsPFP59s3PdGw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":921778},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"ee63f01669ceee62b630607416a35b66965ba19a","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.13.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.6.6_1787934104544_0.22106935558798502","host":"s3://npm-registry-packages-npm-production"}},"2.7.0":{"name":"infinity-harness","version":"2.7.0","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.7.0","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"3f93acfc8f78ebd53af0d8c1bcd4ad7df88a0d56","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.7.0.tgz","fileCount":99,"integrity":"sha512-xkdrpOdPBkqnHM4jOPY0D43Lmqq4pFZOlhnIa8F08Kcqb/8GmJMEPgN0qnwik+hNXi2P5BpbEVuyXvagga4tCA==","signatures":[{"sig":"MEUCIEgn3L0Cu4EjS42crHoD/+4bd0WoX8z3I79wba1y2Zw2AiEAuVg9J8s7DAYQEWQdCG5UgslXtLyKTtvWvTqs6NeovUc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAej8m1f/Js1yOZDZzXNEuD8hj+19Dl0vifsLrhMPndJAiB4UbsWbe4KExXsPWRaP3kgTqGT5G+CI9LqXnSOes3+2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1023431},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"992fe0bae0a74bdf244d7c0bb1be77d4c6d51ea7","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.7.0_1787979070698_0.675807641815769","host":"s3://npm-registry-packages-npm-production"}},"2.8.0":{"name":"infinity-harness","version":"2.8.0","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.0","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"aa57fefac15a0292756a593f1f8f6bcdc135890c","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.0.tgz","fileCount":112,"integrity":"sha512-LzOE12ppUdMGzrs4MzSl0xp9O+h6xPwbNk6Iu8dH2iI04jkpuhcf8S6VORi97Deeo94IGaSsioN0DYL62YnOpQ==","signatures":[{"sig":"MEQCID4BXrurDenJ25pyHpxauOlyTRyZir3F85Tvs8+K4/+qAiAszHKcIuXJgz4AiswmDU4vmBROv8ixodzXI1nx0HaQDA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCkwJijrwv7Z5vNqMExxRB9VQ1Ipzhdbb8t3ZOmaQktBQIgW1je1Q555inDdG9C+/3wJ9xR8cQIf97eOK+9DtRA0oc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1151721},"type":"module","engines":{"node":">=22.0.0"},"scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.19.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"26.7.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.0_1788059023800_0.5615257970502394","host":"s3://npm-registry-packages-npm-production"}},"2.8.1":{"name":"infinity-harness","version":"2.8.1","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.1","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"54eed1c28596c07772c224bba11b9f12a1007aaf","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.1.tgz","fileCount":112,"integrity":"sha512-Jh0cxGThDQAJ9douveZVhMPNCdxz8+OyQiFXSPHwhFsl4nZSECgSgmKjtj2fbls2FS8EWFZGrBwkxJ0NBxihKQ==","signatures":[{"sig":"MEUCIQDscU6aWvUzQE6Ev/wEaE6S6v/WEZ2dd81XZgFPF7s5OQIgaYcsGzSFiAsRbexuJFdk2sRZARBOzSP9akUBaFUKEBA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID44ltwrmR8Tbn/do61qeazBLcGXTNK8dG4kFBHBOuRaAiBvUC7BJRKs+AB8SqvAudTBpCZz33Dl+bNRbKSAjIJynA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1151721},"type":"module","engines":{"node":">=22.0.0"},"scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.19.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"26.7.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.1_1788061636384_0.13042332704804105","host":"s3://npm-registry-packages-npm-production"}},"2.8.2":{"name":"infinity-harness","version":"2.8.2","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.2","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"39fc1f39f666a4932613c2c7e2942e1eea62e796","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.2.tgz","fileCount":112,"integrity":"sha512-+fRhieFGyS2Y/FGoiovzuKwkLaueu8PZ039xkeliceFVai+RqQixY6t1i3Q3dd4+SJE+LBwQd4iAYiV0fQ1fhA==","signatures":[{"sig":"MEQCIHWNtzfqS5LC7c48PQtIDpDm1iJr2XQVxp/2NR8A+OvaAiAycc31KIWgXZ2pRTpdQY+LvOS+nF2XxKyzB2PbJytkRg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFNzUl7O8vG2ZgVjH5KCKrdJVfwypPCJszqDiqPPRwAuAiEAq/JAdj5/eJxCYTL240IkuptaVZaNJyzaG26PJCnfFso=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1158185},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"2a76f4a15a2009c5beb19bda7c94f6a6774b3038","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.2_1788082828948_0.6135865089109975","host":"s3://npm-registry-packages-npm-production"}},"2.8.3":{"name":"infinity-harness","version":"2.8.3","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.3","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"15ebd3e3eb4c0e816ad3693b386efd548e517478","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.3.tgz","fileCount":112,"integrity":"sha512-CyDeQiQTfwyPULiI0dEQJcMhs6ZGKuW9gcPvfraoUlbi3tuZbyKGR/1Ws1gkX8xXXMY2gYYTAEBj+OoWbm7ILw==","signatures":[{"sig":"MEUCIQCJtuqeIKl8a854ukdZQocRqhEd3vqiCyIcaxDXeQfUngIgFxLPn+6g0/6sUhcZMPid8GkE28OeTE9P7AeeGL6omUo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCCZzspZTHiHpEZbBdhKYT0MmzPQ5X393fmmy9d+V6k1QIgDtVRqKGqfZLAi++HdXHM3p2IHU/TQsPHesw6Pfj9ToE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1167857},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"879a20388385069ca355d1f23ca8b84e717a4ff4","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.3_1788143905156_0.7912173150744621","host":"s3://npm-registry-packages-npm-production"}},"2.8.4":{"name":"infinity-harness","version":"2.8.4","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.4","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"b851b10c2395f3120c8b9e79dc7f297ee60b7d0a","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.4.tgz","fileCount":112,"integrity":"sha512-/a+T2fXNQrwHOcdY5zdbOeOzSom0+yaGwkuSaDAjt1JiENPsx0HbpJJu2lSJflHGo/yOyhJP+pveoU+WWoWsNA==","signatures":[{"sig":"MEUCIE2sl9Inr93wF4AEp/ezxo2fCDNXnIHS+fP3MYOoi/9QAiEAtvR2xKEJEXN8jFCjBmL4Stg6uytBasD1pYW2511Wj3U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAaIxL69jwiQw4SSKoABUBe6etUaWw5mJ6/kMgfbe2R4AiBxyUogrNyUe1+kUq2lGO3D4M55e1pww87CYapCyrT2EQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1169475},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"289597eada8bf8864438ff618e00e50b3e258edb","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.4_1788146683240_0.7247191336307908","host":"s3://npm-registry-packages-npm-production"}},"2.8.5":{"name":"infinity-harness","version":"2.8.5","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.5","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"8348cb9c5edb6aeac9515a55e31b292d703d45ff","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.5.tgz","fileCount":112,"integrity":"sha512-r8yEpoQW2fRwMZmEGKpL/Y3JULlRUZctsbH97uX+CqoNGwM7fKw7L81aGbfVhiSgKDu5Sqzb4/YtcLGLOGCWUw==","signatures":[{"sig":"MEUCIQDzMdkhqbYth3kDncJfC/koFB/ototWQB4qciaYW91ChAIge4+ae5drZvYXDQr7Y/b2PoadEYZyX1zoboFuI8C1YlU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD6GIfGcX9KuV9R2OiucI6aKmClNmPYBWAifG5oCeDx9wIhAIzDhoRPZs8bYBRNDxPoTlKqPeSYlymIHUqKzO9Bz12/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1174083},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"86642a24d9c65321986545268192cafeb68d83c4","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.5_1788149127336_0.784818181474449","host":"s3://npm-registry-packages-npm-production"}},"2.8.6":{"name":"infinity-harness","version":"2.8.6","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.6","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"0715c9accc916b6de26c1dc295b7187e8016ede6","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.6.tgz","fileCount":112,"integrity":"sha512-asuuie2E2l8KWAUxvbaLnf0ViPIp4tuYHsGabkfNW3bVoPnbowOtsd41hZ2dLGNzVm93CdO1CVNPkn7CpERwzg==","signatures":[{"sig":"MEUCIHQGAvPprJdeuPhFz+sd28uI0CsZ3Lj9x5PfF2b9bKz3AiEAmhi1B2B43r35tjettKIxbF1F3WKAuPuKRwCB25hYLM4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHgvVkHC3dLXTwDDr2riz9QV2+gsG3EaFzRsAsFMCLz7AiEA34bOPp/RFxpVkwNCSAiS5hOsve2MH6FqBOrMiyN1yfw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1176522},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"5ef1c6aa6130ea3e7e1421e3f984f037ef767668","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.6_1788152683938_0.12376971450229668","host":"s3://npm-registry-packages-npm-production"}},"2.8.7":{"name":"infinity-harness","version":"2.8.7","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.7","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"da3d209fb40efdf915ad79a8c517658e178e7422","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.7.tgz","fileCount":112,"integrity":"sha512-3UyztL2XvkQnwODwH3izdbzMM7mBw0uJyQqhI8MTISr/bczWte1WJw/djVRak8vb6X8XFlegFEIxsbjxjGSOKA==","signatures":[{"sig":"MEYCIQDk47Wr3v/1XsZIlSVsszhDm19SJ40lhMY8mTvA49y26QIhAMZOITNerHaI2E+gKepbEX1v+/dYn2ilIToShzqC4tmc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGg+kDKlr1h52fjg+43aekW/CZuZj1EttVqsQoYigh4iAiEA88/OfNms6aX3KN+dt9JGDoBMa/B2j9Tzr9JRwJDqsQo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1184687},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"4fbbc8667c0df14a4675fa0a1d2e469003935801","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.7_1788160007285_0.7361088231178059","host":"s3://npm-registry-packages-npm-production"}},"2.8.8":{"name":"infinity-harness","version":"2.8.8","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.8","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"58c3bc508581413005eefff6103063135bc1a5ef","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.8.tgz","fileCount":112,"integrity":"sha512-e+0yN3Y3ZydC2bXNyFmNjJLCdEpOh5rNFyILdoBMFlvxOg7M6mwn6q7sckcAy4AA/DHAIqtlfJ9ILt/DgA6xUg==","signatures":[{"sig":"MEUCIH/Q9VmnAfZg/tc8D2q5ojUf/sUrtZh1XWLjOEGUu/dVAiEAxWtqGMpiQCv0xQ5Ln1Cgv3zg/+inuIqxu1xDQySl8MQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIE/daUvcwoNeKEXFgontDBfxSqUnTu5IvPUA9kr01YAXAiEAkBk09NrB7dePvgY6ZHbIXnEJQeSmkxI/bAJvw+bDJfo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1193662},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"04f6f87b47d79d24bfc6588ba5178f1cdbb49141","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.8_1788161299448_0.058331274533891975","host":"s3://npm-registry-packages-npm-production"}},"2.8.9":{"name":"infinity-harness","version":"2.8.9","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.9","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"88610601af2b433dd65aad79e28132b0afad7e35","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.9.tgz","fileCount":112,"integrity":"sha512-cUm4e+htJz3wvQIjX4n4NNDVH1RvSEzIx5Zjz9KAGFUCuQy5HVtW4RwDPyU3jfchbhcqgF0EKB6EW0dpQLyM2Q==","signatures":[{"sig":"MEUCIQCyrMku3SQhmMUmwaJHYUpp8vAdFKoc0oJIa0wdVdPbBgIgTRASaEXfAuhdG1GgPU7jT3GxDmx1GlDMK10zjaw3kwQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCkXniROO37xkDYMu/8wgdyssU3DfCwEmQvuaPHQfxMcQIgGEoPE02jGt2zTJch+3T4XdLiNxzmpdipthfpA2sVPl0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1197278},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"75d6b7968bfe563c04a93613fd2da2dd7fdcb11c","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.9_1788162325087_0.5674075326333097","host":"s3://npm-registry-packages-npm-production"}},"2.8.10":{"name":"infinity-harness","version":"2.8.10","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.10","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./extensions"]},"dist":{"shasum":"2368baa71d965d12cd0cd357a145905e55c05fc3","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.10.tgz","fileCount":112,"integrity":"sha512-Bnidnk95kqXav6l3O7kozbIlQnBTjqGtF7ZFt+udCx0KkyU7P6s+uO5M3aIm/9PFXOgAydX2ZDHInIY5RGJhkQ==","signatures":[{"sig":"MEYCIQC8SwrEH1ZWMiQFeqjE+fNbHxJZAdBXKvQkRcADB0YOFwIhAPhLQJe76uQtqhff3dO3TV6kCeWJCDbGkEcSVpUzhJce","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEB/XWege2XI4ppYlPnmMcRd7utGenuAEJGYyBmh8D+NAiB1BNEAF9zj/V5XCsFlYVLc0Wdv+yttkyYtdEEvSiBFsw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1204796},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"311e72b45aeb6342356677ce4dc1bd540cfa604e","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc --noEmit","check":"tsc --noEmit"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.10_1788167062732_0.053241530860516084","host":"s3://npm-registry-packages-npm-production"}},"2.8.11":{"name":"infinity-harness","version":"2.8.11","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.11","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./dist/extensions","./extensions"]},"dist":{"shasum":"fdf1a3b87bf5bed4f159878c35e80ef549a3630d","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.11.tgz","fileCount":296,"integrity":"sha512-inbM5ocOQzPGy2DnjpAClx2ZVG5cyo3nf4xN28XOqz0CjJJY3QYfijmsUiP5/Pgh/l6WbRUmCduTJcxD6KQkCA==","signatures":[{"sig":"MEYCIQD4mgHzGPmM3RmzTh44me5F36+P/jrpVgaB0l7jDPmRfwIhAOrQKpc8k7pokhC7TPkrYXmUqYEj3NYeCIXtxmjwKkMw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCZnoKnhapWIYf678i7RDkyLGmqV4CLuOCMLeF5vlVLUQIhAI6/H5CcjHLWneHfjpcna0p+Dr/vbFZNGdn1Ed39qe+M","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3701649},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"aaf55e76cbbbe42c7579a0a0ad4b21eddfb0fc8e","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepare":"npm run build"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.11_1788171808690_0.6574933862070278","host":"s3://npm-registry-packages-npm-production"}},"2.8.12":{"name":"infinity-harness","version":"2.8.12","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.12","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./dist/extensions"]},"dist":{"shasum":"96f620078334a7e01ebc45867d849b4eb09894d1","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.12.tgz","fileCount":296,"integrity":"sha512-9bSNhGgkZlO0sS8JR/UBXNcwecJYkryDqAt7WacM0WQyeq39mGQzwcnDfHPR2civDESOAUIy7lJXI7lAZa7nQw==","signatures":[{"sig":"MEUCIAKG2apN/3VUl7qy2bWkE0L7WJ0UPOHI2Qc3VRgeVk05AiEAy/gouMuld/uf4SB03fmVDDL0UqatYzTFzIyB0fAl3Gw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHMl449V8mBYVAHD7lidqx1EWEGTikLDiJPlpZFTJ2a1AiAXANjhN3TE6eOYltII2uHFehsDey9+XeXkjAKg67AnBQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3702296},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"e1ad3a6e824d97226967c2dbe96a18bff6e1e7b8","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepare":"npm run build"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.12_1788173750731_0.10935723153632604","host":"s3://npm-registry-packages-npm-production"}},"2.8.13":{"name":"infinity-harness","version":"2.8.13","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"author":{"name":"Bakr Bagaber"},"license":"MIT","_id":"infinity-harness@2.8.13","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"pi":{"skills":["./harness/skills"],"extensions":["./dist/extensions"]},"dist":{"shasum":"fe6da6a4588ab3d8a46f1b42a42ab203f9c27a70","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.13.tgz","fileCount":296,"integrity":"sha512-0lqg3znos64DK0yMDBrzK7paY1e7ZClXMgr5AMABR5r1+enWx0JPcxApMEUVHieOVJXmd/Wbv0LoOykdXQvEYA==","signatures":[{"sig":"MEUCIQDLGLRmk7x+RYdqWu635SX6RMk0tMMBlmF9626/wXa6nAIgezQv9t/ByVjs1b5MGdnMgb5+Vn6JfEFwPvgrL1wG2Wk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDN+PIUvaoUd4tBcywItiGZkaXYOsXRPK/rBNXqsGZlYwIgZ5uwOl4DcCUPbLy4Wwc9XiMz0ZxAtBHzM4F/EYLOB4k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3701866},"type":"module","engines":{"node":">=22.0.0"},"gitHead":"4dffb55c4d53bea7aafe68970ae5afeb5e2f8e27","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepare":"npm run build"},"_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/infinity-harness_2.8.13_1788175414088_0.6896068587155009","host":"s3://npm-registry-packages-npm-production"}},"2.8.14":{"pi":{"skills":["./harness/skills"],"extensions":["./dist/extensions"]},"_id":"infinity-harness@2.8.14","bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"dist":{"shasum":"a4ce0a47adca48c48f437a8dc8a47501090f162d","tarball":"https://registry.npmjs.org/infinity-harness/-/infinity-harness-2.8.14.tgz","fileCount":296,"integrity":"sha512-+/PIP80ffkQr7WDTEI78qPLeVTyc5Mo4idY45kMQzCsn/nkbIT5M7xBjKLBOGg/e3GbNEpkB368prfV5O9oqaw==","signatures":[{"sig":"MEQCIHyj5l7qii72jeOKmI24I24MqyyRDStXy5Y8zMexBdE8AiBaqi0jqSLdIw57ZrMburYUuCYl2EBZqeMezm3sbXZgEQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCzdxF9EglfE3eC7SylgGcrHrfNSFE8RMcjnTLFIuiKBQIgbt0E/Z5AoAk92o/ZrGNSt1hV3Co+Bg7v6NJYWBwW4v8="}],"unpackedSize":3702584},"name":"infinity-harness","type":"module","author":{"name":"Bakr Bagaber"},"engines":{"node":">=22.0.0"},"gitHead":"4a4ce2833387aad9eafe63226a3e1b6c4c01a8e5","license":"MIT","scripts":{"e2e":"node scripts/e2e.mjs","test":"node scripts/run-tests.mjs","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepare":"npm run build"},"version":"2.8.14","_npmUser":{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"},"homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"_npmVersion":"11.16.0","description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","directories":{},"maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"_nodeVersion":"24.18.0","dependencies":{"string-width":"^7.1.0","proper-lockfile":"^4.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/infinity-harness_2.8.14_1788179572352_0.8913822202501893"}}},"time":{"created":"2026-08-23T15:10:05.296Z","modified":"2026-08-31T12:32:52.661Z","2.0.0":"2026-08-23T15:10:05.639Z","2.0.1":"2026-08-23T15:49:48.375Z","2.0.2":"2026-08-23T16:04:00.621Z","2.0.3":"2026-08-23T16:04:35.813Z","2.0.4":"2026-08-23T16:14:41.408Z","2.1.0":"2026-08-23T23:14:21.863Z","2.2.0":"2026-08-23T23:50:26.427Z","2.2.1":"2026-08-23T23:55:42.765Z","2.3.0":"2026-08-24T11:21:05.811Z","2.3.1":"2026-08-24T11:35:29.643Z","2.4.0":"2026-08-24T12:43:40.031Z","2.5.0":"2026-08-25T05:30:45.798Z","2.5.1":"2026-08-25T08:54:36.793Z","2.6.0":"2026-08-25T13:22:34.168Z","2.6.1":"2026-08-25T14:19:23.001Z","2.6.2":"2026-08-25T14:21:13.077Z","2.6.3":"2026-08-26T12:04:07.653Z","2.6.4":"2026-08-26T22:48:42.278Z","2.6.5":"2026-08-27T12:51:28.755Z","2.6.6":"2026-08-28T16:21:44.712Z","2.7.0":"2026-08-29T04:51:10.797Z","2.8.0":"2026-08-30T03:03:43.915Z","2.8.1":"2026-08-30T03:47:16.494Z","2.8.2":"2026-08-30T09:40:29.044Z","2.8.3":"2026-08-31T02:38:25.288Z","2.8.4":"2026-08-31T03:24:43.341Z","2.8.5":"2026-08-31T04:05:27.450Z","2.8.6":"2026-08-31T05:04:44.036Z","2.8.7":"2026-08-31T07:06:47.405Z","2.8.8":"2026-08-31T07:28:19.540Z","2.8.9":"2026-08-31T07:45:25.221Z","2.8.10":"2026-08-31T09:04:22.839Z","2.8.11":"2026-08-31T10:23:28.852Z","2.8.12":"2026-08-31T10:55:50.845Z","2.8.13":"2026-08-31T11:23:34.238Z","2.8.14":"2026-08-31T12:32:52.468Z"},"bugs":{"url":"https://github.com/bakr-bagaber/infinity-harness/issues"},"author":{"name":"Bakr Bagaber"},"license":"MIT","homepage":"https://github.com/bakr-bagaber/infinity-harness#readme","keywords":["pi-package","pi-extension","harness","agent-pipeline","autonomous","continuous-development"],"repository":{"url":"git+https://github.com/bakr-bagaber/infinity-harness.git","type":"git"},"description":"A pi agent extension that runs a gated build pipeline unattended — enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.","maintainers":[{"name":"bakr-bagaber","email":"mail@bakrbagaber.com"}],"readme":"# infinity-harness\n\n**A pi extension that keeps an agent building — correctly — for hours or days without you.**\n\nPoint it at a project, describe the goal, and walk away. infinity-harness drives the agent through a\ngated pipeline, checks the work with deterministic gates rather than the model's own judgement, and\nstops with a clear reason when it genuinely needs you.\n\n```\n╭──────────────────────────────────────────────────────────────────────────╮\n│ ∞ INFINITY ──────────────────────────────────────────────── BUILD rev 42 │\n│ ◈ Ship the payments rewrite behind a flag                                │\n│                                                                          │\n│ ● define ─ ● plan ─ ◉ BUILD ─ ○ verify ─ ○ review ─ ○ ship               │\n│                                                                          │\n│ ▰▰▰▰▰▰▰▰▰▰▰▱▱▱▱▱▱▱▱▱▱▱▱▱  45%                  5/11 tasks · 1/2 features │\n│ ⚠ 1 blocked · ↷ 1 rework · retry 2/10 · session 7                        │\n│                                                                          │\n│ ▤ Checkout                                                          5/11 │\n│   ▸ feature-002 · Checkout flow                                      2/5 │\n│     ●  4 validate cart totals against catalogue prices                   │\n│     ●  5 apply stacked discount codes with precedence rules         ← #4 │\n│     ◐  6 handle partial refunds across split tenders            ← #4, #5 │\n│          ✓ unit tests for tender split                                   │\n│          ▸ integration test against sandbox                              │\n│          · audit log entries                                             │\n│     ○  7 emit refund webhook                                        ← #6 │\n│     ⚠  8 reconcile ledger nightly                                   ← #6 │\n│   ⋯ 3 below  alt+j/k scroll · alt+o expand                               │\n╰──────────────────────────────────────────────────────────────────────────╯\n```\n\nAll five levels of the plan — goal, sprint, feature, task, subtask — with the window\ncentred on the work. `alt+j` / `alt+k` scroll it, `alt+o` expands it, and\n`/infinity:dashboard` shows the whole thing in a browser.\n\n---\n\n## Why it exists\n\nLeft alone, a coding agent drifts. It declares work finished that isn't, forgets what it already\ndid, re-solves the same problem three different ways, and — worst of all — keeps going long after it\nstopped making progress. Pair it with a small or cheap model and all of that gets worse.\n\ninfinity-harness fixes that by taking three decisions away from the model:\n\n1. **When work is done.** A deterministic gate decides, not the agent. Same tree, same verdict, every\n   time. No agent marks its own homework.\n2. **What happens next.** The phase pipeline is forward-only and one step at a time. The agent cannot\n   decide it's bored of BUILD and jump to SHIP.\n3. **What to remember.** The plan, the phase and every budget live in files, so the run starts a\n   **fresh pi session at each boundary** instead of dragging the whole history of the run into every\n   request. Small models stop drowning; long runs stop turning into summaries of summaries.\n\nEverything else — the retries, the model routing, the escalation ladder — exists to keep those\ndecisions honest over a very long run.\n\nAnd one decision stays yours: **what gets built**. The gate can prove a feature has acceptance\ncriteria; it cannot prove they are the right ones. So the run stops and asks you to sign off\nRESEARCH, DEFINE and PLAN — always in copilot, and in autopilot for whichever of them you choose to\nkeep.\n\n## Install\n\nRequires **Node 22+** and [pi](https://github.com/earendil-works/pi-coding-agent).\n\n```bash\n# from npm — project-local, so the team shares it via .pi/settings.json\npi install npm:infinity-harness -l\n\n# or globally\npi install npm:infinity-harness\n\n# straight from the repo\npi install git:github.com/bakr-bagaber/infinity-harness\n\n# or from a checkout\npi install ./infinity-harness -l\n\npi list   # confirm it loaded\n```\n\nThe package ships TypeScript. pi loads extensions through `jiti`, which\ntranspiles at runtime, so there is no build step and nothing to compile.\n\n## Use it\n\n```bash\ncd your-project\npi\n```\n\nThen, once, in that project:\n\n```\n/infinity:init\n```\n\nIt detects your stack and its lint/test/build commands, then asks you five questions:\n\n| | |\n|---|---|\n| **Which workflow?** | A built-in, one you saved, or *build one* — pick the phases, then say for each whether it stops for you |\n| **What are you building?** | One or two sentences. Asked whatever the workflow, because a run with no goal has no business inventing one. |\n| **When should it start a fresh session?** | Every phase (default) · every task · never |\n| **How much of the plan on screen?** | A display template — `focus`, `everything`, `overview`, `worklist`, or level by level |\n\nThen it writes `harness/` — the config, an empty plan, the phase and role docs, and starters\nfor the documents the review gate will demand — and hands the model its first brief. It never\noverwrites a file that already exists, and `/infinity:init force` restores anything you\ndeleted without touching what you wrote.\n\nFrom then on, every session opens with a brief: phase, role, current task, acceptance criteria,\nthe craft skills that match the work, and what to do next. Do the work, then:\n\n```\n/infinity:validate     run the gate for this phase\n/infinity:run          hand it the wheel: validate → advance → re-brief, until done or stuck\n/infinity:approve      sign off the phase waiting for you — or send it back with a note\n/infinity:status       where the run is right now\n/infinity:scroll       move the plan widget: up · down · top · bottom · expand · follow\n/infinity:handoff      continue this run in a fresh session, by hand\n/infinity:config       change any setting, including which model runs which tier\n/infinity:models       what models pi has, and how they are being routed\n/infinity:dashboard    open the live web view\n/infinity:goal         state a goal and pursue it across passes\n/infinity:unstuck      what the escalation ladder would try next\n/infinity:rework       send a task and its dependents backwards\n/infinity:halt         take the wheel back\n```\n\n`/infinity:run` is the point of the tool. It keeps the loop turning without you.\n\n## Who decides what\n\n\"copilot\" and \"autopilot\" used to be one switch, and one switch is the wrong shape for the\nquestion. What people actually want is per-phase: let the model define and plan on its own but\nshow me the review; or grill me on the definition and then leave me alone until it ships. Two\nwords cannot say that.\n\nSo the setting is a **mode per phase**, and the two familiar words are two named points in that\nspace rather than the only two points in it.\n\n| Mode | When a phase's gate passes |\n|---|---|\n| `autopilot` | it advances |\n| `copilot` | it stops and waits for your signature |\n\nFive workflows ship with the package, and none of them can be edited — `copilot` has to mean the\nsame thing in every conversation about this tool:\n\n| Workflow | Stops at |\n|---|---|\n| **copilot** | DEFINE, PLAN |\n| **autopilot** | nothing |\n| **spec and ship** | DEFINE, SHIP — you sign the scope going in and the release coming out |\n| **research first** | adds a RESEARCH phase, and stops on all three thinking phases |\n| **every gate** | every phase. Slowest, and the one you want on something that matters |\n\nAnything else you build yourself: pick the phases, then say for each whether it stops for you. Give\nit a name and it is saved with *you*, not with the project, so it is the first thing offered on your\nnext one.\n\n```\n/infinity:workflow                 choose one, or build one\n/infinity:workflow spec-and-ship   switch to a named one, no menu\n/infinity:workflow list            what is available, and what you are on now\n```\n\nAny of it changes at any time and takes effect at the next gate — three phases into a run is\nexactly when someone realises they do want to see the review after all. `/infinity:config` →\n**Workflow** edits one phase at a time.\n\n### Signing a phase\n\nWhen a phase you signed up for passes its gate, the run **stops and asks you** rather than\nadvancing. Approving continues it; answering with a sentence sends the phase back carrying your\nwords, so it is redone against your objection rather than redone identically:\n\n```\n/infinity:approve\n/infinity:approve the criteria say nothing about refunds\n```\n\nA rejection is pinned to the state of the project when you made it, so the run will not ask you the\nsame question again until the agent has actually changed something in response. If it never does,\nthe run stops and says so instead of nagging forever.\n\n## Your session is a control panel\n\nThe work does not happen in the pi session you start the harness from. That session shows you the\nplan, the background log and the commands; the run itself happens in **separate `pi` processes**,\neach with its own model, its own context window and its own session file.\n\n```\n  your pi session ──── widget · background log · /infinity:*      (no tokens spent on the run)\n        │\n        └── supervisor  plain JavaScript in the extension, no LLM\n              │\n              └── worker   pi --mode rpc --model <the tier's model>   ← the work happens here\n```\n\nThat is what makes the difficulty tiers mean anything. A session has exactly one model, so if the\nrun happens in *your* session, your model does every task however carefully you routed them — which\nis precisely what used to happen. Now the model is chosen when a worker is started.\n\nSet it with `/infinity:config` → **Execution** → *Where work runs*:\n\n| `execution.engine` | |\n|---|---|\n| `background` *(default)* | one background pi session per unit of work, on that unit's model |\n| `main-session` | the pre-2.7 behaviour — everything runs in your session, on your model |\n\n`/infinity:workers` prints which sessions exist, which unit and model each has, what it is doing and\nthe recent log. It reads files; it never costs a turn. Workers keep their session files under\n`tmp/infinity-harness/sessions/`, so you can `/resume` any of them and read the whole transcript.\n\n## One run, many sessions\n\nA harness that never starts a new pi session is a harness whose context window only ever grows.\nBy the tenth task the model is re-reading the history of the first nine in order to do the\ntenth — paying for those tokens on every call, compacting them into a lossy summary once the\nwindow fills, and, on a small model, simply drowning.\n\nNothing the harness knows lives in the conversation. The plan, the phase, the gate history, the\nretry budgets and the escalation ladder are all files under `harness/`, so a session boundary\ncosts one thing: the brief — which is what the agent should have been working from anyway.\n\n`session.handoff` names one level of the plan, and that level is the **unit**: one worker owns one\nunit from start to finish, in one session, on one model. Crossing a unit boundary closes that\nworker and starts a new one — that is the handoff.\n\n| Setting | A fresh session, and a fresh model choice, when |\n|---|---|\n| `off` / `goal` | never — one session for the whole run |\n| `phase` | the pipeline advances a phase |\n| `sprint` | the active sprint changes (or coarser) |\n| `feature` | the active feature changes (or coarser) |\n| `task` *(default)* | the active task changes (or coarser) |\n| `subtask` | the active subtask changes (or coarser) |\n\n**The model boundary is the session boundary.** Because a worker's model is chosen when it starts,\nwhatever you pick here is also how often the model can change — so the difficulty that matters is\nthe difficulty of the *unit*, not of the task. At `feature`, a feature runs on its hardest task's\nmodel and the easy tasks inside it get that model too. At `task`, each task gets its own tier. The\nwizard says which of those you are choosing in the question that sets the models.\n\nAny level also replaces the worker early once its context passes `session.contextThreshold`, because\na handoff that arrives after compaction has arrived too late to be the thing that prevented it.\n\nThe run itself — its id, its wall-clock budget, its iteration ceiling, its no-progress strikes\nand its position on the escalation ladder — lives in `harness/run.json` and is the same run\nacross every session it spans. `/reload`, `/resume`, closing the terminal and reopening it all\nresume the same run rather than quietly starting a new one with fresh budgets.\n\nThe widget shows `session 7` once a run has spanned more than one.\n\n### The first pass through\n\nDEFINE wants acceptance criteria on every feature, so start by telling it what you are building.\nThe agent writes that through `infinity_plan`:\n\n```jsonc\n{\n  \"goal\": \"Ship the payments rewrite behind a flag\",\n  \"features\": [\n    { \"id\": \"feature-001\", \"name\": \"Checkout flow\", \"criteria\": [\"refunds reconcile against the ledger\"] }\n  ]\n}\n```\n\nFeatures carry names and criteria; tasks are a separate list keyed `feature-001/task-001`, and\narrive in PLAN. Omitting a task deletes it — that is the rule that keeps the plan honest — but\nomitting a *feature* just leaves it alone, because features are inferred from task keys rather\nthan submitted.\n\n## Configuration\n\nEverything is configurable from inside pi:\n\n```\n/infinity:config        interactive menu\n/infinity:config show   print the whole configuration as text\n```\n\nThe menu is generated from a single schema, so every option the file format\nsupports is reachable from the UI — the two cannot drift. Editing\n`harness/config.json` and `harness/model-router.json` by hand stays entirely\nvalid; the menu is the same data with prompts and bounds checking attached.\n\n| Group | Covers |\n|---|---|\n| **Models** | Which model runs each difficulty tier, the master model, consultation budget |\n| **Pipeline** | Which phases run, copilot vs autopilot, role strictness, pause |\n| **Workflow** | The mode for each phase — which of them stop and wait for your signature |\n| **Display** | Which plan levels and which chrome the widget and the dashboard draw |\n| **Sessions** | Fresh session per phase or per task, the context threshold, the carry note |\n| **Project commands** | lint / test / coverage / build — what the gate actually runs |\n| **Gates** | Enable, coverage threshold, placeholder rejection |\n| **Continuous run** | Iteration ceiling, wall-clock budget, no-progress strikes |\n| **Retry budgets** | Attempts per task, feature and phase |\n\n## The pipeline\n\n```\n[research] → define → plan → build → verify → [simplify] → review → ship\n```\n\n| Phase | What it's for | Gate opens when |\n|---|---|---|\n| **research** | Find out what it actually has to be *(opt-in)* | `harness/docs/RESEARCH.md` says something a human could argue with |\n| **define** | Write down what's being built and how you'll know it's done | Every feature has acceptance criteria |\n| **plan** | Break features into ordered, dependency-aware tasks | Tasks exist and criteria are set |\n| **build** | Implement, one task at a time, tests alongside | Lint, tests, coverage pass; no placeholders; every task complete |\n| **verify** | Prove behaviour; hunt what the tests miss | Tests and coverage pass on a clean tree |\n| **simplify** | Delete more than you add *(opt-in)* | Tests pass, no empty dirs, clean tree |\n| **review** | Judge it as if someone else wrote it | Rubric, README, architecture doc and decisions are real; branch level with upstream |\n| **ship** | Tag, changelog, leave it clean | Clean tree, tagged, changelog, README, licence, no placeholders |\n\nEnable or disable phases in `harness/config.json` under `phases.enabled`, or in the wizard.\nRESEARCH and SIMPLIFY are off by default.\n\nRESEARCH runs before anything is specified, and answers the question DEFINE assumes: is this the\nright thing to build at all? It writes prior art, the constraints that are real, at least two\noptions with what each costs, a recommendation, what would make that recommendation wrong, and the\nquestions only you can answer — which become the DEFINE interview. Turn it on when the human gave\nan idea rather than a specification.\n\n## When it gets stuck\n\nStopping safely is the easy half. The hard half is trying something *else* first, and that is the\nescalation ladder: when a run stalls — the gate fails and the working tree has not moved, meaning\nthe agent produced nothing — `/infinity:run` climbs it before spending a strike.\n\n| Rung | What it does |\n|---|---|\n| **retry** | One more attempt. Sometimes a run is just slow. |\n| **reframe** | State the assumption you have been working under, say why the evidence contradicts it, then try a different approach. |\n| **consult** | Escalate to a stronger model, one step up the difficulty ladder. |\n| **rework** | Flip the task and everything that depends on it back to `rework`. Work built on a broken thing is suspect until re-proved. |\n| **replan** | The plan is wrong: something this needed was never planned. Amend it. |\n| **master** | Last resort. State the problem from scratch, including what has been ruled out. |\n\nEach rung gets one turn per stall, and each is bounded — reworks and replans have budgets, `consult`\nhas a per-task limit, `master` fires once per run. When the ladder runs out, the run stops and names\nevery rung it spent. Real progress resets it: a moving tree means a new problem, and a new problem\ngets a fresh ladder.\n\n`/infinity:unstuck` shows what it would try next without doing it.\n\n## Goals, and knowing when you are actually done\n\nA finished pipeline is not a met goal. The gate decides whether the **work** is done; it has no\nopinion on whether the work was the *right* work, because it only ever sees the plan — and the plan\nis just what you thought the goal needed when you wrote it.\n\n```\n/infinity:goal Ship the payments rewrite behind a flag\n```\n\nThat states the goal and starts pass 1. One pass at the goal is one full trip through the pipeline.\nWhen the pipeline completes, the run does not end: it asks whether the goal is met.\n\n- **complete** ends the run.\n- Anything else must name what is still missing — and the pipeline rewinds to the first phase with\n  that list carried into the brief, so the next pass plans for the remainder rather than rebuilding\n  what the last review already accepted.\n\nBounded by an iteration ceiling and a wall clock, both configurable. The widget shows which pass you\nare on, because a second pass looks exactly like a first one otherwise.\n\n## Knowing when to stop\n\nThis is the part that makes an unattended run safe. `/infinity:run` halts on any of:\n\n| Guard | Default | What it catches |\n|---|---|---|\n| **No progress** | 3 strikes | Gate keeps failing and the working tree hasn't moved — the agent is spinning, not working |\n| **Wall clock** | 24h | A run you forgot about |\n| **Iterations** | 2000 | Runaway loops that stay under the clock |\n| **Retry budget** | 10/task | One impossible task eating the whole run |\n| **Pipeline complete** | — | Final phase passed with every task done |\n| **Human brake** | — | `/infinity:halt`, `/infinity:pause`, or `touch harness/STOP` |\n\nEvery stop names its reason. You come back to an explanation, not a mystery.\n\nTune the budgets in `harness/config.json`:\n\n```json\n{\n  \"loop\": {\n    \"maxIterations\": 2000,\n    \"maxWallClockMs\": 86400000,\n    \"noProgressLimit\": 3\n  }\n}\n```\n\n## The plan is a file\n\n`harness/features/feature-list.json` is the single source of truth. The widget, the dashboard and the\nbrief all read it; nothing caches a second copy.\n\nThe agent edits it by submitting the **complete** task list through the `infinity_plan` tool:\n\n- **Omission means deletion** — for tasks. One unambiguous rule beats incremental edits a model\n  loses track of. Leaving the `tasks` field out entirely is different from sending an empty one:\n  absent means \"not touching them\", empty means \"delete them all\".\n- **Features are a merge, not a submission.** They are inferred from task keys, so they are never\n  resubmitted wholesale; `features` supplies names and acceptance criteria by id, and omitting one\n  leaves it alone.\n- **`baseRevision` guards every write.** A stale revision is rejected, so parallel workers can't\n  clobber each other.\n- **Unknown fields survive.** An update merges onto the stored task, so `difficulty`, `modelHint`,\n  `criteria` and anything added later are never silently dropped.\n- **The dependency graph stays sane.** Cycles and dangling references are rejected at write time; a\n  task can't be `complete` while something it depends on isn't.\n\n## Watching it work\n\n**In the terminal** — the widget updates on every turn, showing the plan as deep as you asked for:\ngoal, sprint, feature, task, subtask. It is a *window*, not a truncation — the rows above and\nbelow are counted, and one keypress away:\n\n| Key | |\n|---|---|\n| `alt+j` / `alt+k` | scroll the plan down / up |\n| `alt+o` | expand — every subtask, three times the rows |\n| `/infinity:scroll follow` | back to tracking the active task |\n\nIt is responsive down to ~58 columns, degrades to ASCII when the locale isn't UTF-8, and drops\ncolour under `NO_COLOR`.\n\n**In a browser** — `/infinity:dashboard` serves a live page on loopback: phase rail, stacked\nprogress meters that show stuck work as colour rather than absence, the plan as a collapsible tree\nwith counts at every level, and the last gate verdict. It refreshes itself every 5 seconds and\nreconnects with backoff if the run ends.\n\nThe dashboard is strictly read-only and binds to `127.0.0.1`. It never writes, and never bumps\n`baseRevision` — opening it can't perturb the run you're watching.\n\n### What they show is yours to choose\n\nTwo people watching the same run want different things on screen. One works in sprints and never\nopens a subtask; the next has no sprints and lives in the subtask list. So it is a setting, and\n**the widget and the dashboard read the same one** — configure how you like to read a plan once,\nnot twice.\n\n| Template | |\n|---|---|\n| **focus** *(default)* | every level, with subtasks on the task being worked |\n| **everything** | all five levels, every subtask on every task, a taller window |\n| **overview** | goals, sprints and features with their counts. No tasks — the shape, not the work |\n| **worklist** | tasks only. No grouping rows, no rail — for when you already know the plan |\n\n```\n/infinity:display              pick a template, or choose level by level\n/infinity:display overview     switch straight to one\n/infinity:display list         what is available, and what you are on now\n```\n\nChoosing level by level also lets you turn off the phase rail, the progress meter, the alert strip,\nthe `done/total` counts, the `← #3` dependency labels and the acceptance criteria, and set how many\nrows the terminal shows before it scrolls. Name what you end up with and it is saved with you,\noffered on your next project. `/infinity:config` → **Display** edits the same things one at a time.\n\nHiding a level never hides what is under it: turn off sprints on a plan organised into sprints and\nthe features move up one indent, they do not vanish. A task nobody can see is a task that gets\nstuck forever.\n\n## Craft skills\n\n28 short documents on how to do the work well — how to write a test worth\nkeeping, how to debug something intermittent, how to design a module boundary.\nThey ship with the package, so pi loads them wherever it's installed and the\nmodel can invoke any of them by name.\n\nA model with 28 skills available and no idea which one applies reads none of\nthem, so **the brief names the ones that match the work in hand**. Each skill\ndeclares what it's for:\n\n```yaml\nkind: domain                                     # process | domain | meta\nphases: [plan, build, verify]                    # the phase it leads counts most\ntags: [concurrency, race, lock, mutex, deadlock] # vocabulary a task would use\n```\n\nA `process` skill belongs to its phase — TDD is the right answer for a BUILD\ntask whatever the task says. A `domain` skill has to share vocabulary with the\ntask: nobody needs the database skill because they happen to be in BUILD. So a\ntask called *\"serialise plan writes so two workers can't race on the lock\"*\ngets `concurrency-async`, and a bare BUILD task gets `tdd`.\n\nWhen nothing matches, the brief has no skills section. An empty section is\nhonest; a padded one teaches the model to skip it.\n\n## Model routing (optional)\n\nSend cheap tasks to a small model and hard ones to a large one. Pick them with `/infinity:config` →\n**Models**: the list offered is the models **pi itself has configured and can authenticate**, so you\nchoose from what you already have rather than typing ids from memory. `/infinity:models` shows that\nlist alongside the current routing.\n\nRouting ships **disabled with every slot empty**, meaning \"use whatever model pi is already\nconfigured with\" — installing the harness never silently redirects your work to someone else's\nmodel. Any tier can be handed back to that default at any time.\n\nResolution order:\n\n```\ntask.modelHint → byTask → byDifficulty → byFeature → bySprint → byPhase → byRole → default\n```\n\n`master` is never assigned directly; it's reachable only through one-step consultation after the\nnormal ladder is exhausted. An escalation that names a stronger model is also a session boundary —\nthe worker is replaced rather than switched, because putting a stronger model in front of the weaker\none's failed reasoning is the context the escalation exists to get away from.\n\nAn empty slot means \"whatever model pi is on\", and a background worker cannot inherit that by magic:\nthe harness reads the model your session is on and passes it to the child explicitly. The widget and\n`/infinity:workers` show both what was asked for and what actually answered, so a reference that\nquietly fell back to a default is visible rather than invisible.\n\n**Reasoning models need headroom.** A reasoning model emits nothing on the content channel until it\nhas finished thinking — measured at ~370 reasoning tokens to answer \"reply with one word\". If you\nroute a tier to one, give its workers a generous timeout; a tight budget returns an empty completion\nthat looks like a broken endpoint but is only a small cap.\n\n## Tools the agent gets\n\n| Tool | Purpose |\n|---|---|\n| `infinity_init` | Create the harness in this project |\n| `infinity_brief` | What am I supposed to be doing right now? |\n| `infinity_plan` | Read or rewrite the plan — tasks, features, criteria, goal |\n| `infinity_validate` | Run the gate for this phase |\n| `infinity_advance` | Move to the next phase (refuses on a failing gate) |\n| `infinity_dashboard` | Start/stop/query the web view |\n| `infinity_unstuck` | What should I try next? (recommends; does not act) |\n| `infinity_rework` | Send a task and its dependents back to rework |\n| `infinity_replan` | Add what the plan was missing, mid-run |\n| `infinity_spawn_worker` | Attempt one task in a clean-room worker |\n| `infinity_goal` | State a goal, review it, or check which pass it is on |\n\nCommands worth knowing: `/infinity:run` starts the run, `/infinity:workers` shows the background\nsessions and their log, `/infinity:halt` stops everything and closes them, `/infinity:approve` signs\na phase that is waiting for you, and `/infinity:dashboard` opens the web view.\n\n## Layout\n\n```\ninfinity-harness/\n├── extensions/infinity-harness/   pi lifecycle adapter — thin, no logic of its own\n├── src/\n│   ├── core/                      types · paths · fsx · config · phases · gates · brief\n│   │                              · featureList (the SSOT) · lock · exec\n│   │                              · skills (match) · skillsAudit (guard)\n│   ├── ui/                        theme · planTree (the five levels, once)\n│   │                              · display (what to draw, and the templates)\n│   │                              · widget (terminal) · dashboard (web) · wizard · config\n│   ├── supervisor.ts              the orchestrator: which unit, which model, which session\n│   ├── exec/piWorker.ts           one background pi process, driven over RPC\n│   ├── loop.ts                    the continuous-run driver and its stop conditions\n│   ├── runState.ts                is a run armed, and which run is it — on disk, across sessions\n│   ├── handoff.ts                 when to continue in a fresh session, and what to tell it\n│   ├── workflow.ts                a mode per phase, the built-ins, and the ones you save\n│   ├── approval.ts · intake.ts    human sign-off · what the start-up wizard's answers mean\n│   ├── escalate.ts                the ladder's actuator: chooses a rung and takes it\n│   ├── goal.ts                    the outer loop: is the thing asked for actually done?\n│   ├── taskList.ts                atomic plan editor\n│   ├── worker.ts                  isolated per-task workers\n│   ├── modelRouter.ts             difficulty ladder + consultation\n│   ├── rework.ts · replan.ts      backward rework with BFS impact · mid-build amendment\n│   ├── unstuck.ts · review.ts     escalation strategy matrix · review bounce guard\n│   └── goalLoop.ts · goalState.ts · goalSpec.ts   goal state machine and its store\n├── harness/\n│   ├── features/feature-list.json the plan\n│   ├── config.json                pipeline state and settings\n│   ├── run.json                   the armed run — survives every session it spans\n│   ├── supervisor.json            which unit and which worker, right now\n│   ├── activity.json              the background log the widget and dashboard read\n│   ├── model-router.json          optional routing\n│   ├── docs/                      architecture · decisions · phase and role docs\n│   └── skills/                    28 craft skills the brief points at\n│\n│   ~/.pi/agent/infinity-harness/  the workflows and display templates you saved —\n│                                  they belong to you, not to a project\n├── tests/                         36 files, plain node:assert\n└── scripts/\n    ├── run-tests.mjs\n    ├── e2e.mjs                    17 scenarios, two of them against real pi processes\n    └── rig/                       the real-pi driver: a scripted model + the RPC protocol\n```\n\nThe extension is deliberately thin. Every decision lives in `src/`, where it's typed and tested —\nthere is one implementation, and the adapter calls it.\n\n## Development\n\n```bash\nnpm install\nnpm run check                    # tsc --noEmit, strict\nnpm test                         # 36 test files\nnpm run e2e                      # 17 end-to-end scenarios\nnpm run e2e -- --only realpi     # just the ones that drive a real pi process\nnpm run e2e -- --list            # what the scenarios are\n```\n\nTests are plain `node:assert` run under `--experimental-strip-types`. No framework, no build step.\n\nThe scenario worth knowing about is **`realpi`**. Everything else drives our own modules, or drives\nthe adapter against a *fake* pi — a fair test of our contracts and a poor test of pi's. Every bug\nthat has reached a user so far lived in the gap between the two: a BOM that made every config read\nfail, a run that ended at its first session handoff, a brief queued in a delivery mode that\ndeadlocks `pi -p`.\n\n`realpi` closes the gap. `scripts/rig/` starts a real `pi --mode rpc` against a scripted model\nserver and speaks the RPC protocol to it — typing prompts and slash commands, answering wizard\ndialogs, and reading back the widget and notifications a human would actually see. It covers\nstartup, the wizard, a run spanning several real sessions, real auto-compaction, an approval\nround-trip, and `pi -p` not hanging. When something is wrong in the product rather than in a\nmodule, this is the scenario that notices.\n\n## Licence\n\nMIT\n","readmeFilename":"README.md"}