{"_id":"agents-cron","_rev":"21-c2235772f09ac9070c3dc4c29406f78e","name":"agents-cron","dist-tags":{"latest":"0.16.1"},"versions":{"0.0.0-stage":{"name":"agents-cron","version":"0.0.0-stage","_id":"agents-cron@0.0.0-stage","stub":true,"maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"dist":{"shasum":"2c3d0e963b928da8c7e440a41ee904e0197b1534","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.0.0-stage.tgz","fileCount":2,"integrity":"sha512-QPOCZgGqQdsYHnHxpoPTSB5mDMSfrlkNFlry//atIYNhHePetEq0iVUAf4pYoTz1JECw4VOV61r2df4o/lGrZw==","signatures":[{"sig":"MEYCIQCdk7ZMbLfkwOZ3H7LwtL2f7lN0vpsMr//L4FVIN1zppwIhAINd6gf2cAJfMsOr7kuGxBP4QaDSwXUVQZ52kSyzzjyl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":333},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"description":"Temporary package placeholder for staged publishing","directories":{}},"0.6.0":{"name":"agents-cron","version":"0.6.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.6.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./src/agents/pi/extension.ts"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"d95452f423f76a2b47ce22eac7ed0bb98dd7970a","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.6.0.tgz","fileCount":36,"integrity":"sha512-uKszmFgRvjJ8tAMtbI0XBbn3s5Bk65icAPJdSAfMFnF2XkSvOaTB8QUxGAzttqqXuCpUAjolC5HW1SWKevnY/Q==","signatures":[{"sig":"MEUCICQdmS/IFsFEIUtEaCqJ7p0A18BcZJuN1E4mO9mM7fu1AiEA98ceNodIlXc5m/0TR7s4J2+BDw5lbLNZkJ3CDfZD/ss=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDJf8lYGBNys6ehsZLAX5rnQ3JFVgqfSOYLgR2eOB08fQIhAMsD5rKjL8AQ0MS62XMd7UnVDUij1/IEBY/z1MQ2io+U","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":268402},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"99a03161c4182107e85ed3814dc696f23b767ff1","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^0.85.1","@earendil-works/pi-coding-agent":"^0.85.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.6.0_1792332658181_0.19772274478945784","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"agents-cron","version":"0.7.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.7.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./src/agents/pi/extension.ts"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"d9fba55c385a9aa3488d00d003c3ca0e04e423ca","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.7.0.tgz","fileCount":36,"integrity":"sha512-Bj+cRHJ6S2jbZA182FdVh3kcUD/f+ZTcqUSU/sc+hqEaWwnWOXMf4acLuRj2FJPDmtxLDMGWRxZY9Rebso3NCQ==","signatures":[{"sig":"MEUCIHSiFB97Fg9+49QRAKFVs+7n62c3GIO5zibwZgo7G8ITAiEA4g161tJSVWfIQYym5oUWzHgfbT4WeQR3lhYOBZ8gjXo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD9iOu1GJtxB79VMXARP31KPD1Z2OZ69wUUZZmlcteeBwIgWeUOMfnidm7zq3eRAVtqeIGCaRCeCMES0Uvj547o8r8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":270626},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"a88356771118ed32302ec4bef74609b3caec5c5c","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^0.85.1","@earendil-works/pi-coding-agent":"^0.85.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.7.0_1792333456855_0.6665516504371696","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"agents-cron","version":"0.8.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.8.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./src/agents/pi/extension.ts"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"ce899656767462850949d07c1393e29a54970a31","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.8.0.tgz","fileCount":43,"integrity":"sha512-bF10DZYWoNsjZ9NwGdo0yc52YMXeQBeANzzVNXdedLPOvpBdJnxR8mvUDTXEk5BZNJvG+0HJsWSWS5CBPlOseQ==","signatures":[{"sig":"MEUCIFKZ78W0k537drVNXDUE4gKiGPMWalDQvWCDI3xpb8bGAiEA5N1ZhtescCinYf8KoHg5D4+Z3N7LSyCZyp5TTnEpy2M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDk/I1fKOCmsd1EDKDPCgl4oqCJ1BWAfXFeiPRlArAa3AiAQX5BMLJBob63wgg8RaEYY9Kzy1xTjgE3VoQZb54uipg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":337825},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"21c99061bd5bd0e6205390eb82afb0ac5fc5e86c","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@types/nodemailer":"^7.0.0","@earendil-works/pi-ai":"^0.85.1","@earendil-works/pi-coding-agent":"^0.85.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^7.0.0"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.8.0_1792338458384_0.9963919973074336","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"agents-cron","version":"0.8.1","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.8.1","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./src/agents/pi/extension.ts"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"6ea8cc9f6a94735106b6b1b9a58b64bdce5e429f","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.8.1.tgz","fileCount":43,"integrity":"sha512-nfCbFoJIVpepCKdyx8dFdqLcejbi5VMlLfsnJpNpgBC6u9RTLbwg58YIJqnSbW0NT3VrCp4evg2/l7OOA6yXAg==","signatures":[{"sig":"MEQCIAUb7FSh/5ZvVqf3VL2qOWbhpqxFmiuGFvEqekEsQd8rAiATWMxWY3fmIIO5/xbsdGoPvHaYsNM0VuuGtKo3UJA7Gw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICYEo0caOINured8DmM+HxB8pH8pIGJNFWE0xyOlN3lqAiAeAPJDzsSRJK+t1zrNnQ6gJMbq3WH4YCFHumFJX4Pktg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":338507},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"76a1b7965b645e1d0e688d20852f1d1a67b419ab","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@types/nodemailer":"^7.0.0","@earendil-works/pi-ai":"^0.85.1","@earendil-works/pi-coding-agent":"^0.85.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^7.0.0"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.8.1_1792339421866_0.5931711733898151","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"agents-cron","version":"0.8.2","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.8.2","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"2815b6e2dac192416e4a161542f3e0955fe1dc50","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.8.2.tgz","fileCount":44,"integrity":"sha512-0nPztrIaaH2dPAC/eZMuJ9lqmGxyVXZuPtPyusRulBBmgTD9DKDvo4+/ssPL08xpe4tAtB4XS+KZxeSKEvHV5w==","signatures":[{"sig":"MEYCIQDkYuEOC3VhBY9Gwp8a/vSSrmg+XASbWgjOxhnfQi5iagIhAI3uT3D7mjBowLIai4vnxh7k/GBcEuMQy66t92TMTlF5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDK4ThwlADr1SKlzeCELJl8HzI/gI8Hi0EqBoErZDBaDAIgOUzOd2mUi2wPPi+FIT7JeYYZh8Yq7iGDQVxWUIeBmt0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339328},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"f90a759ccd839098beeef551f8f7ca044b0589f2","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.8.2_1792340912742_0.7135493196668714","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"agents-cron","version":"0.9.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.9.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./extension.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"35230e838b4ebc1b8d7c8f5581bd68a6174bbb19","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.9.0.tgz","fileCount":47,"integrity":"sha512-gJa45WVzrKOjoGUn3RaOn3IREMjNmmckdPjHcA7oxV/csMSnDJ2ZCy1fo6/6GRYkBkBzm6fo6lM0ZT1jiQbfgA==","signatures":[{"sig":"MEQCIBc/NGLBFLD0qa1lOo9dPYVB2mxL45t9fjQYGa+qvYpZAiAvQrATDWJXakjVeT3liu/Z0n0AQKXd8bH4lCeXxxhz/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDXMpFLpLZQO1pxLVh8MFzAp8jglSRDXDDmbxjt+NJNqwIhAJa/GWFUYl3+ZW3btSii1lNBYE8YkGkwuKjXAY2joOuc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":359500},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"bcb190b8f882140542a8cc68c28a72bd6dc88461","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.19.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"24.22.1","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.9.0_1792649136972_0.5512084458493733","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"agents-cron","version":"0.9.1","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.9.1","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./extension.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"8909daca7ef419401918b524ba92644f9c06587f","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.9.1.tgz","fileCount":48,"integrity":"sha512-5R9FKk5IurWSvyGDgrlWJ7Re4ty1FQTHpB6L4jl90ouOxI5YeEep51CNggzMJNZDCUJYRCSbdCLTSvdruun8Pw==","signatures":[{"sig":"MEUCIQCHJv40+KpDhOW5lVrX4NP73D4lSpLewxoMhVk2Jr9vZQIgK6bAzdaJjrYKRVVCqn2acLvtcTnmAVjCo0WtxaJWRRw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDYUaF6EUNVPozJrP6hZTm9xbIrQnMchCzz+HkeDrPBdQIgTyYzWvmh7If1dgZJyPmZJ6Gv8v1L+vPN9r6STo6pxbY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":395341},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"12237bdfb9e5eef7770078e5ddaac15f33e5290b","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.19.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"24.22.1","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.9.1_1792651926364_0.0613504985106339","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"agents-cron","version":"0.10.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.10.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./extension.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"eca5e1331ed9af4ed6038b9631789c185c99b75c","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.10.0.tgz","fileCount":52,"integrity":"sha512-v2du+KdV0sxQHUDbudt57D0YsWo5YtQJ9fzwBVwAOZUs3WzvNxnnL2Hajd0oVnKCq9VVJGS2CGsk/ozMDMrMsg==","signatures":[{"sig":"MEUCIH+xNqB7aw5se2YqYtgNHIuWYjFAa0PLGjBSE9T660P9AiEAgSpVGi1NEhY7BwFLeR/hw0lkI6iVPdjl6qvSXWCHUSs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCMtW3ttZEWsOwrH3XMG8ltwPp8iXXOQ6XVAOVad5wXewIhALU0vIM5dP8DRudyzqOa1gI5F/RbNBxwYS9e+UAUVnF1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":432052},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"8b07bf13ce1fd51dd39f712afbcabb354969b6c0","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.10.0_1792683713529_0.7413684327055952","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"agents-cron","version":"0.10.1","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.10.1","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"bf6dff72985aa8212b852727d94f4043065e6a33","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.10.1.tgz","fileCount":52,"integrity":"sha512-wWcD9SbDBuX2YriQzFSjqVfwvl0DmuJ5WdZOtjjLlx8MhJBB8nQ1STkNJk7Z/Myk+RVhKyG85fNRyyPTb0wEPQ==","signatures":[{"sig":"MEYCIQDyuPIspV8/T1sBz7jNVx1+gAJftCq0dhHSEMphUhUMPAIhAOgQXj6NJwcFN4aEtFElKI7xVQ3/hWY7e3H1XfGDg+2W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCi7aMkj/yH1XzoNP+f0jfp/qZsNsWS+mY3B7oaQA1VygIhAL0wNFfCe2xJRv3+PX2MNiS+aLoq4wk4bK/Mu/zqs5nF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":432409},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"285bfd471a64362f92f8b49a8eb16f81a8bfc2b3","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.10.1_1792685162317_0.7176724036599229","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"name":"agents-cron","version":"0.10.2","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.10.2","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"8884b0c374d5a3d70fabce6679224e24fbbf2421","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.10.2.tgz","fileCount":52,"integrity":"sha512-YnlAedRb44vY1MhJ2kamyI+ZC1QnE1zZgBbxgxWxEaCn2VYCWObu0kpNA2WkGv7gPQJOd6YoqnyhS8PdKizcAQ==","signatures":[{"sig":"MEYCIQCdCmpQ34Ee+GbYa3B1yMkJmC/14qIkknWDQlfYHL1rsgIhAI4inbnA/oBtEI2zdfF8uUGH34iEx9tGF4iyG5Ug7Ace","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDdIK8Mge8grgM5illWzIlfWlaXF/OFlV/zLa02CLPnSAiEA39tzd4nwDnhzYTL6Tl1iUhTdMoPV5J5HJfSfdQg8/cw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":432409},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"7fd3cded98e18ae05fbe0bc207aaad52f9ac7944","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.19.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"24.22.1","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.10.2_1792717917690_0.3752879945209582","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"agents-cron","version":"0.11.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.11.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"c93e62d9f5d6e15623b5f39dcf40d82e4ca83884","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.11.0.tgz","fileCount":54,"integrity":"sha512-NeRE5+RbdmESBZvRXEUA7wKIP1Nfg048H05477Dy336/V0VqHrwLfTiGG4kdH+U9v20AbEdR4jtNMMlKHTxIEA==","signatures":[{"sig":"MEQCIBVVqMJXwTKSGguYQYFIXTrQU4hYSA/fH1EDGFU5P5jwAiBlDvAamXvC3zOCHdSith2o5W8ctcMqByZkERpSAUQZvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBDCmYLL2vYUeFMdTNf5u3kH+AOwoEXzE9f2zZaU3A9jAiEArZlunXqYiGoWliBkoFKkhptEC4mQZwIR3fXefGPHhWA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":444467},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"dcfe258a300e9a2eb58163e7b3bba251ed620cca","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.11.0_1793028354024_0.13829436756376423","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"agents-cron","version":"0.12.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.12.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"cad5a4469cffb6fe0194352029a83178e6157930","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.12.0.tgz","fileCount":54,"integrity":"sha512-ZJW+uKmbSajrl1oT34O2LUnPVdJVWNzUvEHKs+Ggy5sGj9PjRe0fZvQEdY3LDowSe9RDbFu2UsyUCjWPKaMW+g==","signatures":[{"sig":"MEUCIAvxfmGTHO6PFjPa+M2rlQHOC2OeQ0Wm2TzisZgCzaC+AiEAx/vUJLTb152eIsFhEL+IYZblbsKBBnUEc9xp1+MLK8w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCsnjEIps1tnXpwYcfBkjcSl8JVYNnHxSEJuglnipv0nAIhAPK8mdh/ZI1ijIQiUnK6W215WZiRbC8Q9RYyiOuumI+I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":449347},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"dcfe258a300e9a2eb58163e7b3bba251ed620cca","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.12.0_1793033954536_0.679950930271654","host":"s3://npm-registry-packages-npm-production"}},"0.12.1":{"name":"agents-cron","version":"0.12.1","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"MIT","_id":"agents-cron@0.12.1","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"bb1a263ba8d0ecde6ea48e0c1b6e3d17ab73ca45","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.12.1.tgz","fileCount":54,"integrity":"sha512-fB6/MlnFNO6zLTH5P0KDA+ocJf7gQteeLkkiqnEpeqbBbuVHD4o2lkfkipqPe3a5+7fsMx5pJxghnc19svuLYw==","signatures":[{"sig":"MEUCIFG2NGivEsuUaxDgTjKlJls+A6fG2lwZfU2HrzL8l9aCAiEA/G7sUpOYhoAHSKv5uBGm3ffNbK+b+R0Ajst0Oazu8Zc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCRgDtErYf1C3bmZIUT6BV0rZ1azTY+7EX2heWrRWcXgQIhAJeKgyoHS/BmB4lJLEybYpvb7G8TYuMDIB972HRoMwMY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":449915},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"77d735fafe18279671a135f9bdd74dc1db68cf24","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.12.1_1793034713902_0.6752010800334318","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"agents-cron","version":"0.13.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"AGPL-3.0","_id":"agents-cron@0.13.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"image":"https://raw.githubusercontent.com/fookhsu/agents-cron/main/assets/dashboard.png","skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"66bcb0250f4e88a5f88e597563934fc88ae65f6c","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.13.0.tgz","fileCount":55,"integrity":"sha512-0Z1sFBe6Ff3V/2lwDqxbNZe7C1FTPIU1SRwtDhSbD8goZ8MJFiddKkcWBrxPvTXenzVafNuB9ERqP4Pd67MARw==","signatures":[{"sig":"MEQCIFa22uQMMUNMt+7+JPDj8QhSbrI5jp9A85DeYNKnATpuAiBqOWdL5snw3+mplDbUT79zXSvBsZrM5BEF1AqtlEuQew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBQEXJDtprzNKKUuTiyIB+pWklSptKzcNTfujQiao3MzAiAq2bEEGr1mb8KCKQ67w5srnvhyvwxurGVRZHc5tMKipg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":497835},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"94250eccd21496979f727e852e265b9898ea1283","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.13.0_1793118734743_0.15009124683414166","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"agents-cron","version":"0.13.1","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"AGPL-3.0","_id":"agents-cron@0.13.1","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"image":"https://raw.githubusercontent.com/fookhsu/agents-cron/main/assets/dashboard.png","skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"3ea7fe81a3813c28e9e7465786970ff871b913c1","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.13.1.tgz","fileCount":55,"integrity":"sha512-8SrPAgNa3rkn2/sZx4fla+W+EYzuacrBwu+jFOcp4gZdXq5sxnrhWrUhyQPunepL8Ir7JB1lwavqoRejUmpotw==","signatures":[{"sig":"MEYCIQDuYKgk20Z+O6ilUIlKd/wZBgFeMy70yPhUVAmPj1d6lAIhAL/gB4mI7oTWevxWgMQTwMXipY1JRcdF2mrOdbYo2c+H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQChSTliK7m3pvP7fH+4/7C9zHa3EuCgnLwyrCJZhrMH8wIhALJYa9cYak239dHTHsDRm2S55Jg2icjRePOwZp6dGxOn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":499278},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"398aa0a3dd41a8ee6c9b5fedea1f297226faf9c2","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.13.1_1793120132424_0.26394632076454305","host":"s3://npm-registry-packages-npm-production"}},"0.13.2":{"name":"agents-cron","version":"0.13.2","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"AGPL-3.0","_id":"agents-cron@0.13.2","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"image":"https://raw.githubusercontent.com/fookhsu/agents-cron/main/assets/dashboard.png","skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"6a90489dddb0f2b8b770efcb0f35b07c428fbac0","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.13.2.tgz","fileCount":55,"integrity":"sha512-MQ61I4a80hzNNlyZMVs3owdIkz4yJ39hyDkwrQAwCd4eXsbVaa3i+HeviwU/9EhV082tijsZUl7FnJYGgAM1Vg==","signatures":[{"sig":"MEQCIGKZXr+oSlnGlr4OiXMGMD42tJiJr0XEf1U0QdjULv25AiBDKN+r1f6DP/JRkqDvFUMhqtDWdgGE7HbIJNuTJMIdHQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDYBARVpsn9cU5X3QqHeu82NQ7eIOAkHb4svxJF5xlE4QIgaWdoHLLeS25B98keICwv2Qu3H/DtY1nh4RXNMYmEeKY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":500443},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"539433133b9bdefd10eb87dcce246a0d64ff00bf","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.13.2_1793121454401_0.5526746927158266","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"agents-cron","version":"0.14.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"AGPL-3.0","_id":"agents-cron@0.14.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"image":"https://raw.githubusercontent.com/fookhsu/agents-cron/main/assets/dashboard.png","skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"8259ab36630cc13abff1dd2965261b074ee1311c","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.14.0.tgz","fileCount":56,"integrity":"sha512-qdY6CYujE4DXNqJrGGGA1UxPcVeRybAyc2buRRv6PML+msHGfyBZbAUOuZKs5jg+oEi5oYVfWfLYpATCkl9wUQ==","signatures":[{"sig":"MEUCIQCPgGOx8CV+KTqzGx6NdwHMYEKH0zEKz6Nu/6Q72siWdQIgdB0FgW7QndAk6n48hYALXDcDZtCGjNx11+P30ITGgbY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCX98YLOD5lwq1mbw/ztF6iDcVccmfti3quPcx75gVpSAIhAPijJi36qr3qwHR1uJ9Hljs95DKfrUnf68KpbFnw4h05","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":519960},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"cf37b0a83400bc053244f58b18af20ab0112e7ca","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.14.0_1793197233740_0.7460564021910917","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"agents-cron","version":"0.15.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"AGPL-3.0","_id":"agents-cron@0.15.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"image":"https://raw.githubusercontent.com/fookhsu/agents-cron/main/assets/dashboard.png","skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"6b8d20e663914bbf82301a6b6b79d42359ea8118","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.15.0.tgz","fileCount":58,"integrity":"sha512-9L6d/reF1qVGw019kxbzU7ZskMCbulEEK/Bk5qJ73hzXzfRrD/Vx3WjqYySCVxoZIaRmMkfp3mhiJABHdKsZ4w==","signatures":[{"sig":"MEQCIDNZXBvaMR6k9e8N2iKAbRDbgk6V32l4qOKR+ezc0d1lAiALZyIEyd8/EBRFLSOzsI+Qx108k1KUaSKMlZIQDNA3zQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDPmqHDEhB4JszvpfgJRNrnFp2GeKAwmqkd7LgxONe3AAiEA/YJlJEJd8YjzsKQI/qzyqw8rfEH3I4E94iOnno7M4fY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":533001},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"72ff7aa2be80c1f7deeed0df6dbd29b147f07a72","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.15.0_1793314236257_0.32752326331154724","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"agents-cron","version":"0.16.0","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"author":{"name":"fookhsu"},"license":"AGPL-3.0","_id":"agents-cron@0.16.0","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"homepage":"https://github.com/fookhsu/agents-cron#readme","bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"pi":{"image":"https://raw.githubusercontent.com/fookhsu/agents-cron/main/assets/dashboard.png","skills":["./skills"],"extensions":["./index.mjs"]},"bin":{"agents-cron":"bin/agents-cron.mjs"},"dist":{"shasum":"0b3fe48f655a99c2bd1e893c529508cd88976e54","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.16.0.tgz","fileCount":59,"integrity":"sha512-kk3Ld4PGNcRH30/SBN6NBsPWao1wPhmpUkTRCyF9PJkWX1iX/02IVUdGQf+49o2eWwNe3xxivZo6M44GQiwNIg==","signatures":[{"sig":"MEYCIQDvaKiAzdX+kdvd3FrEheOaX6vjJJE6WwYRfE/n92ybDQIhAIxv/zi1mX/x3z/Tmw+XFCaea5whp27XOCb/3eRKFJQQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEnJLzU/Oe2nUNoHja+XshH9MqDYfMSFYri6zJM9SPpDAiAg6SrEugkJkK099u9PMOge+nb0NvFQlF54UC7uqE/kiQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":570849},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"ef36e9b2ea8a0e19fdd8e49220c6f16f35954e57","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agents-cron_0.16.0_1793591910564_0.01947146420907364","host":"s3://npm-registry-packages-npm-production"}},"0.16.1":{"pi":{"image":"https://raw.githubusercontent.com/fookhsu/agents-cron/main/assets/dashboard.png","skills":["./skills"],"extensions":["./index.mjs"]},"_id":"agents-cron@0.16.1","bin":{"agents-cron":"bin/agents-cron.mjs"},"bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"dist":{"shasum":"bbc6a817ed494e419e13e072e4e0bab65f7c3a4a","tarball":"https://registry.npmjs.org/agents-cron/-/agents-cron-0.16.1.tgz","fileCount":59,"integrity":"sha512-DU8Wo2r4M2FJYcbVHDDtEJMvrk2bs7SUuVkC1owOtKqrBAqkjeH/RISrRWAxMP5xrBTPAaYKNLIIpgmi4moYZQ==","signatures":[{"sig":"MEYCIQDvtKR+/xkWZZ2cP+GcV4iGbmtg4kUcc029jlMpN0IjRAIhAJQvuXHZlT59NciUO3ucvcJPloaGaX+eA8oohKZgeVt9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDelBQymmJFt9jwsXNpc3fH+OLLFNFz6gjyPUO7NDeJ3gIhAJUHZiyRAoIxC9Iu9o1moiV7tygPyiExCnxRP1+5XAvM"}],"unpackedSize":572203},"name":"agents-cron","type":"module","author":{"name":"fookhsu"},"engines":{"node":">=22.19.0"},"gitHead":"d845bdcbfd62af38780ac837f517c7bf64c2f5b9","license":"AGPL-3.0","scripts":{"test":"node --test \"tests/**/*.test.ts\"","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit","prepublishOnly":"npm run check"},"version":"0.16.1","_npmUser":{"name":"fookhsu","email":"fookhsu@foxmail.com"},"homepage":"https://github.com/fookhsu/agents-cron#readme","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"_npmVersion":"11.11.1","description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","directories":{},"maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"_nodeVersion":"25.8.2","dependencies":{"croner":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.30","typescript":"^5.9.0","@types/node":"^24.0.0","@earendil-works/pi-ai":"^1.3.0","@earendil-works/pi-coding-agent":"^1.3.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"nodemailer":"^10.1.6"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/agents-cron_0.16.1_1793802606147_0.40011907850662876"}}},"time":{"created":"2026-10-18T14:08:19.278Z","modified":"2026-11-04T14:30:06.560Z","0.0.0-stage":"2026-10-18T14:08:19.278Z","0.6.0":"2026-10-18T14:10:58.286Z","0.7.0":"2026-10-18T14:24:16.948Z","0.8.0":"2026-10-18T15:47:38.506Z","0.8.1":"2026-10-18T16:03:42.031Z","0.8.2":"2026-10-18T16:28:32.847Z","0.9.0":"2026-10-22T06:05:37.127Z","0.9.1":"2026-10-22T06:52:06.478Z","0.10.0":"2026-10-22T15:41:53.632Z","0.10.1":"2026-10-22T16:06:02.446Z","0.10.2":"2026-10-23T01:11:57.922Z","0.11.0":"2026-10-26T15:25:54.111Z","0.12.0":"2026-10-26T16:59:14.658Z","0.12.1":"2026-10-26T17:11:54.039Z","0.13.0":"2026-10-27T16:32:14.854Z","0.13.1":"2026-10-27T16:55:32.516Z","0.13.2":"2026-10-27T17:17:34.495Z","0.14.0":"2026-10-28T14:20:33.856Z","0.15.0":"2026-10-29T22:50:36.346Z","0.16.0":"2026-11-02T03:58:30.676Z","0.16.1":"2026-11-04T14:30:06.249Z"},"bugs":{"url":"https://github.com/fookhsu/agents-cron/issues"},"author":{"name":"fookhsu"},"license":"AGPL-3.0","homepage":"https://github.com/fookhsu/agents-cron#readme","keywords":["pi-package","pi","pi-extension","scheduler","cron","task-scheduler","automation"],"repository":{"url":"git+https://github.com/fookhsu/agents-cron.git","type":"git"},"description":"Cron-driven scheduled prompt tasks, each run in an isolated agent session","maintainers":[{"name":"fookhsu","email":"fookhsu@foxmail.com"}],"readme":"# agents-cron\n\nCron-driven scheduled prompt tasks for coding agents, with [Pi](https://pi.dev)\nas the built-in agent.\n\nPi is the management surface; the `agents-cron` CLI is the execution surface. A\ncron entry invokes `agents-cron run-due`, which drives each due task through an\n**Agent Adapter** — the Pi adapter creates a fully isolated **Task Session** per\nrun. The plugin never schedules itself and never injects task output into your\ninteractive Pi session.\n\n## Design\n\n**Time is not ours.** The scheduler never wakes itself up: no timer, no daemon,\nno long-running process. An external scheduler (cron) decides when to look, and\n`run-due` answers one question — what is due *now*? — then exits.\n\n**One run, one session.** Every Task Run gets a fresh, isolated session file.\nTask output is never injected into your interactive session; `/schedule open`\nprints the path so you can open it deliberately.\n\n**The store is the only shared state.** Pi is the management surface and the CLI\nis the execution surface, and they never call each other. They meet in\n`<project>/.agents/cron/`, which is why Pi and cron can be set up in either\norder, and why a scheduled run still works with Pi closed. The dashboard is a\nthird surface, and it only reads.\n\n**Deciding is not executing, and neither is agent-specific.** The core owns\nscheduling, storage, locking, and run records. An Agent Adapter owns exactly one\nruntime. Adding an agent means adding an adapter directory and one\n`registerAgent` line; the runner, store, CLI, and Pi surface stay untouched.\n\n**Borrow the runtime instead of rebuilding it.** A Task Session is a real\nheadless run of the task's agent — `pi --print`, `claude --print`, or\n`codex exec` — so the model, credentials, and project-trust rules are the ones\nyou already configured, not a second copy of an SDK that can drift.\n\n**Ship what you run.** The published package contains the TypeScript sources it\nexecutes. There is no build artifact that can go stale and no `dist/` that can\ndiffer from the code you reviewed.\n\n```text\n  management surface (a Pi session)   execution surface (cron)\n  ───────────────────────────────     ──────────────────────────────────\n  /loop  /remind  /schedule           agents-cron run-due\n  schedule_task tool                  │  acquires run.lock\n        │ task-service                ▼\n        │                             Task Runner\n        │                             due filter · nextRunAt · stale reclaim\n        │                             │  resolve (lazy)\n        │                             ▼\n        │                             Agent Registry → pi · claude · codex\n        │                             │  spawn one headless agent run\n        │                             ▼\n        │                             one isolated Task Session per run\n        │                             │\n        ▼                             ▼\n  ┌─────────────────────────────────────────────────────────────────────┐\n  │  <project>/.agents/cron/     the only state the two surfaces share  │\n  │  tasks.json   run.lock   runs/<runId>.json   sessions/<taskId>/…   │\n  └─────────────────────────────────────────────────────────────────────┘\n```\n\n### Boundaries\n\n| Component | Owns | Never does |\n| --- | --- | --- |\n| Task Runner (`src/runner.ts`) | due-ness, the run lock, run records, `nextRunAt` | schedule itself, import an agent SDK, know which agents exist |\n| CLI (`src/cli.ts`) | argv → task service / runner, exit codes | manage your crontab, run an agent inline |\n| Agent Registry (`src/agents/`) | agent id → adapter, loaded lazily | know how any agent actually runs |\n| Agent adapters (`src/agents/*/adapter.ts`) | spawning the agent binary, the session record, runtime concerns | read or write the scheduler store |\n| Pi surface (`src/agents/pi/`) | commands, the `schedule_task` tool, confirmations | schedule, lock, or execute anything |\n| Store (`.agents/cron/`) | tasks, runs, sessions, the lock | hold run state inside `tasks.json` |\n\n### Interactions\n\n**cron → execution.** Cron runs `agents-cron run-due`. The Task Runner takes the\nrun lock, reclaims stale runs, filters tasks by `isDue`, and drives each one\nthrough its adapter, which spawns one headless agent process. Each attempt\nwrites its own run record and advances `nextRunAt`. The lock covers the whole\npass, so a second invocation exits `0` reporting that another instance holds the\nlock instead of queueing.\n\n**Pi → management.** `/loop`, `/remind`, `/schedule …`, and the `schedule_task`\ntool go through the task service into `tasks.json`. The extension is\ndeliberately inert inside a Task Session (see `AGENTS_CRON_TASK_SESSION`), so a\nscheduled run cannot schedule more work — no accidental fan-out.\n\n**Pi ↔ store ↔ CLI.** The two surfaces only ever meet in the store.\n`/schedule run <id>` and `agents-cron run <id>` both execute the same task with\ntrigger `manual` and leave its schedule untouched.\n\n## Features\n\n- One-time, interval, and cron schedules\n- One isolated Task Session per run, stored as its own session file\n- Agent adapter layer: Pi, Claude Code, and Codex built in, new agents added without touching the core\n- Local read-only dashboard for observing tasks and run history\n- Global task registry (`~/.agents/cron/`) with project-local run artifacts — every task visible from any directory, its own project's tasks listed first\n- Idempotent `run-due` with a project run lock and per-run records\n- Crash recovery: stale runs are reclaimed on the next invocation\n- Per-task and per-project configuration overrides\n- Per-run Markdown reports next to the run records — what ran, how it went, where the transcript lives\n- Agent tool plus slash commands for management, with argument completion: `/schedule ` suggests actions and real task/run ids, `/loop` suggests cron nicknames (`@daily`, …), and every creation command completes its trailing `--to <channel>` / `--notify <level>` / `--thinking <level>` flags from the project's notify config\n- Per-task model configuration: pin `model` and `thinking` at creation or later (`agents-cron set`, `/schedule set`, `schedule_task update`), with the thinking level validated up front\n\n## Install\n\n```bash\n# From npm (recommended)\npi install npm:agents-cron\n\n# Or from a checkout\npi install .\n```\n\nRequires Node `>=22.19.0`. The package ships TypeScript and runs it as-is — no\nbuild step, no `dist/`. Pi loads the extension through its own TypeScript\nloader; the CLI registers a small loader hook of its own, because Node refuses\nto strip types for files under `node_modules` (see [Development](#development)).\n\nPreviously published as `@fookhsu/pi-scheduler`. The rename is mechanical for\nexisting setups: the old package forwards to this one, the `pi-scheduler` bin\nkeeps working, and pre-rename `PI_SCHEDULER_*` environment variables are still\nhonored. Since 0.7.0 the store lives at `.agents/cron/` (was `.pi/scheduler/`);\nthe first run after upgrading copies it over automatically and leaves the old\ncopy in place, so crontabs and existing projects keep running untouched.\n\nSince 0.9.0 task definitions live in the global registry at\n`~/.agents/cron/tasks.json` (ADR 0007), bound to their project; run records\nand sessions stay in each project's `.agents/cron/`. The first command that\ntouches a project imports its old `tasks.json` into the registry and renames\nit aside — rolling back is renaming the file back and reinstalling 0.8.x.\nPer-project crontab lines keep working as project-scoped passes; replace them\nwith the one global line when convenient.\n\nRestart Pi or run `/reload` after installing. Installed with `pi install -l`,\nthe package is recorded in the project's `.pi/settings.json` instead of your\nuser settings.\n\n## Cron setup\n\n`run-due` is the only execution entry point, and the CLI never manages your\ncrontab. One global line drives every project's tasks (ADR 0007: task\ndefinitions live in the machine-wide registry at `~/.agents/cron/`):\n\n```cron\n*/5 * * * * AGENTS_CRON_PI_BIN=/absolute/path/to/pi \"$HOME/.pi/agent/npm/node_modules/.bin/agents-cron\" run-due --all >> \"$HOME/.agents/cron/cron.log\" 2>&1\n```\n\nA project-scoped line (`cd /path/to/project && … run-due`) still works: it\nruns only that project's due tasks, under the same per-project run lock, so\nthe two line styles cannot double-execute within one tick. Migrate old\nper-project lines to the single global line when convenient.\n\nProject installs put the binary at `.pi/npm/node_modules/.bin/agents-cron`\ninstead. If you linked it onto your `PATH`, plain `agents-cron` works.\n\nRunning a task spawns the `pi` executable, and cron starts jobs with a minimal\n`PATH` that usually does not include it. Either set `PATH=` at the top of the\ncrontab, or point `AGENTS_CRON_PI_BIN` at `pi` — the command above does the\nlatter. A missing `pi` is reported on the run record, not silently skipped.\nTasks pinned to the Claude Code adapter spawn `claude` instead; the same\nminimal-`PATH` rule applies, with `AGENTS_CRON_CLAUDE_BIN`.\n\n## CLI\n\n```text\nagents-cron run-due [--project <path>|--all] [--agent <id>]   # cron entry point\nagents-cron run <taskId> [--project <path>] [--agent <id>]\nagents-cron list [--json]                              # current project first, then others\nagents-cron show <taskId> [--json]                     # one task in full, prompt included\nagents-cron add --prompt <text> (--at <iso>|--every <duration>|--cron <expr>) [--agent <id>] [options]\nagents-cron set <taskId> [options]                   # reconfigure: --model --thinking --agent --cwd --tools --name --notify\nagents-cron enable <taskId> | disable <taskId> | remove <taskId>\nagents-cron clear                                      # remove every task bound to the current project\nagents-cron export [--out <file>] [--all] [taskId...]  # task definitions as JSON\nagents-cron import <file> [--dry-run]                  # new tasks bind here, start disabled\nagents-cron prune [--keep <n>]                         # all projects unless --project; default keep 20\nagents-cron dashboard [--port <n>]                     # foreground, global view grouped by project\nagents-cron dashboard start|stop|status [--port <n>]   # detached lifecycle\nagents-cron migrate-sessions [--dry-run] [--project <path>]   # legacy transcripts into Pi's store\nagents-cron test-notify [--channel <id>]\n```\n\n`--agent` selects the agent adapter (see [Agents](#agents)); it sets the task's\nagent on `add` and the fallback agent on `run-due` and `run`. `set`\nreconfigures an existing task's definition — model, thinking level, agent,\ncwd, tools, name, notify level, and routing — without touching its schedule\nor run history; an empty value clears the override back to the project and\nuser defaults (`--model=`, `--thinking=`, `--tools=`, `--notify=`).\n\nTasks live in the global registry, so `run`, `enable`, `disable`, and\n`remove` act on any task from any directory; `add` binds the task to the\nproject it runs in (`--project` to bind elsewhere, `--cwd` to override only\nthe run's working directory). `list` prints one ordered list — the current\nproject's tasks first, then every other project grouped under a header, with\n`⚠ missing directory` on tasks whose project has moved or vanished.\n\nExit codes: `0` success (including \"no due tasks\" and \"another instance holds\nthe lock\"), `1` at least one task failed, `2` configuration or storage error.\n\n### Export and import\n\n`export` writes a **Task Export**: a versioned JSON file of task definitions\nand nothing else — no ids, no project bindings, no registry state or run\nhistory. `import` turns each entry into a fresh task bound to the current\nproject, **disabled by default** (imported prompts will run with your\ncredentials — review, then `enable` each task). An entry is skipped as a\nduplicate only when name, prompt, and schedule all match an existing task of\nthe project, so importing the same file twice adds nothing.\n\n`export` prints to stdout (pipe it anywhere) or writes a file with `--out`;\n`--all` spans every project for a whole-machine backup, and the file still\ncarries no paths — restoring on a new machine binds everything to the\ndirectory you import from. `import --dry-run` prints the identical report\nwithout writing.\n\n### The global task list\n\nInstall the CLI once (`npm install -g agents-cron`) and it manages every\nproject's tasks from any directory. `list` prints one ordered view — the\ncurrent project's tasks first, then every other project grouped under a\nheader with its path spelled out. Tasks whose project moved or vanished stay\nvisible under a `⚠ missing directory` marker instead of disappearing:\n\n![agents-cron list in ~/demo/webapp showing the project's ci-watch and nightly-audit tasks first, then a blog project group with weekly-digest, then an old-api group whose db-backup task is marked missing directory](assets/list.png)\n\n`add` binds a task to the project it runs in (`--project` binds it elsewhere,\n`--cwd` only overrides the run's working directory). `run`, `enable`,\n`disable`, and `remove` accept any task id from any directory, and `run <id>`\nexecutes with the owning project's lock, writing artifacts there. Full run\nhistories and session transcripts stay in each project's `.agents/cron/` —\nthe registry carries only definitions, scheduling state, and counters.\n`show <taskId>` prints one task in full — project binding, schedule, run\ncounters, and the prompt verbatim — and accepts an id prefix like every\nid-taking command.\n\n## Dashboard\n\n`agents-cron dashboard` serves a read-only web view of the same store the CLI\nreads: every task with its next run, its latest outcome, per-task run history,\nand each run's summary, error, and session record. Clicking a task opens its\ndetail panel, where a collapsed **show prompt** toggle reveals the stored\nprompt behind the run history. It binds to `127.0.0.1`\nonly (default port 7383, `--port` to change), starts on demand, auto-refreshes\nevery few seconds, and stops with Ctrl-C. Because it never writes, it takes no\nrun lock and never interferes with cron's `run-due` — leave it open in a tab\nall day if you like.\n\n![agents-cron dashboard showing four tasks across the pi, claude, and codex adapters, with a run history including one error and one in-flight run](assets/dashboard.png)\n\n**Dashboard lifecycle.** `agents-cron dashboard start` (or `/schedule dashboard`)\nruns the server as a detached child owned by the project's registration file,\n`.agents/cron/dashboard.json`. It outlives the shell and the Pi session, so\nyou can leave it watching cron runs with Pi closed; `dashboard stop` reclaims\nit after checking the port still answers like this dashboard, so a recycled\nPID is never killed — the refusal names what that pid currently runs, so you\ncan judge whether it really is a reused PID. A registration whose process is\ngone self-heals the next time anything asks for status. Its output goes to\n`.agents/cron/dashboard.log`.\n\n## Notifications\n\nFirst-time setup is a guided wizard — `agents-cron setup-notify` opens the\nmail and Feishu consoles for you, captures the SMTP authorization code and\nbot webhook URL, writes the config, wires your shell and crontab, and\nlive-tests every channel.\n\nRuns can announce themselves. Channels live in `.agents/cron/config.json`\n(user-authored — `chmod 600` it, webhook tokens and SMTP hosts belong behind\nfile permissions), and by default only **failed** runs notify:\n\n```json\n{\n  \"version\": 1,\n  \"notifications\": {\n    \"on\": \"error\",\n    \"channels\": [\n      { \"id\": \"team\", \"type\": \"webhook\", \"url\": \"https://hooks.slack.com/services/…\",\n        \"headers\": { \"Authorization\": \"Bearer …\" } },\n      { \"id\": \"mail\", \"type\": \"email\", \"host\": \"smtp.example.com\", \"port\": 465,\n        \"user\": \"cron@example.com\", \"from\": \"cron@example.com\", \"to\": \"you@example.com\" }\n    ]\n  }\n}\n```\n\n- `on` is the project default — `error` (default), `always`, or `never` — and a\n  task overrides it with `notify` (`agents-cron add --notify always …`).\n- A task can also **route** its notifications: `notifyTo` names the channel ids\n  it announces on, and a task without it notifies every configured channel —\n  unless the project sets a default route: `\"defaultTo\": [\"feishu\"]` applies to\n  every task that names no channels of its own, and a task's `notifyTo` still\n  wins. Route with `agents-cron add --notify-to feishu,mail …`, or in Pi with a\n  trailing flag: `/remind in 45m review the release --to feishu --notify always`.\n  Channel ids resolve against this project's config — an unknown id is warned\n  about (at `add` time and at dispatch) and skipped, never fatal.\n- Channels are optional: a run that would announce with none configured writes\n  one reminder to stderr (which lands in the cron log) — nothing fails, no\n  setup is forced. `agents-cron setup-notify` adds channels whenever you want\n  them.\n- **webhook** works with anything that accepts a POST: Slack, Lark, Discord,\n  n8n, a home-rolled endpoint. The default body is JSON\n  (`{source, project, task, run…}`); `format: \"text\"` posts the human summary.\n- **system** shows the run as a desktop notification — macOS Notification\n  Center (`osascript`, optional `sound`) or Linux `notify-send`. No external\n  service needed, so it is the lightest way to make reminders perceptible:\n  `{ \"id\": \"mac\", \"type\": \"system\", \"sound\": \"Glass\" }`.\n- **email** speaks plain SMTP (Gmail, QQ, 163, self-hosted). The password\n  comes from the environment, never the config file: `AGENTS_CRON_SMTP_PASSWORD`\n  by default, or the channel's `passwordEnv`. The optional `nodemailer`\n  dependency is loaded only when an email channel is configured.\n- Delivery is best effort with a 10s budget per channel: a broken webhook\n  prints one line to the cron log and never fails the run it reports on.\n- `agents-cron test-notify` sends a sample run through every configured\n  channel (or one, with `--channel <id>`) so the setup can be verified without\n  waiting for a real failure.\n\n## Pi commands\n\n```text\n/loop 30m check CI status\n/loop \"*/5 * * * *\" check CI status\n/loop @daily check CI status\n/remind in 45m review the release\n/remind at 15:30 check production\n/schedule add 30m check CI status\n/schedule add \"0 9 * * 1-5\" check CI status\n/remind in 45m review the release --to feishu --notify always\n/schedule add 30m check CI status --to feishu,mail\n/schedule add 30m triage the inbox --model sonnet:high --thinking low\n/schedule set <id> --model anthropic/claude-opus-4-5 --thinking high\n/schedule set <id> --thinking -                    # clear back to the defaults\n/schedule list\n/schedule enable <id>\n/schedule disable <id>\n/schedule run <id>\n/schedule remove <id>\n/schedule runs <id>\n/schedule open <runId>\n/schedule dashboard                    # start the detached dashboard\n/schedule dashboard stop|status        # reclaim it, or see where it runs\n/schedule export [file]              # definitions to agents-cron.tasks.json\n/schedule export --all               # every project's definitions\n/schedule import <file>              # new tasks here, disabled until enabled\n/schedule clear\n/schedule help\n```\n\n`/loop` and `/schedule add` take a schedule first: a duration (`30m`), a cron\nnickname (`@daily`), or a cron expression in quotes. Quote an expression\nwhenever it contains spaces, otherwise its first field is read as the start of\nthe prompt. Nicknames are `@yearly`, `@annually`, `@monthly`, `@weekly`,\n`@daily`, and `@hourly`.\n\n`/loop`, `/remind`, and `/schedule add` also accept trailing flags after the\nprompt: `--to <id,id>` routes the task's notifications to those channels, and\n`--notify always|error|never` sets its level — so\n`/remind in 45m review the release --to feishu --notify always` reaches you on\nFeishu the moment the run finishes. The same position pins the run's model:\n`--model <id>`, `--thinking <level>`, and `--agent <id>`.\n\n`/schedule set <id> <flags>` reconfigures an existing task with the same\nfields — `--model`, `--thinking`, `--agent`, `--name`, `--cwd`, `--tools a,b`,\n`--notify <level>`, `--to <ids>` — without touching its schedule or run\nhistory. A value of `-` clears a field back to the project and user defaults.\nFlag names and `--thinking` levels complete as you type.\n\n`/schedule open <runId>` prints the Task Session file path and suggests\n`pi --session <path>`. Task Sessions are never merged into the current session.\n`/schedule help` (or any unknown action) prints the full action list.\n\n## Agent tool\n\nThe `schedule_task` tool supports `add`, `update`, `list`, `show`, `enable`,\n`disable`, `delete`, `run`, `runs`, and `clear`. It is registered with\n`deferred` exposure: it stays out of the resident tool manifest until the\nmodel finds it with pi's built-in `tool_search`, which the extension activates\non session start. On pi versions without deferred exposure the tool simply\nregisters as before.\n\n```json\n{\n  \"action\": \"add\",\n  \"name\": \"check-ci\",\n  \"prompt\": \"检查当前项目 CI 是否通过；如果失败请分析原因\",\n  \"schedule\": { \"kind\": \"interval\", \"every\": \"30m\" },\n  \"notify\": \"always\",\n  \"notifyTo\": [\"feishu\"]\n}\n```\n\n`notify` sets the task's notification level and `notifyTo` routes it to named\nchannels from `.agents/cron/config.json`; both are optional and independent.\n`update` reconfigures an existing task by `id` with the same fields — pass\n`model: \"\"` (or an empty `tools`/`notifyTo` array) to clear an override:\n\n```json\n{\n  \"action\": \"update\",\n  \"id\": \"task_a1b2c3d4\",\n  \"model\": \"anthropic/claude-opus-4-5\",\n  \"thinking\": \"high\"\n}\n```\n\nDeleting and clearing tasks requires interactive confirmation; creating a task does not. The `/schedule remove` and `/schedule clear` commands ask for the same confirmation.\n\n## Configuration and overrides\n\nEvery `AGENTS_CRON_*` variable below also answers to its pre-rename\n`PI_SCHEDULER_*` spelling; the new name wins when both are set.\n\nA Task Session is an ordinary Pi session: it runs in the task's `cwd` (the\nproject root by default) and loads that project's settings, `AGENTS.md`, skills,\nand extensions. You can override what it uses at two levels.\n\nBecause the Task Runner is invoked by cron, a Task Session is always headless:\nit is a `pi --print` process, so it resolves project trust exactly like any\nother non-interactive Pi run — the saved decision in `~/.pi/agent/trust.json`,\notherwise `defaultProjectTrust`, which leaves a project with project-local\nresources untrusted. An untrusted project contributes no `.pi/settings.json`,\nskills, prompts, or extensions to its Task Sessions; run `/trust` in that\nproject once (or set `defaultProjectTrust` to `\"always\"`) to change that.\n`AGENTS.md` is not gated by project trust and loads either way.\n\nResolution order, highest priority first:\n\n1. Per-task fields (`agent`, `model`, `thinking`, `cwd`, `tools`).\n2. Project settings in `<project>/.pi/settings.json`.\n3. User settings in `~/.pi/agent/settings.json`.\n\n### Override a run with `.pi/settings.json`\n\nProject settings merge over global settings, so a repository can pin the model\nthat scheduled work uses without touching your global default:\n\n```json\n{\n  \"defaultProvider\": \"deepseek\",\n  \"defaultModel\": \"deepseek-v4-flash\",\n  \"defaultThinkingLevel\": \"low\"\n}\n```\n\nThe same file can disable scheduler resources for a project that should not run\nscheduled tasks, using the package-filter object form:\n\n```json\n{\n  \"packages\": [\n    {\n      \"source\": \"npm:agents-cron\",\n      \"extensions\": [],\n      \"skills\": []\n    }\n  ]\n}\n```\n\nProject overrides only apply after the project is trusted; commit\n`.pi/settings.json` to share them with your team. `pi config -l` opens the same\nfile in an editor with inherited global resources dimmed.\n\n### Override one task\n\nAny task can override the agent, model, thinking level, working directory, and\ntool allowlist. In `.agents/cron/tasks.json`:\n\n```json\n{\n  \"id\": \"task_a1b2c3d4\",\n  \"name\": \"daily-audit\",\n  \"prompt\": \"检查 CI 并分析失败原因\",\n  \"schedule\": { \"kind\": \"cron\", \"expression\": \"0 9 * * *\" },\n  \"agent\": \"pi\",\n  \"model\": \"anthropic/claude-opus-4-5\",\n  \"thinking\": \"high\",\n  \"cwd\": \"packages/api\",\n  \"tools\": [\"read\", \"bash\", \"grep\"],\n  \"enabled\": true,\n  \"nextRunAt\": \"2026-09-11T09:00:00.000Z\",\n  \"createdAt\": \"2026-09-10T09:00:00.000Z\",\n  \"updatedAt\": \"2026-09-10T09:00:00.000Z\"\n}\n```\n\n`cwd` is resolved relative to the project root. Omitting a field falls back to\nthe project and user settings; omitting `tools` keeps the agent's default tool\nset. Omitting `agent` uses the adapter that `run-due` selected (the built-in Pi\nadapter by default).\n\nThe same overrides are available on the CLI and the Agent tool, and can be\nchanged after creation:\n\n```bash\nagents-cron add \\\n  --prompt \"检查 CI 并分析失败原因\" \\\n  --cron \"0 9 * * *\" \\\n  --agent pi \\\n  --model anthropic/claude-opus-4-5 \\\n  --thinking high \\\n  --cwd packages/api \\\n  --tools read,bash,grep\n\n# reconfigure an existing task; an empty value clears the override\nagents-cron set task_a1b2c3d4 --model sonnet --thinking xhigh\nagents-cron set task_a1b2c3d4 --model= --thinking=\n```\n\nIn Pi, the same fields are trailing flags on the creation commands\n(`/loop 30m triage --model sonnet --thinking low`) and `/schedule set <id>`\nflags afterwards. `--thinking` accepts the levels Pi does — `off`, `minimal`,\n`low`, `medium`, `high`, `xhigh`, `max` — and is validated when the task is\nwritten, so a typo fails the `set` instead of every 3 a.m. run. A model id\nmay carry Pi's `:level` shorthand (`sonnet:high`); Claude Code and Codex\nignore `thinking`.\n\n```json\n{\n  \"action\": \"add\",\n  \"prompt\": \"检查 CI 并分析失败原因\",\n  \"schedule\": { \"kind\": \"cron\", \"expression\": \"0 9 * * *\" },\n  \"agent\": \"pi\",\n  \"model\": \"anthropic/claude-opus-4-5\",\n  \"thinking\": \"high\",\n  \"cwd\": \"packages/api\",\n  \"tools\": [\"read\", \"bash\", \"grep\"]\n}\n```\n\n## Agents\n\nThe scheduler core — scheduling, storage, locking, run records — never imports\nan agent SDK. Running a task goes through an **Agent Adapter**: a small object\nthat knows how to drive one Task Run in a concrete runtime.\n\n```ts\nexport interface AgentAdapter {\n  readonly id: string;          // e.g. \"pi\"\n  readonly displayName: string;\n  run(request: AgentRunRequest): Promise<AgentRunResult>;\n}\n```\n\nAdapters register lazily, so an unused agent runtime is never loaded. Adding an\nagent means adding `src/agents/<id>/adapter.ts` and one `registerAgent` line in\n`src/agents/builtin.ts`; the runner, CLI, storage, and Pi surface stay\nuntouched. The Pi adapter lives in `src/agents/pi/` together with the Pi\nextension, tools, and slash commands.\n\nThe Pi adapter drives a Task Run by spawning `pi --print --session <file>` in the\ntask's `cwd`, and reports the printed answer as the run summary. It imports no\nPi SDK, so a Task Run works from a bare `node` process — which is what cron is.\nThe spawned `pi` is also the runtime that owns the model, credentials, and\nproject-trust rules, so a scheduled run behaves like any other non-interactive\nPi run. The only requirement is that `pi` be reachable: see\n[Configuration and overrides](#configuration-and-overrides) and\n`AGENTS_CRON_PI_BIN`.\n\n### Claude Code\n\nThe Claude Code adapter drives a Task Run by spawning\n`claude --print --output-format json` in the task's `cwd`, and records the JSON\nresult — final message, Claude Code session id, usage — as the run's session\nrecord at `.agents/cron/sessions/<taskId>/<runId>.json`. Claude Code keeps its\nown transcript; `claude --resume <session_id>` reopens it.\n\nTwo behavior differences from the Pi adapter:\n\n- A headless Claude Code run cannot approve permission prompts, so a tool the\n  task did not allow is denied, not asked. Set `tools` on tasks that need to\n  write or execute: the task's tool list maps to `--allowedTools`.\n- `thinking` has no Claude Code equivalent and is ignored.\n\nThe `claude` binary is resolved like `pi`: `AGENTS_CRON_CLAUDE_BIN` first,\nthen `$PATH`. Pin it in the crontab the same way.\n\nPi remains the management surface: `/schedule`, `/loop`, and `/remind` still\nmanage the same store, and `schedule_task` gains an `agent` field to pin a task\nto a specific adapter.\n\n### Codex\n\nThe Codex adapter drives a Task Run by spawning\n`codex exec --json --skip-git-repo-check --output-last-message <tmp>` in the\ntask's `cwd`, and records exit code, final message, and the JSONL event tail as\nthe run's session record at `.agents/cron/sessions/<taskId>/<runId>.json`.\nCodex keeps its own transcript under `~/.codex/sessions/`.\n\nTwo behavior differences from the other adapters:\n\n- A task without `tools` runs in a `read-only` sandbox; a task with any `tools`\n  runs `workspace-write`. Codex has no per-tool allowlist — `codex exec` fixes\n  its approval policy at \"never\", so the sandbox decides what a headless run\n  may touch, and it can never block on an approval prompt.\n- `thinking` has no Codex equivalent and is ignored.\n\nThe `codex` binary is resolved like the others: `AGENTS_CRON_CODEX_BIN` first,\nthen `$PATH`. Pin it in the crontab the same way.\n\nPi remains the management surface: `/schedule`, `/loop`, and `/remind` still\nmanage the same store, and `schedule_task` gains an `agent` field to pin a task\nto a specific adapter.\n\n## Storage and recovery\n\n```text\n~/.agents/cron/                       # the global Task Registry (ADR 0007)\n├── tasks.json                        # version 2: every task + scheduling state, 0600\n├── registry.lock                     # short-lived registry write lock, 0600\n└── cron.log                          # redirect target for the global crontab line\n\n<project>/.agents/cron/               # run artifacts, one store per project\n├── config.json                       # optional notification channels (user-authored)\n├── run.lock                          # project-wide run lock, 0600\n├── runs/<runId>.json                 # one record per run, 0600\n├── reports/<taskId>/<runId>.md       # per-run Markdown report, 0600\n├── sessions/<taskId>/<runId>.jsonl   # the Task Session, forced to 0600\n└── tasks.json.imported.<ts>          # a migrated pre-0.9 store, kept for rollback\n```\n\nBoth directories should be gitignored (the registry is never inside a repo;\nadd `.agents/cron/` for the project store — other tools may commit their own\n`.agents/` entries such as `skills/`). Every scheduler file, including Task\nSession JSONL files, is written with `0600` permissions. `AGENTS_CRON_HOME`\nrelocates the global registry for tests and non-default homes.\n\n### Task Sessions in Pi's session store (opt-in)\n\nBy default the Task Session stays in the private layout above. Set\n`AGENTS_CRON_PI_STORE=1` for the `pi` adapter to place each run's transcript\nin **Pi's own default session store** instead —\n`<agentDir>/sessions/--<encoded-cwd>--/<taskId>-<runId>.jsonl` — so scheduled\nruns appear in `pi --continue` pickers and pi-web's project session lists\nlike any interactive session. The file is still one fresh, isolated session\nper run; only its location changes. `PI_CODING_AGENT_DIR` and\n`PI_CODING_AGENT_SESSION_DIR` relocations are honored, keeping Pi, pi-web,\nand the scheduler on the same paths.\n\nRun records always carry the transcript's absolute path (`sessionFile`), so\n`/schedule open`, the dashboard, and future layouts need no reconfiguration:\nreads follow the record, not the layout. This variable is newer than the\nrename, so — unlike the variables above — it has no `PI_SCHEDULER_*` spelling.\n\nTo carry transcripts that already exist into the store, run\n`agents-cron migrate-sessions` (`--dry-run` first to preview). It moves each\npi transcript to the directory Pi uses for the cwd the run actually worked\nin — taken from the transcript's own session header — rewrites the run\nrecord, keeps `0600` permissions, never overwrites an existing file, and\nrefuses to run while another instance holds the run lock. Other agents'\ntranscripts stay where they are; a second pass is a no-op.\n\n- A task stores a prompt and a time rule, never a shell command, and is bound\n  to its project (`projectDir`): artifacts, run lock, and notification config\n  all follow the binding.\n- Scheduling state (`nextRunAt`, counters, `lastStatus`) lives only in the\n  registry; the project store is append-only artifacts. A crash may lose one\n  run record, never re-execute a task.\n- A project still carrying a pre-registry `tasks.json` is migrated lazily on\n  the next command that touches it; the old file is renamed aside, and\n  rollback is renaming it back.\n- `run-due` takes each project's `run.lock` in turn, executes that project's\n  due tasks serially, and advances `nextRunAt` from the current time. Missed\n  recurring periods collapse into one catch-up run.\n- A one-shot task is terminal after its first attempt: success disables it,\n  failure does not retry, and a run that passed the grace window (default 5\n  minutes) is recorded as `missed` and needs `run <id>`.\n- A task whose project directory is gone errors in the registry (visible in\n  `list` as `⚠ missing directory`), stays enabled, and — when recurring —\n  moves to its next occurrence instead of erroring every tick.\n- A run still marked `running` after the timeout (default 30 minutes) is\n  reclaimed as `error` on the next invocation.\n- Every terminal run — success, error, or missed — also writes a Markdown\n  report (`reports/<taskId>/<runId>.md`): metadata, the full summary, the\n  error, and a link to the session transcript. Reports are pruned together\n  with their run records.\n\n## Development\n\n```bash\nnpm install\nnpm run check    # typecheck + tests (includes a packed-tarball smoke test)\n```\n\nThere is no build. `npm run typecheck` runs `tsc --noEmit`, and `npm test` runs\nthe suite with Node's own test runner against the same `.ts` sources the\npackage ships.\n\nTwo loaders run those sources, which is the whole packaging story:\n\n- **Extension** — `pi` compiles the extension itself through jiti. The manifest\n  entry is the root `index.mjs`, a three-line re-export of\n  `src/agents/pi/extension.ts`. The `index` basename is load-bearing: pi's\n  compact label logic only drops the file path for entries named `index.*`,\n  so this naming is what keeps the extensions list showing just\n  `agents-cron` while the real code stays next to its commands, tools, and\n  env pieces. A CI gate in `tests/packaging.test.ts` enforces it.\n- **CLI** — cron starts `bin/agents-cron.mjs` with a bare `node`, and Node\n  explicitly refuses to strip types for files under `node_modules`, which is\n  where an installed package lives. The entry registers `bin/ts-loader.mjs`, a\n  hook scoped to this package's own `.ts` files and nothing else.\n\nStripping is a whitespace-preserving strip, so the sources must stay erasable\n(no enums, no parameter properties). `erasableSyntaxOnly` in `tsconfig.json`\nenforces that at typecheck time, which is what keeps the missing build step\nfrom becoming a runtime surprise.\n\n`tests/packaging.test.ts` packs the tarball, installs it into a temp\ndirectory, and runs the installed CLI with a bare `node` — the one test that\nexercises the `node_modules` path the loader exists for.\n\n`src/agents/` is the agent adapter layer: `types.ts` is the adapter contract,\n`registry.ts` resolves adapters, `builtin.ts` wires the built-ins, and each\nagent (`pi/`, `claude/`, `codex/`) holds everything agent-specific; nothing\nunder `src/agents/pi/` except its adapter is imported by the CLI path, and the\nadapters spawn the agent binary rather than linking an SDK.\nEverything else in `src/` is agent-agnostic: the Task Runner, stores, locking,\nand CLI.\n\n## Releasing\n\nThe package follows the [Pi package](https://pi.dev/docs/latest/packages)\nconventions: the `pi-package` keyword and a `pi` manifest in `package.json`.\n\n```bash\nnpm run check        # typecheck + tests\nnpm pack --dry-run   # inspect the published file list\nnpm publish          # prepublishOnly re-runs check\n```\n\n`files` ships `assets/`, `bin/` (entry points and the TS loader), `src/` (the\nsources that actually run), and `skills/`. Nothing is compiled, so what\n`npm pack` lists is what executes on install. `@earendil-works/pi-coding-agent`\nstays an optional peer: only the extension imports it, and Pi hands its own\ncopy to extensions, so an install of the scheduler never needs a second SDK.\n\n## License\n\n[AGPL-3.0](LICENSE) — GNU Affero General Public License v3.0.\n","readmeFilename":"README.md"}