{"_id":"@ai-local/watch","_rev":"7-9eb652c5bead64b081d9224b2484f294","name":"@ai-local/watch","dist-tags":{"latest":"1.1.3"},"versions":{"1.0.0":{"name":"@ai-local/watch","version":"1.0.0","keywords":["pi-package","pi","pi-coding-agent","pi-extension","pr-review","code-review","github","vette","watch"],"author":{"name":"b-koop"},"license":"MIT","_id":"@ai-local/watch@1.0.0","maintainers":[{"name":"nivoset","email":"nivoset@gmail.com"}],"homepage":"https://github.com/ai-local/watch#readme","bugs":{"url":"https://github.com/ai-local/watch/issues"},"pi":{"extensions":["./extensions/pr-vette.ts","./extensions/gh-status/extension.ts"]},"dist":{"shasum":"7c74130262ff8b1340da1981a3a675bb623589a5","tarball":"https://registry.npmjs.org/@ai-local/watch/-/watch-1.0.0.tgz","fileCount":15,"integrity":"sha512-a/Qt/Db+D2rrF1m4azCjHWy7+7lwtO84cckMlQygHIfgYnxiZOzTYgzr5+4bMRGtXNWx43qUodUjy9kggmJ6sA==","signatures":[{"sig":"MEUCICfPTlvyx+QMC4pq238N6Lb+N8g6zKeqF6m8ouMEp5foAiEApRQcLjKvfnN9s0AOmGJ8rQYTS5NR8cqtt5UfS+uc1+c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":224363},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"f16775e51acc84c4b48e3ad7afbdad729d081d9b","scripts":{"test":"pnpm typecheck && vitest run","vitest":"vitest run","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","prepublishOnly":"pnpm typecheck"},"_npmUser":{"name":"nivoset","email":"nivoset@gmail.com"},"repository":{"url":"git+https://github.com/ai-local/watch.git","type":"git"},"_npmVersion":"10.9.8","description":"Pi package that watches pull requests with PR-aware /vette, /pr, and /watch commands plus GitHub status diagnostics.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"smart-model-run":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"latest","typebox":"latest","typescript":"^5.9.3","@types/node":"^25.9.2","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"^0.75.4","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/watch_1.0.0_1783291632476_0.7292925882768995","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@ai-local/watch","version":"1.0.3","keywords":["pi-package","pi","pi-coding-agent","pi-extension","pr-review","code-review","github","vette","watch"],"author":{"name":"b-koop"},"license":"MIT","_id":"@ai-local/watch@1.0.3","maintainers":[{"name":"nivoset","email":"nivoset@gmail.com"}],"homepage":"https://github.com/ai-local/watch#readme","bugs":{"url":"https://github.com/ai-local/watch/issues"},"pi":{"extensions":["./extensions/pr-vette.ts","./extensions/gh-status/extension.ts"]},"dist":{"shasum":"72c871dba90a17f0315d534941999118b2d46055","tarball":"https://registry.npmjs.org/@ai-local/watch/-/watch-1.0.3.tgz","fileCount":16,"integrity":"sha512-oOwxggFP2pG1ZoOVluI3N5hpfmAyXs8/xPL3TRGOE7GdjrIpN3t93+BWmE0i9PwyHe2YeIcB3v1HPJHTGP3zzw==","signatures":[{"sig":"MEUCIHLeqlFAq2okRJ7wPPL2kpHFzl/yiwfAUF0IYH8bcqtXAiEAhSC1R58ZqUcUjqKRmQs3d9su8mfo3cHgarN2lsYm0O4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248216},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"d63a3d714a90f79cb14d7e376d6e3e696080b71f","scripts":{"test":"pnpm typecheck && vitest run","vitest":"vitest run","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","publish:ci":"npm publish --provenance --access public","publish:otc":"./scripts/publish-npm.sh","prepublishOnly":"pnpm typecheck"},"_npmUser":{"name":"nivoset","email":"nivoset@gmail.com"},"repository":{"url":"git+https://github.com/ai-local/watch.git","type":"git"},"_npmVersion":"10.9.8","description":"Pi package that watches pull requests with PR-aware /vette, /pr, /watch, and /peek commands plus GitHub status diagnostics.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"smart-model-run":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"latest","typebox":"latest","typescript":"^5.9.3","@types/node":"^25.9.2","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"^0.75.4","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/watch_1.0.3_1785085245056_0.7164466183343989","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@ai-local/watch","version":"1.0.4","keywords":["pi-package","pi","pi-coding-agent","pi-extension","pr-review","code-review","github","vette","watch","claude-code","claude-code-plugin"],"author":{"name":"b-koop"},"license":"MIT","_id":"@ai-local/watch@1.0.4","maintainers":[{"name":"nivoset","email":"nivoset@gmail.com"}],"homepage":"https://github.com/b-koop/the-watch#readme","bugs":{"url":"https://github.com/b-koop/the-watch/issues"},"pi":{"extensions":["./extensions/pr-vette.ts","./extensions/gh-status/extension.ts"]},"dist":{"shasum":"5d9d705d7b9ab0e1c664569b1bb912a386ac7607","tarball":"https://registry.npmjs.org/@ai-local/watch/-/watch-1.0.4.tgz","fileCount":45,"integrity":"sha512-R35qIeP6RYL2Kr+l6eIS+STl5vjg+jIEu9uFJnYUeSiswd1xXUZW2qLwVQD+cgc9G4wLj+3mlwZScB+r6FglOQ==","signatures":[{"sig":"MEUCIBAgmpQDnTRUr107PuIl9S+RWsizC4SFuGes/Tf0on0nAiEAgaknYB4mQgU7J3QxWa6he5I91zN5A6C5OYxe/lAW/vk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCL1ZrXPnviA95AcQcetTcVQdOHpRuGKUsWm1iu+ODzwwIgKD6a8t+rsnOnoBn9vW7zHm0Sh1/WU/SPuMCfCKZ4oJ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ai-local%2fwatch@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":397157},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"84f21e61f0df9c1f9eb89f032933ec9b4b67a85e","scripts":{"lint":"pnpm lint:console","test":"pnpm typecheck && vitest run","vitest":"vitest run","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","publish:ci":"npm publish --provenance --access public","publish:otc":"./scripts/publish-npm.sh","lint:console":"node scripts/lint-no-console.mjs","vette:review":"node --experimental-strip-types scripts/vette-review.ts","vette:prepare":"node --experimental-strip-types scripts/vette-prepare.ts","prepublishOnly":"pnpm typecheck","post-vette-comments":"node --experimental-strip-types scripts/post-vette-comments.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4fe42a2f-d18d-4729-8c17-63eebf606733"}},"repository":{"url":"git+https://github.com/b-koop/the-watch.git","type":"git"},"_npmVersion":"12.0.2","description":"Pi package that watches pull requests with PR-aware /vette, /pr, /watch, and /peek commands plus GitHub status diagnostics.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"smart-model-run":"^0.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"latest","typebox":"latest","typescript":"^5.9.3","@types/node":"^25.9.2","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"^0.75.4","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/watch_1.0.4_1787742826472_0.7212428732069691","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@ai-local/watch","version":"1.1.0","keywords":["pi-package","pi","pi-coding-agent","pi-extension","pr-review","code-review","github","vette","watch","claude-code","claude-code-plugin"],"author":{"name":"b-koop"},"license":"MIT","_id":"@ai-local/watch@1.1.0","maintainers":[{"name":"nivoset","email":"nivoset@gmail.com"}],"homepage":"https://github.com/b-koop/the-watch#readme","bugs":{"url":"https://github.com/b-koop/the-watch/issues"},"pi":{"extensions":["./extensions/pr-vette.ts","./extensions/gh-status/extension.ts"]},"dist":{"shasum":"b69acfc158d87c265d4f2eca8a4ccbf484c907da","tarball":"https://registry.npmjs.org/@ai-local/watch/-/watch-1.1.0.tgz","fileCount":45,"integrity":"sha512-WjKGQIqAh04+4CBnQyYmqd3t1W45E0XKG+FeOe7PFpOyrqvH2zx3HEDkCmImVLUS7BLUiaIvc/mL8a4KDym7SQ==","signatures":[{"sig":"MEUCIQDbdxnsw4+/CLmxP3EZDXhkJwfhaLw5eOGHElO8gkbpgQIgN3/7cxfXRUCu3Bnc1EaktgyEJKQnHVoE5qz49HsWEqY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCpWbevIBPQbNzhK5uJCBea5smNk5IwyM3m5ELvr6PprAIhAJ0IN7jUw4KNJsNAaM7rjgP4TLtoP7znygGlrNjUO/JX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ai-local%2fwatch@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":401847},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"98aae79324bc567bcf19ca5524d0705e0e68721a","scripts":{"lint":"pnpm lint:console","test":"pnpm typecheck && vitest run","vitest":"vitest run","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","publish:ci":"npm publish --provenance --access public","publish:otc":"./scripts/publish-npm.sh","lint:console":"node scripts/lint-no-console.mjs","vette:review":"node --experimental-strip-types scripts/vette-review.ts","vette:prepare":"node --experimental-strip-types scripts/vette-prepare.ts","prepublishOnly":"pnpm typecheck","post-vette-comments":"node --experimental-strip-types scripts/post-vette-comments.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4fe42a2f-d18d-4729-8c17-63eebf606733"}},"repository":{"url":"git+https://github.com/b-koop/the-watch.git","type":"git"},"_npmVersion":"12.0.2","description":"Pi package that watches pull requests with PR-aware /vette, /pr, /watch, and /peek commands plus GitHub status diagnostics.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"smart-model-run":"^0.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"latest","typebox":"latest","typescript":"^5.9.3","@types/node":"^25.9.2","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"^0.75.4","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/watch_1.1.0_1787745753752_0.7980810667704743","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@ai-local/watch","version":"1.1.1","keywords":["pi-package","pi","pi-coding-agent","pi-extension","pr-review","code-review","github","vette","watch","claude-code","claude-code-plugin"],"author":{"name":"b-koop"},"license":"MIT","_id":"@ai-local/watch@1.1.1","maintainers":[{"name":"nivoset","email":"nivoset@gmail.com"}],"homepage":"https://github.com/b-koop/the-watch#readme","bugs":{"url":"https://github.com/b-koop/the-watch/issues"},"pi":{"extensions":["./extensions/pr-vette.ts","./extensions/gh-status/extension.ts"]},"dist":{"shasum":"45a3cdc12cbcbf45665e09b7e4c1c053fbda0328","tarball":"https://registry.npmjs.org/@ai-local/watch/-/watch-1.1.1.tgz","fileCount":45,"integrity":"sha512-pp/z7PDTKho75PP79zdN2exLUJISN2+WdaKfpT+bpgE7K20Yy/7XrDUDJGUvv8ZPz7LvV8x4pMmgXJEhHXKFHA==","signatures":[{"sig":"MEYCIQCuLr/VdMvL38+2WFBpvuH2AhSa33aub2F/GFqB6y/xDwIhAKBTfTf/J3frOsdIXffBgyCzdyaHlQf9q1UPpFeBzjmA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFLGWE+048RaXxx6XmAizYh7LaRDnxlSL4zhCwjkin80AiEA3QgLixB0gCK7C7DfLw8KCKOaI0K8Ox7lzih6kDCy2Qg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ai-local%2fwatch@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":405860},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"6141752298486e59b217aaf2ad43f9fa195fffe2","scripts":{"lint":"pnpm lint:console","test":"pnpm typecheck && vitest run","vitest":"vitest run","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","publish:ci":"npm publish --provenance --access public","publish:otc":"./scripts/publish-npm.sh","lint:console":"node scripts/lint-no-console.mjs","vette:review":"node --experimental-strip-types scripts/vette-review.ts","vette:prepare":"node --experimental-strip-types scripts/vette-prepare.ts","prepublishOnly":"pnpm typecheck","post-vette-comments":"node --experimental-strip-types scripts/post-vette-comments.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4fe42a2f-d18d-4729-8c17-63eebf606733"}},"repository":{"url":"git+https://github.com/b-koop/the-watch.git","type":"git"},"_npmVersion":"12.0.2","description":"Pi package that watches pull requests with PR-aware /vette, /pr, /watch, and /peek commands plus GitHub status diagnostics.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"smart-model-run":"^0.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"latest","typebox":"latest","typescript":"^5.9.3","@types/node":"^25.9.2","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"^0.75.4","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/watch_1.1.1_1787748962136_0.7538804602995717","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@ai-local/watch","version":"1.1.2","keywords":["pi-package","pi","pi-coding-agent","pi-extension","pr-review","code-review","github","vette","watch","claude-code","claude-code-plugin"],"author":{"name":"b-koop"},"license":"MIT","_id":"@ai-local/watch@1.1.2","maintainers":[{"name":"nivoset","email":"nivoset@gmail.com"}],"homepage":"https://github.com/b-koop/the-watch#readme","bugs":{"url":"https://github.com/b-koop/the-watch/issues"},"pi":{"extensions":["./extensions/pr-vette.ts","./extensions/gh-status/extension.ts"]},"dist":{"shasum":"6044bc8f0a5aba52f9a6f7966eb3b1980bf5d1d1","tarball":"https://registry.npmjs.org/@ai-local/watch/-/watch-1.1.2.tgz","fileCount":45,"integrity":"sha512-AVILMMCC2B9AQaNisdpwAYKo/WUmVkuNQyTB1qjCDGI8+wDQZX31VHqRe/UBZ+zLsuUCIkcwX/8s5oGFBQE5cw==","signatures":[{"sig":"MEQCIAz4Nvae1pol2KwD0kExzBEF9N9wCu9+UeZHbcvDR2TGAiBLkRSVt7uHwxoPiBaVfYX6dduMWGPEHz+KiUREJl9jUg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDbpYQvs5Co4lXBv2jsLm8ZLf1fcm9mZnIlvRNs8S/f1AiA9xbyps5YH6G1dasoL1sKtZkhoa1i2JnnPW7IEJYffig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ai-local%2fwatch@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":415608},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"1ecc48de250b7c3107631f198bbf4b751e61dee0","scripts":{"lint":"pnpm lint:console","test":"pnpm typecheck && vitest run","vitest":"vitest run","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","publish:ci":"npm publish --provenance --access public","publish:otc":"./scripts/publish-npm.sh","lint:console":"node scripts/lint-no-console.mjs","vette:review":"node --experimental-strip-types scripts/vette-review.ts","vette:prepare":"node --experimental-strip-types scripts/vette-prepare.ts","prepublishOnly":"pnpm typecheck","post-vette-comments":"node --experimental-strip-types scripts/post-vette-comments.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4fe42a2f-d18d-4729-8c17-63eebf606733"}},"repository":{"url":"git+https://github.com/b-koop/the-watch.git","type":"git"},"_npmVersion":"12.0.2","description":"Pi package that watches pull requests with PR-aware /vette, /pr, /watch, and /peek commands plus GitHub status diagnostics.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"smart-model-run":"^0.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"latest","typebox":"latest","typescript":"^5.9.3","@types/node":"^25.9.2","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"^0.75.4","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/watch_1.1.2_1787769363174_0.42491175772123047","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"pi":{"extensions":["./extensions/pr-vette.ts","./extensions/gh-status/extension.ts"]},"_id":"@ai-local/watch@1.1.3","bugs":{"url":"https://github.com/b-koop/the-watch/issues"},"dist":{"shasum":"160d102ee57f6bfd2c5007b0cd4fdcf7d3ad8234","tarball":"https://registry.npmjs.org/@ai-local/watch/-/watch-1.1.3.tgz","fileCount":45,"integrity":"sha512-eZ7eAIr+ZNmj5XGnGWOyvmXb2AwK7f5gT38wzAc8ox7UzlJFUEW/B6nRE4ZEM7ZhyMPN1KsoMNE/y6uLMYnfRg==","signatures":[{"sig":"MEYCIQDBHnoVZ2bsumhuQBf5V0ky60pJgPJATsQRAI7iKpZwggIhAKGW5Gj3nReLDGEk/mBh8tM8Ps81aq1Zfxb2LwdGaN4p","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDVAL0OP/0QQt9v8RzJHKwG60bv4VdjOL12CgUHOvP67wIhALsNW94r/GXoEDUdPIHnNayrCIFVcCU4deE2Q2/3UIcY"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ai-local%2fwatch@1.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":419484},"name":"@ai-local/watch","type":"module","author":{"name":"b-koop"},"engines":{"node":">=18.0.0"},"gitHead":"cbcfc17a092f40e9867f456693618e91739d5832","license":"MIT","scripts":{"lint":"pnpm lint:console","test":"pnpm typecheck && vitest run","vitest":"vitest run","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","publish:ci":"npm publish --provenance --access public","publish:otc":"./scripts/publish-npm.sh","lint:console":"node scripts/lint-no-console.mjs","vette:review":"node --experimental-strip-types scripts/vette-review.ts","vette:prepare":"node --experimental-strip-types scripts/vette-prepare.ts","prepublishOnly":"pnpm typecheck","post-vette-comments":"node --experimental-strip-types scripts/post-vette-comments.ts"},"version":"1.1.3","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4fe42a2f-d18d-4729-8c17-63eebf606733"}},"homepage":"https://github.com/b-koop/the-watch#readme","keywords":["pi-package","pi","pi-coding-agent","pi-extension","pr-review","code-review","github","vette","watch","claude-code","claude-code-plugin"],"repository":{"url":"git+https://github.com/b-koop/the-watch.git","type":"git"},"_npmVersion":"12.0.2","description":"Pi package that watches pull requests with PR-aware /vette, /pr, /watch, and /peek commands plus GitHub status diagnostics.","directories":{},"maintainers":[{"name":"nivoset","email":"nivoset@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"smart-model-run":"^0.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"latest","typebox":"latest","typescript":"^5.9.3","@types/node":"^25.9.2","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"^0.75.4","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-agent-core":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/watch_1.1.3_1787769665805_0.13896165055624965"}}},"time":{"created":"2026-07-05T22:47:12.259Z","modified":"2026-08-26T18:41:06.406Z","1.0.0":"2026-07-05T22:47:12.623Z","1.0.3":"2026-07-26T17:00:45.230Z","1.0.4":"2026-08-26T11:13:46.578Z","1.1.0":"2026-08-26T12:02:33.883Z","1.1.1":"2026-08-26T12:56:02.227Z","1.1.2":"2026-08-26T18:36:03.308Z","1.1.3":"2026-08-26T18:41:05.973Z"},"bugs":{"url":"https://github.com/b-koop/the-watch/issues"},"author":{"name":"b-koop"},"license":"MIT","homepage":"https://github.com/b-koop/the-watch#readme","keywords":["pi-package","pi","pi-coding-agent","pi-extension","pr-review","code-review","github","vette","watch","claude-code","claude-code-plugin"],"repository":{"url":"git+https://github.com/b-koop/the-watch.git","type":"git"},"description":"Pi package that watches pull requests with PR-aware /vette, /pr, /watch, and /peek commands plus GitHub status diagnostics.","maintainers":[{"name":"nivoset","email":"nivoset@gmail.com"}],"readme":"# Watch\n\nWatches pull requests with PR-aware `/vette`, `/pr`, `/watch`, `/peek`, and\nGitHub status commands.\n\n`/vette` runs on **two runtimes** from one codebase. Both read the same reviewer\ndefinitions in `extensions/reviewers/`, build the same diff bundle, and post\nthrough the same validated comment boundary. Only the fan-out differs: pi spawns\nsubprocess agents, Claude Code uses the Workflow tool.\n\n## Install\n\n### pi\n\n```bash\npi install npm:@ai-local/watch\n```\n\nOr for local development:\n\n```bash\npi -e .\n```\n\n### Claude Code\n\nThis repository is also a Claude Code plugin. The simplest install is to symlink\nthe checkout into your skills directory, where it auto-loads as a plugin:\n\n```bash\nln -s \"$(pwd)\" ~/.claude/skills/watch\n```\n\nConfirm it loaded (a new session is needed to pick it up):\n\n```bash\nclaude plugin list      # → watch@skills-dir ... Status: ✔ loaded\nclaude plugin details watch\n```\n\nThen, from any repository:\n\n```\n/watch:vette 123\n```\n\n**Use the namespaced form.** A differently-scoped `vette` skill is common in\npersonal skill sets, so bare `/vette` may resolve to that one instead. Both are\nregistered, so the prefix is what disambiguates. Inside this repository the\n`.claude/` symlinks also make plain `/vette` resolve here during development.\n\nThe plugin registers two entries: the `watch:vette` skill (the entry point) and\nthe `watch:vette-lanes` workflow it calls. `/vette` instructs the model to call\n`Workflow`, which satisfies that tool's opt-in requirement — no extra flag\nneeded.\n\nScripts resolve through `${CLAUDE_PLUGIN_ROOT}` so they run from any repository,\nreading that repo's git state rather than the plugin's. Note that the symlink\ninstall relies on the checkout's own `node_modules` — a bare `npm install` of the\npublished package would also need the `smart-model-run` dependency resolvable.\n\nRequirements: Node 18+ (24 recommended), `gh` authenticated, and the `Workflow`\ntool available.\n\n## Claude Code runtime\n\nA `/vette` run under Claude Code is three phases. The skill\n(`skills/vette/SKILL.md`) owns phases 1 and 3; phase 2 is the deterministic\nworkflow in `workflows/vette-lanes.js`.\n\n### 1. Prepare\n\nWorkflow scripts have no filesystem access, so the diff bundle and reviewer\nselection are built first, in Bash:\n\n```bash\nnode --experimental-strip-types \"${CLAUDE_PLUGIN_ROOT}/scripts/vette-prepare.ts\" \\\n  [selector] [--mode comment|repair|doc] [--regression] [--model haiku|sonnet|opus|fable]\n```\n\n`selector` is a PR number, branch, or URL; omit it to review the current\nworktree. The script runs against the repository being reviewed and prints a\nJSON manifest. Two non-zero exits are deliberate refusals, not failures to work\naround:\n\n- **Empty diff** — reviewing nothing is what produced hallucinated findings\n  before the gate existed.\n- **No matching reviewer** — nothing in the change is in scope for any lane.\n\nThe manifest carries the diff inline as `bundleText` rather than as a path, and\nassigns every lane its model tier alongside `verifyModel` and `synthesisModel`.\nIt is handed to the workflow verbatim.\n\n### 2. Fan out\n\n```\nWorkflow({ name: \"watch:vette-lanes\", args: <the manifest object> })\n```\n\n(plain `vette-lanes` when loaded from a project's own `.claude/workflows/`).\n\nEvery lane prompt opens with the identical bundle block — typically ~98% of the\nprompt — so all lanes share one cacheable prefix. A cache entry only exists once\nthe first request writing it completes, so the workflow runs one lane alone to\nprime the prefix and then fans the rest out against a warm cache: one lane's\nlatency up front instead of re-sending the diff once per lane. The bundle is\nembedded rather than read from disk for the same reason — a file read arrives as\na tool result and shares no prefix at all.\n\nFindings then pass three gates before they can become a comment:\n\n1. **Grounding** — a finding that does not name a file in the changed set is\n   discarded, and the count is reported back as `droppedUngrounded`.\n2. **Adversarial verification** — one verifier per finding, prompted to refute\n   it and defaulting to `real=false` when the evidence does not hold up.\n   Pre-existing behavior, speculative concerns, and claims the cited code does\n   not actually support are rejected here.\n3. **Dedupe and synthesis** — survivors merge by file, line, and normalized\n   title, keeping the highest-confidence instance. Lanes that independently\n   reached the same conclusion raise confidence rather than producing two\n   comments.\n\nLanes flagged for a second clean check re-run once with an independent agent\nwhen the first pass returns nothing, so a lane cannot go quiet by accident.\n\nThe workflow returns `{ confirmed, comments, droppedUngrounded, laneStats,\nclean }`. `clean: true` means every finding was ungrounded or refuted — that is\na successful review, not a failure. Because it runs one agent per lane plus one\nverifier per finding, a real PR exceeds the usual 15-agent guideline by design.\n\n### 3. Act\n\n`manifest.mode` is `repair` for a PR that local commit evidence says is yours and\n`comment` otherwise; explicit flags override it.\n\n| Mode | Trigger | Behavior |\n| --- | --- | --- |\n| comment | default, someone else's PR | Post the verified comments |\n| dry run | `--no-post` / `--dry-run` | Render locally, post nothing |\n| repair | `self`, or an owned PR | Fix confirmed findings in the working tree — no commit, no push, no comments |\n| comments-only | `--comments-only` (CI) | Post comments and nothing else |\n\n`--comments-only` and `self` are mutually exclusive. Posting always goes through\n`${CLAUDE_PLUGIN_ROOT}/scripts/post-vette-comments.ts` — never a hand-written `gh api` call — which\nvalidates the whole array before the first network call and falls back exact\nline → file → general per comment. Repairs happen in the main turn rather than\nin workflow agents, because parallel agents editing one working tree conflict.\n\nFull contracts: [`skills/vette/references/modes.md`](skills/vette/references/modes.md)\nand [`skills/vette/references/comment-contract.md`](skills/vette/references/comment-contract.md).\n\n## Publish to npm\n\nPublishing is automatic for pushes to `main` through\n`.github/workflows/release.yaml`. The workflow installs dependencies, runs the\ntests and package dry-run check, and reads the package name and version from\n`package.json`. It queries npm for that exact version first; if it is already\npublished, the workflow skips publishing, tagging, and releasing.\n\nFor a new version, the workflow uses npm trusted publishing (OIDC) with\n`npm publish --provenance --access public`, then creates and pushes an annotated\n`vX.Y.Z` tag from the triggering commit and publishes a GitHub Release with\ngenerated notes. The workflow's `npm-publish` environment and the npm trusted\npublisher must be configured for this repository and\n`.github/workflows/release.yaml` in npm. The package version in `package.json` is\nthe single source for both the npm version and the generated release tag.\n\nThe local `publish:otc` script remains available only as a manual OTP fallback:\n\n```bash\npnpm publish:otc -- patch 123456\n```\n\n## Headless GitHub comment workflow\n\nTwo reusable examples ship here: `.github/workflows/vette-comments.yml` (pi) and\n`.github/workflows/vette-claude.yml` (Claude Code). Both hold to the same\ncomment-only contract described below.\n\n### Claude Code\n\n`vette-claude.yml` uses `anthropics/claude-code-action@v1` and needs only\n`ANTHROPIC_API_KEY`. It enforces comment-only at the harness level rather than\nonly in the prompt:\n\n```yaml\nclaude_args: >-\n  --allowedTools \"Read,Grep,Glob,Bash,Workflow\"\n  --permission-mode dontAsk\n```\n\n`Edit` and `Write` are withheld, so an unattended run cannot modify the tree even\nif the prompt contract were ignored. A prompt-level contract alone is the weaker\nguarantee.\n\n### pi\n\n`vette-comments.yml` runs on opened, synchronized, and reopened pull requests, checks out the full PR history, and posts only ordinary inline or general comments for verified findings.\n\nSetup:\n\n1. Add the provider credential needed by the selected model to the CI secret store (for example `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, or `GOOGLE_API_KEY`). Never pass credentials as command-line arguments.\n2. Set the non-secret repository variable `VETTE_MODEL` to a `provider/model` selector.\n3. Keep the workflow permissions at `contents: read` and `pull-requests: write`. The workflow uses `pull_request`, not `pull_request_target`; fork PRs without secrets are skipped.\n\nThe runner invokes the existing extension with `/vette <pr> --comments-only --post-comments --no-watch`. Comment-only mode is an explicit safety contract: automation never edits files, creates tests, repairs code, commits, pushes, approves, denies, requests changes, or submits a review decision. A clean review is successful and does not fail the PR; configuration, review, or posting failures do.\n\nFor local validation without posting:\n\n```bash\nVETTE_MODEL=provider/model node --experimental-strip-types scripts/vette-review.ts --pr 123\n# Validate and render a JSON payload without any network calls:\npnpm post-vette-comments --dry-run --json '[{\"title\":\"Behavior-first issue\",\"severity\":\"recommended\",\"file\":\"src/example.ts\",\"line\":42,\"codeSummary\":\"Changed branch skips validation.\",\"what\":\"Invalid input reaches the write path.\",\"why\":\"Users can persist inconsistent data.\"}]'\n# Read JSON from a file or stdin when posting/validating:\npnpm post-vette-comments --pr 123 --file comments.json\ncat comments.json | pnpm post-vette-comments --pr 123 --stdin\n# For a dry run, invoke the extension directly:\npi -e ./extensions/pr-vette.ts -p \"/vette 123 --comments-only --no-post --no-watch\"\n```\n\nThe accepted comment payload is a JSON array. Each item requires `title`,\n`severity` (`blocker`, `recommended`, or `note`), `codeSummary`, `what`, and\n`why`; `file` and positive-integer `line` are optional, as are `evidence`,\n`testCode`, and `fixBoundary`. The shared renderer emits the stable severity\nlabel, title `details` block, and `## Code summary`, `## What`, `## Why`, plus\noptional `## Evidence`, `## Regression test`, and `## Fix boundary` sections.\nThe complete array is validated before the first post. Invalid JSON never makes a network call; valid comments\nfall back from exact line to file-level to general PR comments and report each\nfallback. The workflow posts ordinary comments only and never submits review\ndecisions, edits source, commits, or pushes.\n\nProvider credentials remain environment variables supplied by the shell or CI secret store and are never included in process arguments or diagnostic output.\n\n## Commands\n\n### `/vette [pr|branch|url]`\n\nMulti-topic diff review. Lightweight agents review your worktree, PR, or branch\nin parallel across correctness, tests, test mocking, error handling, security,\ncontracts, async/state, naming, maintainability, requirements, and feature\nbehavior specs.\nThe parent session deduplicates and verifies findings before acting.\n\n- **Model tiers** — lane agents never inherit the session model. Every lane runs\n  on Haiku; the adversarial verifiers and the synthesis call run on Sonnet.\n  Nothing is on an Opus tier by default — verification, not lane firepower, is\n  what keeps wrong findings out, and the lanes are where a run's tokens go since\n  each one re-reads the whole bundle. A Haiku lane is promoted to Sonnet when the\n  bundle exceeds 400K characters, which would outgrow its context window. Pass\n  `--model haiku|sonnet|opus|fable` to `vette-prepare` to override all three.\n- **Validating tests** — whenever a review builds a test that demonstrates a\n  finding, the test's complete source goes in that comment's `testCode` field\n  and the renderer posts it as a fenced `## Regression test` section; the\n  command and its outcome stay in `evidence`, which is not rendered as code. A\n  blocker that arrives with a failing test is much harder to wave away than a\n  paragraph describing one. Test source is never invented for a test that was\n  not actually run, and `--comments-only` CI runs write no tests at all, since\n  they may not touch the tree.\n- **Base branch** — a PR is reviewed against its own base. Without a PR, the\n  base is the branch the head was actually cut from: `origin/dev`,\n  `origin/develop`, and `origin/development` are checked first, then whatever\n  `origin/HEAD` advertises, then `origin/main`/`master`/`trunk`, and the\n  candidate with the fewest commits between its merge base and your head wins.\n  That keeps a repo which defaults to `main` but integrates on `dev` from\n  dragging the whole integration branch into the diff.\n- **External PRs** — automatically posts only verified review comments, using\n  changed file/line locations whenever available.\n- **`--no-post`** (or `--dry-run`) — keeps verified comments local and\n  comment-ready instead of posting them.\n- **`/vette post [pr|branch|url]`** and **`--post-comments`** remain accepted\n  aliases for automatic posting.\n- **Owned PRs / `/vette self`** — repair mode. Fixes confirmed issues directly\n  in your working tree instead of posting comments.\n- **`/vette doc [pr|branch|url]`** — legacy alias for the same comment-ready,\n  no-post review mode; it no longer runs the old local-doc-only workflow.\n- **`/vette review [--limit N]`** — mines saved review artifacts and summarizes\n  which recommendations were accepted, rejected, fixed differently, or missed.\n- **`/vette compare [pr|branch|url] [--topics id1,id2] [--model remote] [--local local]`** — runs the same diff\n  through a remote small model and a local ~7B model, then writes a comparison\n  report to `/tmp/pi-vette-findings/<branch>/model-compare.md` with overlap,\n  remote-only, and local-only findings. Use `/vette compare models` to list\n  available remote/local selectors and defaults.\n- `/vette reviewers` — lists discovered built-in and repository-local reviewer definitions, selectors, sources, and current-worktree matches.\n- `/vette models` — shows selected providers and model IDs.\n- Add `--local` or `--force-local` to force topic agents to use local-only\n  model selection. Local mode starts with stronger local review models and falls\n  back to smaller 7B/8B models when needed.\n- Runs `pnpx fallow audit --base <resolved base> --gate new-only` as a standard\n  advisory leg during synthesis. Fallow items are deduplicated and must pass the\n  same verification gate before they are fixed, posted, or reported; noisy items\n  are summarized so you can judge whether the audit was useful.\n\n#### `/vette old [pr|branch|url|scope] [--scope] [--post-comments]`\n\nLegacy workflow with three modes:\n\n| Mode | Trigger | Behavior |\n| --- | --- | --- |\n| Owner PR | Your own PR | Repair confirmed findings with TDD subagents |\n| External PR | Someone else's PR | Post verified findings as PR comments |\n| Scope | `--scope` flag or non-PR selector | Write local bug-draft Markdown files |\n\n### `/pr [pr|branch|url] [--post-comments] [--no-watch] [--local]`\n\nEnd-to-end PR workflow: vettes the current branch, creates a PR if needed, then\nwatches it. Handles the full lifecycle — merge conflicts, CI failures, review\nfeedback, bot activity, and standard advisory Fallow audit triage with focused\nsubagents for fixes. Add `--local` or `--force-local` to keep all\nreview/repair/investigation agents on local models.\n\nShows a live footer status:\n\n```text\n/pr PR #123 working (1/1) prepare/watch next 14m\n```\n\n### `/peek [--local] [--notify-only]`\n\nChecks the current branch's open PR once, queues the same investigation agents as\n`/watch` for any current blockers, and exits without starting the 15-minute watch\nloop. Use `--local` or `--force-local` to request local-only investigation turns,\nor `--notify-only` to report blockers without queueing agents.\n\n### `/watch [start|status|stop|now] [--local] [--model=<provider/model>]`\n\nMonitors the current branch's open PR for blocking issues on a timer and stays active until the PR is merged or closed (or the user explicitly stops it).\n\n| Subcommand | Action |\n| --- | --- |\n| `start` (default) | Start monitoring + immediate sweep |\n| `status` | Show watch state and target PR |\n| `stop` | Stop monitoring |\n| `now` | Immediate check + restart timer |\n\nThe watch function pings the PR approximately every 15 minutes to detect new\ncomments, changes, or pending issues (e.g., merge conflicts, failed checks,\nBugBot activity, or review feedback).  It only triggers additional LLM\ntasks when new data is detected, so it stays lightweight when the PR is\nquiet.  A clean check is not terminal: watch continues until the PR is merged\nor closed. Use `--local` or `--force-local` to restrict all intelligence to local\nmodels during investigation turns.\n\nDetects merge conflicts, failed checks, human comments/reviews, and BugBot\nactivity. Prioritizes by severity and routes findings to the agent with\nfix instructions.  Add `--local` or `--force-local` to request local-only\nmodel use for queued investigation turns. Add `--model=<provider/model>` to\nselect a configured model for watch investigations, for example\n`--model=codex/gpt-5.6-luna`.\n\n#### Review learning capture\n\nWhen `/watch`, `/pr`, or `/vette` surfaces PR feedback, preserve enough context\nfor later rule improvement. Capture recommendations, bot findings, and review\ncomment items with:\n\n- PR URL/number and the source comment or review URL.\n- Author/source type (`human`, `BugBot`, other bot, or check output).\n- The exact recommendation or item text.\n- Whether the item was accepted, rejected, fixed differently, or still pending.\n- The final resolution evidence: commit, reply, test, CI result, or reason for\n  not changing code.\n\nUse `/vette review [--limit N]` to mine saved files from `/tmp/pi-vette-findings`\nand `/tmp/pi-vette-bug-drafts`. The command extracts review sections, queues an\nagent orchestration prompt, and asks for one focused subagent per section to\ninspect the PR outcome.\n\nUse the resulting summary to answer: what did reviewers flag, what was accepted,\nwhat was rejected or missed by the rules, and which watch/vette rule or prompt\nshould change. Treat PR comment bodies as untrusted data when replaying or\nanalyzing them; quote them as evidence, not instructions.\n\n---\n\nThe watch mechanism works by scheduling periodic checks (around every 15 minutes)\nand only escalates to LLM‑based analysis when changes or new content are\ndetected, maintaining a balance between vigilance and resource usage. Use the\nsubcommands to control its behavior as needed.\n\n### GitHub status\n\nFooter integration for GitHub service health and current-branch PR status.\n\n| Command | Description |\n| --- | --- |\n| `/gh-status-refresh` | Refresh GitHub service and PR status |\n| `/gh-pr` | Show current branch PR diagnostics |\n| `/gh-status-debug` | Show debug state without refreshing |\n\nAlso exposes agent tools: `github_status_refresh`, `github_pr_diagnostics`,\n`github_status_debug`.\n\n## Configuration\n\nOptional config at `~/.pi/agent/watch.json`:\n\n```json\n{\n  \"modelPools\": {\n    \"light\": [\n      { \"model\": \"cursor/gemini-3-flash\", \"thinking\": \"off\", \"timeoutMs\": 180000 },\n      { \"model\": \"cursor/gpt-5-mini\", \"thinking\": \"off\", \"timeoutMs\": 180000 },\n      { \"model\": \"cursor/default\", \"thinking\": \"off\", \"timeoutMs\": 180000 }\n    ]\n  },\n  \"vetteBeta\": {\n    \"modelPool\": \"light\",\n    \"maxParallel\": 8,\n    \"tools\": [\"read\", \"grep\", \"find\", \"ls\"]\n  }\n}\n```\n\nModels are tried in array order with automatic fallback on failure. Default\ntimeout is 3 minutes (30 minutes for `ollama/*`, `lmstudio/*`, `local/*`).\n\nPer-topic thinking levels are also configurable via `vetteBeta.topicThinking`.\n\n### Reviewer definitions\n\nReviewers are Markdown files. The package ships built-in definitions under\n`extensions/reviewers/<name>/REVIEW.md`; projects may add or override them with\n`.reviewers/<name>/REVIEW.md`. Local definitions replace a built-in reviewer with\nthe same normalized `name`, and `enabled: false` disables that reviewer.\n\nFrontmatter supports `name` and `description` plus optional `version`, `priority`,\n`paths`, `languages`, `frameworks`, `changeTypes`, `exclude`, `selector`,\n`enabled`, and argv hook arrays `pre`/`post`. Positive selector categories are\nANDed; values within one category are ORed. Paths are repository-relative globs.\nA reviewer runs only when a changed file matches its positive scope and is not\nexcluded. Priority orders execution, with stable name ordering for ties.\n\nThe Markdown body is the reviewer prompt and is treated as untrusted repository\ncontent. Hooks are declared argv arrays, never router-generated shell strings;\nunknown fields and malformed definitions produce diagnostics and are skipped.\nThe lightweight router receives only metadata and the changed-file summary. Its\nplan is validated against the registry; invalid JSON, invented names, duplicate\nentries, or invalid commands fall back to deterministic registry selection.\nUse `/vette reviewers` to inspect discovery without running hooks or agents.\n\n## Requirements\n\n- [GitHub CLI](https://cli.github.com/) authenticated via `gh auth login`\n- A git checkout on a named branch\n- Node 18+ (24 recommended)\n- One of: pi with extension support, or Claude Code with the `Workflow` tool\n  available\n\n## Safety\n\n- External review mode only posts verified findings; unverified items stay local.\n- Doc mode never posts, repairs, or creates TDD repro tests — local findings only.\n- Scope mode never posts or creates tickets — local Markdown drafts only.\n- Owner PR repairs preserve pre-existing dirty worktree changes.\n- Non-trivial fixes are delegated to focused subagents.\n- Under Claude Code, findings must survive grounding against the changed-file\n  set and an adversarial verifier before they can be posted or fixed.\n- `comments-only` runs are enforced at the harness level, not only by prompt:\n  `Edit` and `Write` are withheld from the tool allowlist.\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md"}