{"_id":"@trygocode/notify","_rev":"49-768286f5b22de37caf30cad222248750","name":"@trygocode/notify","dist-tags":{"latest":"0.6.38"},"versions":{"0.1.0":{"name":"@trygocode/notify","version":"0.1.0","keywords":["notifications","push","push-notifications","fcm","mcp","model-context-protocol","cli","claude-code","cursor","cursor-ide","hooks","ai-coding","opencode","ralph","gocode"],"author":{"name":"GoCode"},"license":"MIT","_id":"@trygocode/notify@0.1.0","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"homepage":"https://github.com/joseph-lewis/gocode-notify#readme","bugs":{"url":"https://github.com/joseph-lewis/gocode-notify/issues"},"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"0d68b65d395701067db7faeeef8cd851559b1ea8","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.1.0.tgz","fileCount":27,"integrity":"sha512-xWLlZOq0Z991anFBMC4fYEyn24OhiTDBwVHleW+a4vycbF7Woy7+rfYPRzyekcxtsewL38UL2ZYwP/wsSJdnQw==","signatures":[{"sig":"MEUCIQDKrZY2fLQovpqcRF+HOAz32jv02fMYP1s1hLNOrUCBiAIgEd8fan1Y7W+DaD9+wwsou5g+RbM8jvwLI9vj97nc6Ow=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169219},"type":"module","engines":{"node":">=18"},"gitHead":"c2c157d02764580509b4bd9a1ac55b9312d409e0","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"repository":{"url":"git+https://github.com/joseph-lewis/gocode-notify.git","type":"git"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app. One npx command installs the hooks + MCP server.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.1.0_1780413764202_0.9931115072526431","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@trygocode/notify","version":"0.1.1","keywords":["notifications","push","push-notifications","fcm","mcp","model-context-protocol","cli","claude-code","cursor","cursor-ide","hooks","ai-coding","opencode","ralph","gocode"],"author":{"name":"GoCode"},"license":"MIT","_id":"@trygocode/notify@0.1.1","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"homepage":"https://github.com/joseph-lewis/gocode-notify#readme","bugs":{"url":"https://github.com/joseph-lewis/gocode-notify/issues"},"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"b298db61fbed1e934c1995d1dfadd179cda67a44","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.1.1.tgz","fileCount":30,"integrity":"sha512-BbnOTf/Dpo29itIQ0TRPEKpjiF3mHzeyOxba7G+3qiZEwBVg+IghgTYr9T81a1ltWU6Yf5RmAv6qceLwzQUofA==","signatures":[{"sig":"MEUCIQC2ZPl7T6C03HgNCTYAOBRg/Fsw19V9EDp45b3vk9LrdwIgL2WYW0WYv23+iO0+PrFtsPCPX7wVJuMUeikpmsRI/L0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":321323},"type":"module","engines":{"node":">=18"},"gitHead":"c2c157d02764580509b4bd9a1ac55b9312d409e0","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"repository":{"url":"git+https://github.com/joseph-lewis/gocode-notify.git","type":"git"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph Wiggum / Autopilot loops) via the free GoCode app. One npx command installs the hooks + MCP server.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.1.1_1780414614127_0.5463282837783707","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@trygocode/notify","version":"0.1.2","keywords":["notifications","push","push-notifications","fcm","mcp","model-context-protocol","cli","claude-code","cursor","cursor-ide","hooks","ai-coding","opencode","ralph","gocode"],"author":{"name":"GoCode"},"license":"MIT","_id":"@trygocode/notify@0.1.2","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"homepage":"https://github.com/joseph-lewis/gocode-notify#readme","bugs":{"url":"https://github.com/joseph-lewis/gocode-notify/issues"},"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"6b007894c5a29e02a196a7ab7e7d405c8c8b7867","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.1.2.tgz","fileCount":30,"integrity":"sha512-P9uaWCK87yN+FfxqKnmS8AoF/KuHeeOx0xa3Z1TWkn9CUkTa1xsyJx5jP/yGfBZRvpV0JBBPH1RMczPkhKCZIw==","signatures":[{"sig":"MEUCIFfB5EyHLGeQX8L7kJRxQe6b/UqMQoV7U3Q25BSihKHyAiEAqTGX1d+5lS7AbZedbHZmpFJ1qnbDR8XxDO34tJpAPjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322769},"type":"module","engines":{"node":">=18"},"gitHead":"2f3260071fe5616c04662a58489c547e2cda1d00","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"repository":{"url":"git+https://github.com/joseph-lewis/gocode-notify.git","type":"git"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph Wiggum / Autopilot loops) via the free GoCode app. One npx command installs the hooks + MCP server.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.1.2_1780546179224_0.9327698345026316","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@trygocode/notify","version":"0.1.3","keywords":["notifications","push","fcm","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.1.3","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"26246b05e7e281f69c767078ddda788e6000366a","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.1.3.tgz","fileCount":25,"integrity":"sha512-cVZavRod734768cwCAZvGy7Re2sOr+im/2sn3NqkOkrCw3Z0RG7VS+olQwYmd517v+Vb2vlANjZMHLwIoadE/g==","signatures":[{"sig":"MEYCIQCWKYtFDc29X+0tO2Ak+xmqNUd2T9NobCPlTTwnV99nNwIhAMYDXArNtuhi0CxWDpXrAU+S92ei5r7yYlPc1F2yMsVQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198195},"type":"module","engines":{"node":">=18"},"gitHead":"00dd2ce93df73a3c3d8a62e48a02fb3fbd50affd","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.1.3_1780573962344_0.98461929481593","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@trygocode/notify","version":"0.1.4","keywords":["notifications","push","fcm","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.1.4","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"ef7b0e21f7543e6f8c0af0f6534dc9ebe631be47","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.1.4.tgz","fileCount":25,"integrity":"sha512-YJ8S/ouL9v3ceyXGc4MmNH6rX1YvCGrFvgrZZXUI0DJZVsdHDBsX4IaWCKc6jyC4XgYs26ues/22itWXtDH0TQ==","signatures":[{"sig":"MEUCIGTpTXwT9xwEdD/Wfs32Oh9cPv8Oy/gdElfKKZmfg8T2AiEA16+i9rIu4Cvlh+PSBKXljGDg34MFbKvnv/GHgcv9YWY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202304},"type":"module","engines":{"node":">=18"},"gitHead":"8d229ae970e01df6760a0a5208bf3c8503f761d4","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.1.4_1780627749377_0.05444750723756786","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@trygocode/notify","version":"0.1.5","keywords":["notifications","push","fcm","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.1.5","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"6f48b3ef785122ec7a7d4ad5f4a56913d9fc27da","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.1.5.tgz","fileCount":25,"integrity":"sha512-JJGStjnYmYtmIKTOQH9JO8sQG8/fO1g2S/wnoX9XUeVC3XsSbXrOQI5d8W/W8AxbnMJ2aPtjuBb22ekOJml56A==","signatures":[{"sig":"MEUCIQDo08YHFzEiLLG0Yb693ujsia2yxr+B0HkSrtdqhvK5lgIgK46z8w3+1PAD6YBO3rcwqvpiBmod0cAEx6esWLPfHZY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204646},"type":"module","engines":{"node":">=18"},"gitHead":"68197125764138202df5339f46ad6a8469272bda","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.1.5_1780629408252_0.5319579682550446","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@trygocode/notify","version":"0.1.6","keywords":["notifications","push","fcm","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.1.6","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"bf13b9c1df1fde3705a72ae77bff98e505763608","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.1.6.tgz","fileCount":25,"integrity":"sha512-raDsBtzYZnAYnanc5Qo18i58muTjLcornxHpUgYEYoQNUARgzQl6a/Ul9DcRlbbtRkKvhXz9WtVuyWGnp3nrvg==","signatures":[{"sig":"MEUCIH7+fZHljybYMVnBqTU8lbm0LHi51X6FxDatGM6O0gXcAiEAoy95yHbCoxW3ZiWd0gMXwr3TmChaJwp75T6FwSGLzJY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204633},"type":"module","engines":{"node":">=18"},"gitHead":"68197125764138202df5339f46ad6a8469272bda","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.1.6_1780629486490_0.42463670764490846","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@trygocode/notify","version":"0.2.0","keywords":["notifications","push","fcm","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.2.0","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"8ff7b6a3ede52eaab13823bc0c6c48d78199f01b","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.2.0.tgz","fileCount":27,"integrity":"sha512-8dQTsgEwEYq9SMetCY/gY/y/doadL951Ek3HbDQlgB7MwtdGTsFww/UvQKnyoG5fUex4wU1dqFdBJVlM2SuSfA==","signatures":[{"sig":"MEUCIQCXiPlnAw5lHFSMpuEYAiV2OshAmlH/LQ6Tr+cY8K3I2QIgGYWhqkSAVxuWnipKcEz96+M8KMxXemojClozPkvtqwM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":241406},"type":"module","engines":{"node":">=18"},"gitHead":"6f27f66110e4d6eba014ad859bed03d8b5557248","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.2.0_1780808047316_0.7361045798469505","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@trygocode/notify","version":"0.3.1","keywords":["notifications","push","fcm","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.3.1","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"f88a5c60fc2c0179846e887a01e03ee9b32a87d1","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.3.1.tgz","fileCount":28,"integrity":"sha512-uJvy2HQt0HARR9Q3QI4Ir1/4i96q4hsAlCJfvqoaLFWZ1BMTalVkmS0IFo7/8ZhtpzA40gZJAV0Ca0x2WnRWng==","signatures":[{"sig":"MEUCIQDN2KKseD7dKyoTEJcAJBFQsmdmgTq5JMp18tKMsWquugIgceBkfrHDrc1me4Lkm4+uDC07hdtnVrz4m+9yB4PoQN8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":293561},"type":"module","engines":{"node":">=18"},"gitHead":"8d66c8c62b219a1df9b60b9c7095d9a092cb9e70","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.3.1_1781189209989_0.21204430346520975","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@trygocode/notify","version":"0.3.2","keywords":["notifications","push","fcm","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.3.2","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"8b4d4a9724486af4494c236fc11e42dafb2f6d3c","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.3.2.tgz","fileCount":28,"integrity":"sha512-yd1h18rZcJ0T/eYZZnyrBV89fqSyO5IZ+Vt/fKL2Zd9HHeYXQspGq1djeJfhgYUgYivjVeMuicE095n4MsQAfw==","signatures":[{"sig":"MEUCIBDkdfWxSCv8ihGYBiieDFMouu/kGo03fPquyU3GACiiAiEAn8/jDfsEd0/Cuu6rutJD2wxqCKAqNfiwZn2ikLkoEIM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":298747},"type":"module","engines":{"node":">=18"},"gitHead":"c827b99859e2d5ec6c12246a300124653ebe3e9c","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.3.2_1781228920350_0.3378370721682151","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@trygocode/notify","version":"0.3.3","keywords":["notifications","push","fcm","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.3.3","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"edae2f2dad23b63795007bfcf705b08b777d4257","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.3.3.tgz","fileCount":28,"integrity":"sha512-3x0DuR1QrR+ebFILkxLHE6YbIeCzEUw3usoz0z4/2B8b7VI5oeLs2uICAyn9rnFjbYAM3tvO8iUpxIs2d7f8FQ==","signatures":[{"sig":"MEUCIBX/3oubtHE751+oTIQ3xaAidHROa3t4A7ToOhR/0ZCvAiEAjp+adpyThsuDCT7Ym3LkRoAAlWfgtg3Z2umX8CsbX2s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":300699},"type":"module","engines":{"node":">=18"},"gitHead":"c827b99859e2d5ec6c12246a300124653ebe3e9c","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.3.3_1781230337371_0.04862401412719075","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@trygocode/notify","version":"0.3.4","keywords":["notifications","push","fcm","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.3.4","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"60acdb8905e5a4a8fb99d2f8fd559a93625a8170","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.3.4.tgz","fileCount":28,"integrity":"sha512-LU7tZvSHUMlZ7gMJk/ZG7Gqtuh8wjll3fIjmpj31vKRF2jS1lJVYw7dxiRWnHd4BfENtpcdGxLGJ2JZcDArsmQ==","signatures":[{"sig":"MEYCIQCWZmwN8eVzZ1M+YT87HE+oLx+S7npDDUuYcvP3xTcxywIhAPhNvoaUhK3dQ9gQ8K56/rl+mGCBUOubjIrBp/ZC/whI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":304627},"type":"module","engines":{"node":">=18"},"gitHead":"0aba29939e6a28ea9384b51c4db80b3dc5769140","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.3.4_1781334343606_0.0051667053461439405","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@trygocode/notify","version":"0.4.0","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.4.0","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"e4904b27be1c46b960c36e08e4dec545df682e49","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.4.0.tgz","fileCount":32,"integrity":"sha512-bn+7lqHNw2OI9RvUd6gggkGsvHVH1k1782EdSLbFJ4Dt01GAu9gP9vZD62GRHKt+n5R+zodkV03VmcWrPhDvIw==","signatures":[{"sig":"MEQCIGvaR4qIt5WoHfG990Axre1Svl9+CUb1MQhSQCGc4vfbAiAeTo0GilSIUpwSZZ2R9jCaZjIRXYZcbTfXEk7NJuaZgw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":424939},"type":"module","engines":{"node":">=18"},"gitHead":"872c5cb38fb377292ef7c69f25d4950430725ac3","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.4.0_1781745614806_0.6616328880213544","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@trygocode/notify","version":"0.5.0","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.5.0","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"d4d407512ad6d02c7bc18929cd139a8dd0b3d299","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.5.0.tgz","fileCount":32,"integrity":"sha512-HBOAO+3sxIB+msNS4LBfzSTpgfaiVvclQNFrU8l1rhdSOhyiz8BU8ifIN9Lm3yvT5JH1heoHf7uFQylEpm6jGg==","signatures":[{"sig":"MEQCIFFx9k4ZRq9W/mqhQd5q0OWfZEQVhTZrvqA5jU5d3MGYAiB3GOq2pruRNl4J1qMRMNT5kNuQeryHEop1cusMPidjIg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":437099},"type":"module","engines":{"node":">=18"},"gitHead":"872c5cb38fb377292ef7c69f25d4950430725ac3","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.5.0_1781747937527_0.9644204208465863","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@trygocode/notify","version":"0.6.0","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.0","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"947ac58944c015017e8374bae8c527a02e0fb208","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.0.tgz","fileCount":37,"integrity":"sha512-fLMHe0Jywn1BH30xhfx1pNQl1u2LPLRv6eKBbTkXbZRXKGZcwRVPAQZTS54KJ8lgIouL0KS7upHWd09xnXL78Q==","signatures":[{"sig":"MEYCIQCY+C7Z0P5a00Cr8NDpk2tluoIUS1hWN57S2La/VvjPgQIhAL0nXNZoTg8lY95RQuKC9F0w57aKhhRqvyX3eeMjcqoh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":836930},"type":"module","engines":{"node":">=18"},"gitHead":"2c823301420c2ca13c5e57cf2792859bb4882435","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.0_1781953217980_0.05936891366667196","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@trygocode/notify","version":"0.6.1","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.1","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"3d26b4278180b981f72c8f7ceed2a1214c557421","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.1.tgz","fileCount":37,"integrity":"sha512-mmOHLyp/pMyRQGxwLZ50gWnJA2hdQgHDOJFZlUmx5lw6ClFWI/Z65PY0c/A6cGFalUWRdYu9UU+e+YrB/uRSIQ==","signatures":[{"sig":"MEUCIFTq5FCiAAz2kV+7sTS17WlWKeniOvc4gC6d9IlG3M92AiEAyqQATFo8sGDP89sVbZhSyhT6AWnIYIqrtcSN6Bm98NM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":837584},"type":"module","engines":{"node":">=18"},"gitHead":"1f79ef02cc23970325f2b8f063eb0f644c00edd1","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.1_1781953980186_0.18157206457860342","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@trygocode/notify","version":"0.6.2","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.2","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"b69c96763e6d8a24ae153f88409fea35bd51f153","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.2.tgz","fileCount":39,"integrity":"sha512-zrebnJmJ87E0ghFmwWu9U9lZ9lh2mGawxG7Tnm34UjPOrmp9jtDfPMrIuQHCPH3oUQofATfCjYo3MqgEh3Xp4A==","signatures":[{"sig":"MEUCIFXLrL7WjSXywuzgIklJjc1wkQORILy2qqiK3E8CGGvsAiEAnuKOs3GYOBIKKYz/ONROxVZLgTH0vJn/X8u0upcACpU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":947436},"type":"module","engines":{"node":">=18"},"gitHead":"b4f306c8a9689a569eabce3817a67e1307ab530a","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.2_1781956667330_0.3727026842147214","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"@trygocode/notify","version":"0.6.3","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.3","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"d8b30d52395f7d7d935f0f155daf13f735e39104","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.3.tgz","fileCount":39,"integrity":"sha512-EjdAneUypNj/bPgCDyzxLJKOBUNtKS5xnqZLqjXsnm0osDHMl5jHMAOXgYdZ6vJ/Frba4WuC3gNcBh9u78FJww==","signatures":[{"sig":"MEYCIQCGDV9xAXlv+UnGxc0E2zry5RyaxTsDBFDqHdF6FeyvNgIhAI5dWMK9vwgEMsQykByQ0SRNi+l6QLCYjrGxouv00RUw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":953461},"type":"module","engines":{"node":">=18"},"gitHead":"4dd916949aa32b02a62956c4add20b4abe6e5ce2","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.3_1781959243536_0.812031596742312","host":"s3://npm-registry-packages-npm-production"}},"0.6.4":{"name":"@trygocode/notify","version":"0.6.4","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.4","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"ac7da0f2336df5ca494b9aab1a8b548c422c4a89","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.4.tgz","fileCount":39,"integrity":"sha512-CZIDtVLQx0ODuaGh3KTdBTSzB739NK4yEKgHq7EtE7sFMJc3I0no9kljF7w4oDwjnzaMBAZ1ojpz+ifeRjk7SA==","signatures":[{"sig":"MEQCIGba1uC0dD7RXLcZKrxmKiGbpUQi+QqXLqdO/HQdI6hNAiAWV4X24KZmg+BT4snSAAHzY0R2FMOzK/2gc8p3Le8JJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":953653},"type":"module","engines":{"node":">=18"},"gitHead":"34a30088295146adc8a77baad2d15d19527caa01","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.4.2","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.4_1781984699419_0.2282893119160423","host":"s3://npm-registry-packages-npm-production"}},"0.6.5":{"name":"@trygocode/notify","version":"0.6.5","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.5","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"051de0b38e3ec549b9f8d5bf582463d251eb1066","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.5.tgz","fileCount":39,"integrity":"sha512-+Fmer2mP7jPs4xFsn8lzxnOYAm57G+3rt/3BpvDqof/4Ec9GYnbRNfnu+TqygrKg6pU9fcCdUf1FJjkqMWEmuA==","signatures":[{"sig":"MEYCIQCdjX8NBGXZXkD80vCAVIhGo5glVbFxFIX8eSDw2tqhVgIhAIrL3Ye7BPRffw1pdjDoXH66X/C1sw2iCNIAXl03kyaF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":962228},"type":"module","engines":{"node":">=18"},"gitHead":"37f1b86a07bce371c20412a56d76d077088a8d2b","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.17.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.5.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.5_1785023051988_0.2168412679171281","host":"s3://npm-registry-packages-npm-production"}},"0.6.6":{"name":"@trygocode/notify","version":"0.6.6","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.6","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"a42ada81dde70dcebb18320c708da9ad4480d78c","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.6.tgz","fileCount":39,"integrity":"sha512-yC4/wrTyKu4qLbR/2IYcudh+0CKxYLjdjctA7IAf6OroF+R6R2FQakrxFUAFrg1fA1GYL+G3+G9XDx0BpHKxSA==","signatures":[{"sig":"MEYCIQCtD4yxFFfoLgPV+3N05ki118eojDdnqYrqMT2jjOnsnwIhANMBp5OG/B8/f7Vx94zu3NwfTqWn4V5iackc25afufaM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":964999},"type":"module","engines":{"node":">=18"},"gitHead":"2526578e69777689d472e02b734b55b864f459a1","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.17.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.5.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.6_1785023767239_0.025298576191574274","host":"s3://npm-registry-packages-npm-production"}},"0.6.7":{"name":"@trygocode/notify","version":"0.6.7","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.7","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"ea018f868c1594c5c906de8288e48350c9b86a83","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.7.tgz","fileCount":39,"integrity":"sha512-bnWaWFA70PH7NrWFcwA47vlpGW4HUznwwbT8KEUtpEkLEwiFWnN8MjdKFIdgBzg1Pz9vKJvVKJqOQRlStUfcdg==","signatures":[{"sig":"MEQCIELQmlmVWFJLCHnKc3oqvZuNsVqbrfA+821BDgsKNMACAiBSMJL3TZdySU/QuyyKml0AoUNwlB5W4t2lwDbPzXKWTA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":966798},"type":"module","engines":{"node":">=18"},"gitHead":"ec1e3cd647439cd33fd22e2ef03950b8c787e768","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.17.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.5.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.7_1785166116006_0.414282375076126","host":"s3://npm-registry-packages-npm-production"}},"0.6.8":{"name":"@trygocode/notify","version":"0.6.8","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.8","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"fdbd6f72b8092f6facba47a07dd862cc443e8a16","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.8.tgz","fileCount":39,"integrity":"sha512-u3MR1/ldDtJUiU1gu6GTLBGcrD7GxVH5JwR83FpPpeJk6aP4ckcropnBwEJB2rNV7y03MexRtChRLbbYg3Yhwg==","signatures":[{"sig":"MEQCIHzti9WpZU7azxh3K1N80nPLmtBa+i6/ZINIL93X+WjuAiBO9B7Wml+DiiFG25Qk0HkwxV+/caZz8EUnDBkGu2RwdA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":968884},"type":"module","engines":{"node":">=18"},"gitHead":"ec1e3cd647439cd33fd22e2ef03950b8c787e768","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.17.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.5.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.8_1785200845941_0.9813382083717566","host":"s3://npm-registry-packages-npm-production"}},"0.6.9":{"name":"@trygocode/notify","version":"0.6.9","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.9","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"26dca5f8e2a26b84facfd076d5f794edf0038525","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.9.tgz","fileCount":41,"integrity":"sha512-YCCao9VD3xVRhEkvGGumle+8wKpkFl3BYlMCQWg3tbRcF3JN0jJkymorMBYeZ5iEyrsLLNouV57ZoORHbUm/+w==","signatures":[{"sig":"MEUCIQCeH6sznSLcdc9iL2J3eFFEcXG0uBSV3WFEA3nNIj8wYAIgZj9ocVXWWYZbgVBHYmPn1T6214klLTNHa3Ir9W1xGnQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1006572},"type":"module","engines":{"node":">=18"},"gitHead":"650709cb6a76aecbc4557d3614d8ab37d65fb247","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.9_1788101989697_0.9921717530506242","host":"s3://npm-registry-packages-npm-production"}},"0.6.10":{"name":"@trygocode/notify","version":"0.6.10","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.10","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"a1190a48b66c2182c675b1660711dcd611b8c95d","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.10.tgz","fileCount":41,"integrity":"sha512-2TXbZUbdid3uo11pLrk7b/2UhP9pKv5a/N5vDf+6d8ooaLKyekZuBhWpnP8pUIXeDq4eg/LNFKPtkArOiOScZg==","signatures":[{"sig":"MEYCIQDnhjGN/qrb+byzLxiBSmph0liHZS1eyJviYWmbWpCU8wIhAMczp4qycZfVErGDAui+ruu9CDQCIcMdPCE1WtsR7ysY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1007329},"type":"module","engines":{"node":">=18"},"gitHead":"650709cb6a76aecbc4557d3614d8ab37d65fb247","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.10_1788102345670_0.8048137706551792","host":"s3://npm-registry-packages-npm-production"}},"0.6.11":{"name":"@trygocode/notify","version":"0.6.11","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.11","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"f7e10854ba6035677465c0311d2f88c6df18014b","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.11.tgz","fileCount":42,"integrity":"sha512-DKa4iWHK+bYhJ2eodtF1GcT2G5ZY2rKRscMoCWAXZdHsFoHuBAU3kG/EGgjQ/jWqiFiT8CzrWB9RzGxQ/+BA3g==","signatures":[{"sig":"MEQCIAHqDrTSKkBS4EcmWMxEFlnkLSekepA37ZQYnOhOsZMjAiBcaVQX7XucR3I5NUd4rLxFTxiP+39ewFgViX3fxeCyTA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1021216},"type":"module","engines":{"node":">=18"},"gitHead":"650709cb6a76aecbc4557d3614d8ab37d65fb247","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.11_1788104570889_0.2549325966223175","host":"s3://npm-registry-packages-npm-production"}},"0.6.12":{"name":"@trygocode/notify","version":"0.6.12","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.12","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"ec33cf90bdce41208bcd48b4a742e479003353dd","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.12.tgz","fileCount":42,"integrity":"sha512-bMSWi7kRFbHouJnSzVMbgtUDsSdnGuloP1GSv6ASGk8NNK56yDx98Koc9eFCXwIki0Py16Doy1ug4Kif2Kqmqg==","signatures":[{"sig":"MEQCIC91/A/jZLIKHlUzX4NGj59/IrqgpwEefh1EMLR4j5DMAiBI5WhfUDfJr0wXsCxNIuyioiZBixJUQ//qtMZuERvJJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1021868},"type":"module","engines":{"node":">=18"},"gitHead":"650709cb6a76aecbc4557d3614d8ab37d65fb247","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.12_1788104640351_0.6745571267960861","host":"s3://npm-registry-packages-npm-production"}},"0.6.13":{"name":"@trygocode/notify","version":"0.6.13","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.13","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"2ccee9868375359e4dffa4088070ffd0b2bd5df9","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.13.tgz","fileCount":42,"integrity":"sha512-8htjBanIsdgVXGdO0sg31dir6/L1D1BJuvyPVhwEK4NuiB5ZBOMMjpE32/HgWwMsFgv8b16suLmCEsGdrxvUaA==","signatures":[{"sig":"MEUCIFlPeqeNVNhoJwiFm+wuOkFMBqfKANzJK9Kbndz/dnXZAiEAwoD7r3WLX6O72uIH1TPiGy0iTZbSewClVDwil+GgSbc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1026890},"type":"module","engines":{"node":">=18"},"gitHead":"650709cb6a76aecbc4557d3614d8ab37d65fb247","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.13_1788106895117_0.94754601028666","host":"s3://npm-registry-packages-npm-production"}},"0.6.14":{"name":"@trygocode/notify","version":"0.6.14","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.14","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"c8a8e76e53615015cc8f03dcf8b0fa5d97ee2b49","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.14.tgz","fileCount":42,"integrity":"sha512-8jeVUQ27ZLZD79gYZqvcXxQ4eopAayNVy0Wa8Rx2pZlntG+9xG2+YFBMm6WdeY8disnIpGN5ubKrNa/9cJUmHw==","signatures":[{"sig":"MEUCIG51mnMgNSIugnN7s3cfGWGfln3Auw5+f0Y0Lnkd59H9AiEA8CmwhvBIl6n4vLNRyOYexGX7sVniHfh35YjxgMuXhg0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1032015},"type":"module","engines":{"node":">=18"},"gitHead":"2541de7c8b3ce64b26f1eeba1021fa6238263047","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.14_1788155818895_0.0524840743793733","host":"s3://npm-registry-packages-npm-production"}},"0.6.15":{"name":"@trygocode/notify","version":"0.6.15","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.15","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"19c775679f956fde892fb73e799c18b962663232","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.15.tgz","fileCount":43,"integrity":"sha512-k/TLoCqfESe13uH/IBMOtjLnoCDsfaP7/4R8BCjWsb3eOeMMd0a8VG4lz2SRyjKf1xvqizSYmPGwoabtirJkOA==","signatures":[{"sig":"MEYCIQDkIy1Bf44aNPl3xWPc0FaQWQXdbejWlCb8/2ll2dpbBQIhAOHrnxbTc5pay14dkKONHjJrgb7xigXeNPAGhOoJlXzq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1063104},"type":"module","engines":{"node":">=18"},"gitHead":"775b265a5108352a82937e5eb45bf9167a290182","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.15_1788163844609_0.26307273681422805","host":"s3://npm-registry-packages-npm-production"}},"0.6.16":{"name":"@trygocode/notify","version":"0.6.16","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.16","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"7d1bb77373d96bb9f4dea177d5abbeae1c04d9a2","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.16.tgz","fileCount":43,"integrity":"sha512-tMgNQBAzd+nQCRgLfB4si3iAyRjQr0LjEZf3/f27JF7O/MtY1NMCso/JpgRwEcdFlWq6tfFKs5JAYNYdrHVvaQ==","signatures":[{"sig":"MEQCIBIf9DHhjziEsa/HEOhX8en6TcCyD0oeOJ2rF68hacavAiBxP21COsj05nx60NdDG41mJ0j4pXPjDHZ9iAfBFRA/5g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1067133},"type":"module","engines":{"node":">=18"},"gitHead":"24cf2c53a3310ff2050456eca60d0ea01b9eeec2","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.16_1788173472230_0.39870863481798424","host":"s3://npm-registry-packages-npm-production"}},"0.6.17":{"name":"@trygocode/notify","version":"0.6.17","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.17","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"68d49f581610ca6d4168c7842eb1134433450038","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.17.tgz","fileCount":43,"integrity":"sha512-z9Wd3MgOORsA2fWbXLMgK5MRMLt3eOGl+Zvf39sVWzrtNOP0b4BsOwW9Lx87mkNfJw4mTEYcOj5nOjXsYR7nfg==","signatures":[{"sig":"MEUCIQDNhwJ4a2VwlZ97BKGyZGwexuO5He1JOl69Gcq0S+vC+gIgOZUVrRzUbxUWVnkgquefZu1olIDP7PClPtlpLetpZNA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1070374},"type":"module","engines":{"node":">=18"},"gitHead":"470f9ade3ff60193d79f5315c2a314c515f9a4c3","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.17_1788174266266_0.4493578665265652","host":"s3://npm-registry-packages-npm-production"}},"0.6.18":{"name":"@trygocode/notify","version":"0.6.18","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.18","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"b7ba1b29966a5c5cb936cb8d05ca964597a56bc4","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.18.tgz","fileCount":43,"integrity":"sha512-/RLlsIaFE4CJFabIUrQESCrdALJzzTDVh+JbbKJaodfZ5w/zh7Q2ZIO+H8+yMVS3cVMzZs8k1yi1Q+VBcG2skw==","signatures":[{"sig":"MEQCIEZ/JGXyn9pUtg/doJfjSunVPGb44+iFKtIIGfNoRw4HAiBKFEJieuvsAqQxWrOol/ptc2ZcXvv145fpEqIDTYuApw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1074776},"type":"module","engines":{"node":">=18"},"gitHead":"b87eb5c618d357ee93c9433e407694cc9920e3c0","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.18_1788182848748_0.7380784410751524","host":"s3://npm-registry-packages-npm-production"}},"0.6.19":{"name":"@trygocode/notify","version":"0.6.19","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.19","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"7dafbc235a902ab3b709b56aa0f3b4934324123e","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.19.tgz","fileCount":43,"integrity":"sha512-stI4WrVvx/gMVleMr6Xcg0PpPjYGKHvScFsKdpIrPk3JmW9u94sy8FfvOh8XO25xV/X4fIcSQVg2f5obls+MBQ==","signatures":[{"sig":"MEUCIHS422nS+CNky0Wd6O4taS0uIUDoDUwaDcoxLd2yLghBAiEA1W/8hCslvbQsVU4qDvC27RcXbR9QEbtMMun29+4h6HY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1082709},"type":"module","engines":{"node":">=18"},"gitHead":"898f4c4cc1dc8b7044e68bc363b78dc4c93c641f","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.19_1788185980944_0.5711659677713092","host":"s3://npm-registry-packages-npm-production"}},"0.6.20":{"name":"@trygocode/notify","version":"0.6.20","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.20","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"725aac586c80b84e7fd374855dbaac4c8ea3b6aa","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.20.tgz","fileCount":44,"integrity":"sha512-SE0O2UZk7zKovwo/CGLY2jJ1oiPxVQJzVrb56XExyfIAVIL2gbA2zMTqrldlHpL6ctSkZa+N5FzDICsu54DNMw==","signatures":[{"sig":"MEYCIQCzgS+Y1DwKKZMjx6mbLQKCwUn8Mr1E+aF2uUJmAXweMQIhAM4dS+3kIeJKgJchUBIQx+nCJZ6JozmtSLWw7CLGB499","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1124156},"type":"module","engines":{"node":">=18"},"gitHead":"898f4c4cc1dc8b7044e68bc363b78dc4c93c641f","scripts":{"test":"node --test \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.20_1788230578527_0.3986036574938412","host":"s3://npm-registry-packages-npm-production"}},"0.6.21":{"name":"@trygocode/notify","version":"0.6.21","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.21","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"02702e40429576740b9d75aa6aab49e2752b5970","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.21.tgz","fileCount":44,"integrity":"sha512-oY6+2DjotPOsJEh3gT+/2uswFOboxmJ6mXc7Vv8t2HppjJT131QtC/tHlAQGI9jwhEqcbL7LCRZD7AFEofnW9g==","signatures":[{"sig":"MEUCIGULibejVHS503bvum+rf6M6YUHDp4mrf7nFS9hXGDsAAiEAvYDn2mxhOrluTxDYz972liqBRhLfl79f5rvYDIEDiO8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1127489},"type":"module","engines":{"node":">=18"},"gitHead":"898f4c4cc1dc8b7044e68bc363b78dc4c93c641f","scripts":{"test":"node --test --test-concurrency=1 \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.21_1788232423798_0.007315016503941951","host":"s3://npm-registry-packages-npm-production"}},"0.6.22":{"name":"@trygocode/notify","version":"0.6.22","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.22","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"c5c068d92f9bd3b8d2b7a457e2d04dbfd0750b5e","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.22.tgz","fileCount":44,"integrity":"sha512-xydygmJBiBJdifHJcw9FwtHVD6bzh4nnwU3G8yrFFjcWMQwv/P4FvLCLZdEhgOF6zEXISuWympsdeFYwVQA3MA==","signatures":[{"sig":"MEYCIQCcHIG/F8ITPRdHTpGDPWydWIw5z3YqOhQEhuyXwKl5bQIhANqwiVoq0S4qBw8CWDh7RAUC68pfqe2G8+p+BELEhEdU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1130852},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node --test --test-concurrency=1 \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.22_1788238755058_0.3906030684130539","host":"s3://npm-registry-packages-npm-production"}},"0.6.24":{"name":"@trygocode/notify","version":"0.6.24","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.24","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"94993f809962410475bf13d6b35205d5ed0fc117","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.24.tgz","fileCount":44,"integrity":"sha512-yGeQ9VdCTJ1LgaWyp0LbDjf5H9v5M3LOg/UQA+EPcacFJMHzeu+RP5JVwPmPhx+mNvjSyZx0R/kgTuaIMZod4w==","signatures":[{"sig":"MEQCIBL17cGiPQflCkhZ1XK49CKzSjXXrOOiDXjy9px6KySfAiAqKvIYCfm/d8aP3ei5WjhhFp1w6s4zdEQPAkRnI/xlrQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1100354},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node --test --test-concurrency=1 \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.24_1788454590146_0.5724837842076316","host":"s3://npm-registry-packages-npm-production"}},"0.6.25":{"name":"@trygocode/notify","version":"0.6.25","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.25","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"c366732be3491f8a224cea62d13f215fe6cecdd6","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.25.tgz","fileCount":44,"integrity":"sha512-KiKSS8u8br0MwwLoNZ0+JB4EsmM38lhHBCfOaQJ5gvgMusGJ4YKAq8kHp9cPXdXsFAXOZtk+se4eSdfdlPV95g==","signatures":[{"sig":"MEUCIEFsXImkTNseAARerH09bkR49/4xGm1g9gNu/KQK3niUAiEAtHnaK9o5cxBK+kcCo4Cm9kUP05eHCq0TdtQI19jc0OU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1094890},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node --test --test-concurrency=1 \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.25_1788456970834_0.6533420987808991","host":"s3://npm-registry-packages-npm-production"}},"0.6.26":{"name":"@trygocode/notify","version":"0.6.26","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.26","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"bb8acd311312b98047db7ef49c01fab2144c3be3","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.26.tgz","fileCount":44,"integrity":"sha512-pzWmcaY260QngkHThZQs5k8W+wVYUAse7mVEmj+1UrwcZ6HgZjTK70PNcUA1yAUsP+37Qj+43u4U1K2jfQYFaA==","signatures":[{"sig":"MEUCIQCS53PpmS3IdpL32N0vI9dyiVurMTTcXBt6UHhjfCvCCQIgaMaOaIZgPH4jO+fZKTas285Hob1TbvOn6dw2M13r06g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1096224},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node --test --test-concurrency=1 \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.26_1788458910847_0.23925881925550785","host":"s3://npm-registry-packages-npm-production"}},"0.6.27":{"name":"@trygocode/notify","version":"0.6.27","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.27","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"a22caec1e6a64d87c348af854c47cf5559b12ae3","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.27.tgz","fileCount":44,"integrity":"sha512-pTSe/yHdaxhSHuGUvjnj73YVTg6pMy59ojqU3wYwhQCo6Zsv4DB6/gxVCN0eZqyoj9S0CIvO7PgKlP9xRZdfjQ==","signatures":[{"sig":"MEQCIFeh0lPFAR+x1PXRBMjTTtW4mTMVGbwXKeqWEkG+3d4tAiBsBx11gulIt3dM6SnXaOQ8x9HxTaKRWW1rZQ7Z/nZY2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1097061},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node --test --test-concurrency=1 \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.27_1788459416983_0.0319455037983023","host":"s3://npm-registry-packages-npm-production"}},"0.6.30":{"name":"@trygocode/notify","version":"0.6.30","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.30","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"b35b8d4d531285d2bcaeab9a6dc6455e77b7c6b6","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.30.tgz","fileCount":45,"integrity":"sha512-7WES5HuCVu1PPTQ5fckc08b4/R0BvrF0iMFUIrpaUtTB1/2kAeNkiBUQaT3RBtzpR7cbMYGf0fHFe0VlCh8OTQ==","signatures":[{"sig":"MEUCIDrZbVPaAqLHwv9k82o0LXspluIH47GFkKy3vQA954iVAiEApCYPcrmNeEy8tnG0JrCQm1pwAk+J0kFkLW/onfUw/tY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1085647},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node --test --test-concurrency=1 \"dist/test/**/*.test.js\"","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.30_1788467294977_0.7347410792201294","host":"s3://npm-registry-packages-npm-production"}},"0.6.31":{"name":"@trygocode/notify","version":"0.6.31","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.31","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"55819b205661ef08d4a2c98a52243aecb0f78fd4","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.31.tgz","fileCount":45,"integrity":"sha512-6jS634q/CdlEa1f7bOGQmvVrXQFJcMrdxTauaQ/zcKIkIONHnovqeP7ncOK5te5boUJmkNQARBBLatUth+amxg==","signatures":[{"sig":"MEUCICBTar6qD7GY5ud5VOM1FXNyjjOgVutKiVC95qwjsWqtAiEAkfxFVLNCBpIJLROrLk3x6/01kcwY4Ty2XmkYzNUj+po=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1089970},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node scripts/run-tests-isolated.mjs","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.31_1788473474856_0.8235130028935991","host":"s3://npm-registry-packages-npm-production"}},"0.6.32":{"name":"@trygocode/notify","version":"0.6.32","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.32","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"03a88427b0c52b8b97fce1ee737ee92acadeabb6","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.32.tgz","fileCount":45,"integrity":"sha512-puqD4RPF8XBuSaZkytAAxe1k6Rfj9jU/euQ8o9Iyb9vPK7o5SjLwdicm3spwckESIHuERhpTS7PLMBuqkwZ3Wg==","unpackedSize":1089970},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node scripts/run-tests-isolated.mjs","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.32_1788473700693_0.2827541769573847","host":"s3://npm-registry-packages-npm-production"}},"0.6.33":{"name":"@trygocode/notify","version":"0.6.33","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.33","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"dae2d50fcad703a07be0d93a9b4f34a18ab8f00d","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.33.tgz","fileCount":45,"integrity":"sha512-bp2dDVeeNgjM5nlkxmPis6fqzLCXXoZqpUpFOku79C4FYhbSCjogVDa/PF1FC14aeVaq+SdyHUjcXsxWR+VNhQ==","signatures":[{"sig":"MEUCIE+42yx7AGmzG//OfWlLQ39HYy3dbECi85KL1fMfhRz/AiEAj5lPKUrqc/n+UMJAtL9OohML1T9FbR1OHBEp/i47v+Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1089970},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node scripts/run-tests-isolated.mjs","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.33_1788474369884_0.02857692295490044","host":"s3://npm-registry-packages-npm-production"}},"0.6.34":{"name":"@trygocode/notify","version":"0.6.34","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.34","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"8e29e13574fd824693f9e576ea9d831647227ff7","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.34.tgz","fileCount":45,"integrity":"sha512-A/68wzUzj7nbzeb7FfdzLHxbVsoTxpn5WjIGq4+6arNVzg1VZQhEAiP184HQ0AS41KZmhFK89WPF1Z7g6zhBJw==","signatures":[{"sig":"MEYCIQDMptdDxaxWbthtXfXBfq0XlQFpELtNVq5UMmfuTVOjwwIhAKWFkkuTx7GjkOhU8sjWRA0MXMLcLtlb5rT8mLOTqOgf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1091656},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node scripts/run-tests-isolated.mjs","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.34_1788474652594_0.3511779057797153","host":"s3://npm-registry-packages-npm-production"}},"0.6.36":{"name":"@trygocode/notify","version":"0.6.36","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.36","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"9386d696dccde1d60db76ea4a11d308fcfb428e3","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.36.tgz","fileCount":45,"integrity":"sha512-Bra9aF6a4eFyVwhxPNn36TfFxkr5ascMfc8adM0tiJpvYT2hy57BH8KZ64PkIYpyaumRcw3DBBv3XJEzOfLi9Q==","signatures":[{"sig":"MEUCIQDU4zVRANObTBNax0MjvLrx/7sbk8cOh1iX4KDn/FYljwIgB1L1+v5aavDkcqsfav3+Z9X5x60AX5wOkiMgrK+qC6s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1093471},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node scripts/run-tests-isolated.mjs","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.36_1788485392090_0.18326048380753157","host":"s3://npm-registry-packages-npm-production"}},"0.6.37":{"name":"@trygocode/notify","version":"0.6.37","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"license":"MIT","_id":"@trygocode/notify@0.6.37","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"bin":{"gocode-notify":"dist/src/cli.js"},"dist":{"shasum":"dba5e7d053acb7ba1d3282c8e2ea34000edf01f2","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.37.tgz","fileCount":45,"integrity":"sha512-WTJZftM5ixmGT3j3isqW/toJHNd4IoLJTqfytMjRZv7/4Y3U5cpDV/OB4fxOlKARl8cZNluu5JpdV36I5gy/Aw==","signatures":[{"sig":"MEYCIQDnhwB/xPbSs/Jn09HaSAT5qHnKaoaJqDsCDjNWRw+3JgIhAIUza1YsC3BWQswqqIemFRqPQ4TSKZx37Ul999RgO3Ku","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1102917},"type":"module","engines":{"node":">=18"},"gitHead":"d89a2e63196ac74794f0a8dd5641b795fdc7d8d8","scripts":{"test":"node scripts/run-tests-isolated.mjs","build":"tsc -p tsconfig.json","clean":"rm -rf dist","pretest":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"_npmVersion":"11.18.0","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/notify_0.6.37_1788491481154_0.5405135440304412","host":"s3://npm-registry-packages-npm-production"}},"0.6.38":{"name":"@trygocode/notify","version":"0.6.38","description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","license":"MIT","type":"module","bin":{"gocode-notify":"dist/src/cli.js"},"engines":{"node":">=18"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","pretest":"tsc -p tsconfig.json","test":"node scripts/run-tests-isolated.mjs","prepublishOnly":"npm run build","clean":"rm -rf dist"},"keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"devDependencies":{"@types/node":"^20.11.0","typescript":"^5.4.0"},"gitHead":"7035bd4fa08499dd86bdd144863ab55185e954f7","_id":"@trygocode/notify@0.6.38","_nodeVersion":"26.6.0","_npmVersion":"11.18.0","dist":{"integrity":"sha512-5nU+X7Gg9IcqwtpNhn0gUdzD1Ig/xLAW0xgMvVPS3v3C05y1AGWUdgdbBB/gYshCMgOdl52tV8H31mIL6uVnRA==","shasum":"1e93b0ca74563a34546f592b18d9f6f9deb42412","tarball":"https://registry.npmjs.org/@trygocode/notify/-/notify-0.6.38.tgz","fileCount":45,"unpackedSize":1106953,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEN9XP5sfSb7DT3wJbcFa2mfqp2BS+mMPD8OBUflYT+yAiBbe25bVi8GkdX1G5XAdP1/I8WbGTdWS7v44SDH1FlELA=="}]},"_npmUser":{"name":"stakksoftware","email":"admin@stakksoftware.com"},"directories":{},"maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/notify_0.6.38_1788512564584_0.17805699308186673"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-02T15:22:44.044Z","modified":"2026-09-04T09:02:44.900Z","0.1.0":"2026-06-02T15:22:44.334Z","0.1.1":"2026-06-02T15:36:54.290Z","0.1.2":"2026-06-04T04:09:39.407Z","0.1.3":"2026-06-04T11:52:42.516Z","0.1.4":"2026-06-05T02:49:09.544Z","0.1.5":"2026-06-05T03:16:48.472Z","0.1.6":"2026-06-05T03:18:06.638Z","0.2.0":"2026-06-07T04:54:07.527Z","0.3.1":"2026-06-11T14:46:50.142Z","0.3.2":"2026-06-12T01:48:40.562Z","0.3.3":"2026-06-12T02:12:17.576Z","0.3.4":"2026-06-13T07:05:43.760Z","0.4.0":"2026-06-18T01:20:14.990Z","0.5.0":"2026-06-18T01:58:57.720Z","0.6.0":"2026-06-20T11:00:18.134Z","0.6.1":"2026-06-20T11:13:00.360Z","0.6.2":"2026-06-20T11:57:47.510Z","0.6.3":"2026-06-20T12:40:43.734Z","0.6.4":"2026-06-20T19:44:59.571Z","0.6.5":"2026-07-25T23:44:12.272Z","0.6.6":"2026-07-25T23:56:07.387Z","0.6.7":"2026-07-27T15:28:36.168Z","0.6.8":"2026-07-28T01:07:26.123Z","0.6.9":"2026-08-30T14:59:49.879Z","0.6.10":"2026-08-30T15:05:45.815Z","0.6.11":"2026-08-30T15:42:51.038Z","0.6.12":"2026-08-30T15:44:00.537Z","0.6.13":"2026-08-30T16:21:35.334Z","0.6.14":"2026-08-31T05:56:59.057Z","0.6.15":"2026-08-31T08:10:44.777Z","0.6.16":"2026-08-31T10:51:12.373Z","0.6.17":"2026-08-31T11:04:26.397Z","0.6.18":"2026-08-31T13:27:28.896Z","0.6.19":"2026-08-31T14:19:41.122Z","0.6.20":"2026-09-01T02:42:58.670Z","0.6.21":"2026-09-01T03:13:43.959Z","0.6.22":"2026-09-01T04:59:15.212Z","0.6.24":"2026-09-03T16:56:30.318Z","0.6.25":"2026-09-03T17:36:10.990Z","0.6.26":"2026-09-03T18:08:31.006Z","0.6.27":"2026-09-03T18:16:57.119Z","0.6.30":"2026-09-03T20:28:15.173Z","0.6.31":"2026-09-03T22:11:21.688Z","0.6.32":"2026-09-03T22:15:00.896Z","0.6.33":"2026-09-03T22:26:10.067Z","0.6.34":"2026-09-03T22:30:52.809Z","0.6.36":"2026-09-04T01:29:52.301Z","0.6.37":"2026-09-04T03:11:21.312Z","0.6.38":"2026-09-04T09:02:44.734Z"},"license":"MIT","keywords":["notifications","push","fcm","desktop-notifications","toast","mcp","cli","claude-code","cursor","ralph","gocode"],"description":"Free phone + branded desktop notifications for any coding agent (Cursor, Claude Code, OpenCode, Ralph/Homer) via the GoCode app.","maintainers":[{"name":"stakksoftware","email":"admin@stakksoftware.com"}],"readme":"# @trygocode/notify\n\nFree phone **and branded desktop** notifications for any coding agent — **Cursor,\nClaude Code, OpenCode, or any Ralph/Homer loop** — delivered to your phone via the\n[GoCode](https://oh.jeltechsolutions.com) app + FCM, and to your computer as a\nnative **\"GoCode\"** banner.\n\nYou get an automatic notification when your agent **finishes a turn**, **goes idle\nwaiting for you**, **errors out**, or when an overnight **loop completes / halts**\n— on your phone AND on the computer you're working on (on by default) — so you can\nwalk away and let either device tell you when it needs you.\n\n## Contents\n\n- [Install — two equally-supported paths](#install--two-equally-supported-paths)\n- [Pairing — step by step](#pairing--step-by-step)\n- [The three triggers](#the-three-triggers)\n- [Hand off to your server — `launch` / `autopilot`](#hand-off-to-your-server--launch--autopilot)\n- [Auto-push to git (opt-in)](#auto-push-to-git-opt-in)\n- [Settings sync — the `config` command](#settings-sync--the-config-command)\n- [Ralph/Homer opt-in snippet (trigger C)](#ralphhomer-opt-in-snippet-trigger-c)\n- [Notify from any custom script (the minimal one-liner)](#notify-from-any-custom-script-the-minimal-one-liner)\n- [Troubleshooting](#troubleshooting)\n- [Changelog](#changelog)\n- [Develop](#develop)\n- [Layout](#layout)\n\n## Install — two equally-supported paths\n\nBoth paths converge on the same installer (`gocode-notify setup`): it pairs this\nmachine, auto-detects your agent runtimes, and merges the hooks + MCP server +\nanti-double-ping rule into each one's config (never clobbering your existing\nsettings; safe to re-run).\n\n### Path 1 — paste a one-liner into your terminal\n\n```bash\nnpx -y --prefer-online @trygocode/notify@latest setup\n```\n\nThis runs the interactive installer: it prompts for the 6-digit pairing code\n(from the GoCode app → **\"Connect a coding agent\"**), then detects and configures\nClaude Code / Cursor / OpenCode. Re-run any time — it's idempotent; pass\n`--force` to re-pair.\n\n> Until the package is published to npm, point `npx` at the local tarball\n> (`npm pack` in this directory, then `npx ./gocode-notify-*.tgz setup`) or a\n> path install. The npm publish is a user-owned step — see\n> [`docs/GOCODE_NOTIFY_MANUAL_STEPS.md`](../../docs/GOCODE_NOTIFY_MANUAL_STEPS.md).\n\n### Path 2 — paste a prompt into your AI agent and let it install\n\nHand this to Cursor / Claude Code and the agent does the install for you. The\n`--agent-driven` flag suppresses interactive prompts and emits one JSON line per\nstep so the agent can verify each one:\n\n```\nInstall GoCode phone notifications for this machine. Run:\n  npx -y --prefer-online @trygocode/notify@latest setup --agent-driven --pair-code <CODE>\nThen confirm the hooks and MCP server were written, and run\n  npx -y --prefer-online @trygocode/notify@latest test\nto send a test push to my phone. Report whether the test push arrived.\n```\n\nReplace `<CODE>` with the 6-digit code from the GoCode app. `--agent-driven` is\nfully idempotent and machine-readable; it never spawns a prompt.\n\n## Pairing — step by step\n\nA dev machine running agent hooks has no GoCode login (no JWT), so it can't use\nGitHub OAuth. Instead you pair it once with a short-lived **6-digit code**, which\nthe CLI exchanges for a scoped, push-only **API key** stored locally. The key can\nonly send pushes to *your* phone — it can't read chats, settings, or trigger any\nagent action, and you can revoke it from the app at any time.\n\n1. **In the GoCode app**, open **Settings → \"Connect a coding agent\"**. The app\n   shows a large 6-digit code (valid 10 minutes), a copyable\n   `npx @trygocode/notify login --code 123456` line, and a 10:00 countdown. Tap\n   **\"Generate new code\"** if it expires.\n2. **On the machine**, either run the full installer (`npx -y --prefer-online @trygocode/notify@latest\n   setup`, which pairs *and* writes your agent configs) or just pair on its own:\n\n   ```bash\n   # Interactive — prompts for the code:\n   npx -y --prefer-online @trygocode/notify@latest login\n\n   # Or pass it directly (and optionally label this machine):\n   npx -y --prefer-online @trygocode/notify@latest login --code 123456 --label \"MacBook Pro — Cursor\"\n   ```\n3. The CLI calls the server's `pair/claim` endpoint, receives the API key **once**,\n   and writes it to `~/.gocode/credentials` (chmod `600`). The app flips to a\n   **\"connected ✓\"** success state showing the machine's label.\n4. **Verify the round-trip** with a real push to your phone:\n\n   ```bash\n   npx -y --prefer-online @trygocode/notify@latest test\n   ```\n\n   A \"GoCode test\" notification should arrive on your paired device. If it\n   doesn't, see [Troubleshooting](#troubleshooting).\n\n**Re-pairing.** Both `login` and `setup` are idempotent — re-running them won't\nclobber an existing pairing. To deliberately replace the stored key (new machine\nowner, rotated key), pass `--force` to `setup` (or just run `login` again with a\nfresh code). Revoke an old machine from the app's **\"Connected agents\"** screen.\n\n**Server selection.** Pairing and every send resolve the server URL in this\nprecedence order: the `--server` flag → the `GOCODE_SERVER` env var → the value\nsaved in `~/.gocode/credentials` → the built-in default\n(`https://oh.jeltechsolutions.com`). You only need `--server` for a self-hosted\nor staging GoCode server.\n\n**Redistributing under your own server.** The built-in default is not baked in\nas a fixed author box — set `GOCODE_DEFAULT_SERVER` to point fresh, unpaired\ninstalls at your OWN GoCode server without patching the source or having every\nuser pass `--server`/`GOCODE_SERVER`. It only changes the *fallback* default;\nalready-paired machines keep the server in their `~/.gocode/credentials`.\n\n## The three triggers\n\n| Trigger | Mechanism | Fires when |\n|---|---|---|\n| **(A) Runtime hook** | Cursor `stop` / Claude Code `Stop`+`Notification` / OpenCode `session.idle` plugin | The MAIN agent finishes a turn, goes idle, or errors — **automatic, the killer feature** |\n| **(B) MCP tool** | `gocode_notify` tool the agent calls | You *explicitly* ask \"ping me when X is done\" mid-task |\n| **(C) Loop shell hook** | one line in your loop's completion/halt path | A Ralph/Homer loop reaches `completed` / `halted` |\n\nThe installed rule/skill tells the agent **not** to call the MCP tool for\ndone/idle/error pings — those are owned by the deterministic hook (A), so you\nnever get double-pinged.\n\n> **Cursor `stop.status` → kind mapping (0.6.37).**\n> Cursor's `stop` hook carries a `status` field in its stdin JSON. The `on-stop`\n> dispatcher maps it to the right notification kind automatically:\n>\n> | Cursor `stop.status` | Notification kind | Meaning |\n> |---|---|---|\n> | `completed` | `finished` | Agent turned cleanly (default — same as before 0.3.0) |\n> | `aborted` | _(suppressed — no notification)_ | Cursor uses this for both an unanswered question and manual **Stop**. The exact transcript watcher owns verified question delivery, so the ambiguous terminal hook never produces a false alert. |\n> | `error` | `error` | Agent hit an error |\n> | absent / unrecognised | `finished` | Back-compatible fallback |\n>\n> Before 0.3.0, Cursor only ever sent `finished` regardless of what the agent\n> did. The status mapping requires no hook re-installation — run\n> `gocode-notify setup --force` once to apply the updated hook command.\n\n> **Question detection — \"Agent needs you\" (since 0.5.0).** When the agent\n> **pauses to ask you a question** (as opposed to finishing its work), the\n> package fires an `awaiting_input` ping titled **\"Agent needs you\"** instead of\n> a misleading `finished`. The available signal differs per runtime:\n>\n> | Runtime | Question signal | Status |\n> |---|---|---|\n> | **Claude Code** | dedicated `Notification` hook → `awaiting_input` | ✅ Live — questions show as questions |\n> | **OpenCode** | `permission.asked` plugin event → `awaiting_input` | ✅ Live — OpenCode genuinely exposes a \"needs you\" signal |\n> | **Cursor** | turn-scoped transcript watcher → `awaiting_input` | ✅ Exact path when Cursor persists the tool record |\n>\n> **Cursor caveat:** Cursor currently exposes **no** \"agent needs input\" event\n> (its docs list `Notification` as unsupported), and there is a\n> [confirmed-open Cursor bug](https://forum.cursor.com/t/askquestion-tool-does-not-trigger-cursor-hooks/152230)\n> where the `AskQuestion` tool fires **zero** hooks. The package's normal\n> turn-scoped watcher detects it immediately whenever Cursor writes the tool into\n> the conversation transcript.\n>\n> **Exact-evidence policy (0.6.25).** A sentence that merely ends with a question\n> (for example, “Want me to deploy?”) is not proof that Cursor is paused. It is\n> sent as a normal completion unless the current turn has an actual\n> `AskQuestion` / `AskUserQuestion` tool record. This deliberately favours a\n> missed hidden card over a false **“Agent needs you”** alert.\n>\n> **Automatic attribution and delivery guard (0.6.37).** The watcher remains the exact,\n> project-attributed path. An automatic Cursor **“Agent needs you”** send with\n> no validated workspace/project is a logged no-op: it can never become a\n> global phone interruption—even a legacy direct `send` command is suppressed.\n> The watcher ignores a question that is flushed with a terminal record, and\n> retries while its live lease remains active when the server reports zero\n> accepted direct-device FCM legs. The terminal `aborted` hook remains\n> suppressed because it cannot distinguish a manual **Stop** from a real input\n> request. This preserves precision; a native card Cursor neither exposes nor\n> writes to the transcript cannot safely be detected until Cursor provides a\n> distinct \"awaiting user input\" hook status.\n>\n> **Trusted Cursor question context (0.6.34).** Cursor starts detached hook commands from\n> `~/.cursor`, not the workspace. The transcript watcher requires a real workspace plus a Cursor conversation and\n> generation identity. It carries the workspace label captured from the hook\n> payload, so an exact question card is attributed to its real project rather\n> than appearing as a global or `.cursor` alert. Projectless, legacy, malformed,\n> or generic-trace watcher leases are rejected and cannot notify. Setup retires\n> invalid legacy leases with terminal tombstones, so a detached old worker cannot\n> resume after the upgrade.\n>\n> **Retired trace fallback (0.6.23).** An earlier experimental recovery path\n> attempted to infer a hidden Cursor card from private generic trace events. Live\n> traffic proved that those events also occur during ordinary tool activity, so\n> it produced false **“Agent needs you”** alerts. The package now withdraws that\n> inference permanently: a real question must have an exact public or\n> transcript-backed signal. This does not change Cursor’s question card,\n> choices, or answer flow.\n>\n> ```bash\n> gocode-notify cursor-question-fallback status\n> ```\n>\n> The deprecated `enable` command fails safely and clears any stale local\n> setting. A hidden card that exposes neither a hook nor transcript record cannot\n> currently notify until Cursor provides a real needs-input event.\n\n> **OpenCode's hook (A)** is a small `session.idle` plugin written to\n> `~/.config/opencode/plugin/gocode-notify.js`; on each `session.idle` event it\n> fire-and-forgets `gocode-notify on-stop --source opencode` (the same\n> dispatcher as Cursor/Claude), so OpenCode is a fully-supported runtime with\n> identical behaviour.\n\n> **Under the hood (since auto-push landed):** the runtime hook (A) no longer\n> shells straight to `send`. It now calls a single end-of-turn **dispatcher**,\n> `gocode-notify on-stop --source <runtime> || true`, which decides per repo:\n> if auto-push is enabled for this repo it runs the push flow (and sends ONE\n> notification carrying the commit summary); otherwise it sends the ordinary\n> `finished` ping exactly as before. One hook entry, one notification per turn.\n> Existing installs upgrade their hook automatically on the next\n> `setup`/`setup --force`. `send` and `test` remain callable on their own for\n> scripts and power users.\n\n## Desktop notifications (branded, on by default)\n\nGoCode Notify also raises a **real, branded \"GoCode\" banner on the computer you're\nworking on** — the same instant your phone gets pinged — so you're told whether\nyou're at your desk or away. It's **ON by default** once the package is installed\nand is controlled by the **same server-synced settings** as the phone push, so a\ntoggle in the app or the terminal flips the computer banner everywhere.\n\n**Word-for-word identical to the phone.** The banner reads exactly the same as the\npush you'd get on your phone — same status emoji, IDE/source label, project, and\nper-kind copy (e.g. `✅ Cursor · openhandapp — Agent finished`). The wording is a\nfaithful mirror of the server's notification decoration and the Flutter client's,\npinned by a cross-check test (`notify_copy.test.ts`) so the three surfaces can't\ndrift.\n\n**Click to open your IDE (macOS).** Clicking the banner opens the **IDE window for\nthat project** — the same editor that raised the turn (Cursor / VS Code), focused\non the project you were working in. This is best-effort: when the IDE/project\ncan't be named the banner is simply display-only (never a dead or mis-routed\nclick). It opens the project *window*, not a specific past chat — IDEs don't\nexpose reliable per-chat deep links.\n\n| OS | How it's shown | Branded as |\n|---|---|---|\n| **macOS** | A one-time `osacompile`d `GoCode.app` helper under `~/.gocode/desktop/` raises the banner via the system | **\"GoCode\"** + the GoCode icon |\n| **Windows** | A WinRT `ToastGeneric` toast bound to a one-time Start-Menu shortcut carrying the `GoCode.Notify` AppUserModelID | **\"GoCode\"** |\n| **Linux** | `notify-send -a GoCode -i <icon>` | **\"GoCode\"** + icon |\n\n**Zero new dependencies.** It uses only tools that ship with the OS (`osacompile`/\n`osascript`/`sips` on macOS, PowerShell + WinRT on Windows, `notify-send` on Linux)\n— so the **one-line install does not change at all**. The first banner builds a tiny\nbranded helper once and caches it; every banner after that just fires it.\n\n### Control it\n\nFrom the **GoCode app** (Settings → **GoCode Notify** → *Desktop notifications*),\nor from the terminal:\n\n```bash\ngocode-notify config set desktop.enabled false   # silence the computer banner\ngocode-notify config set desktop.sound   false   # keep the banner, drop the sound\n```\n\nThe phone push is unaffected — `desktop.*` only governs the local banner.\n\n### Try it right now\n\n```bash\n# Fire a branded test banner on THIS computer (independent of the phone push):\ngocode-notify test --desktop\n```\n\nYou should see a **\"GoCode\"** notification appear on your screen. On a headless\nbox / CI / SSH session where a banner makes no sense, set\n`GOCODE_NOTIFY_NO_DESKTOP=1` to hard-disable local banners for that machine.\n\n> **macOS branding note.** A bare `osascript` banner is attributed to \"Script\n> Editor\". To brand it \"GoCode\", the package compiles a minimal AppleScript app\n> bundle (`~/.gocode/desktop/GoCode.app`) once with `osacompile` (ships with\n> every Mac — no Xcode/Swift) and drops the GoCode icon into it via `sips`. If\n> that one-time setup ever fails, the banner still fires (unbranded) rather than\n> blocking your turn.\n\n## Hand off to your server — `launch` / `autopilot`\n\n> **New in 0.2.0.** Notify can now do more than ping your phone — it can **hand a\n> big task off to your GoCode server** to run as an autonomous Autopilot loop.\n> Close your laptop; the work keeps going server-side in your isolated sandbox,\n> shows up in the GoCode phone app like any other Autopilot run, and your phone\n> buzzes when it's done (or needs you).\n\nThis is the opposite direction of the three notify triggers above: instead of\n*your local agent pinging your phone*, `launch` *starts a fresh server-side\nbuild* from an explicit, self-contained task. It reuses the **same `gck_`\npairing** — no new login. It reads **no conversation content** (only the task\nstring you hand it), so it ships in this base package (see the trust note below).\n\n### CLI\n\n```bash\n# Start a loop from a plain task (server synthesizes a PRD, then builds):\ngocode-notify launch \"Refactor the auth module to use sessions, add tests\" \\\n  --repo owner/repo\n\n# alias:\ngocode-notify autopilot \"Add a CSV export endpoint with tests\" --repo owner/repo\n\n# Or hand it a pre-written checkbox PRD instead of a task string:\ngocode-notify launch --prd-file ./my-prd.md --repo owner/repo\n```\n\n| Flag | Meaning |\n|---|---|\n| `<task>` (positional) | Plain-language task the server loop builds. Mutually exclusive with `--prd-file`. |\n| `--prd-file <path>` | A pre-written checkbox PRD (base64-encoded and sent as `prd_markdown`). |\n| `--repo owner/repo` | Optional repo context for synthesis / the loop's target. |\n| `--branch <suffix>` | Optional branch suffix the loop pushes to. |\n| `--model \"Profile\"` | Optional LLM-profile name override. |\n| `--runner-kind <kind>` | Optional runner override (default `openhands-conversation`). |\n| `--server <URL>` | Same server-resolution precedence as every other command. |\n| `--agent-driven` | Emit one machine-readable JSON step line (for installers/agents). |\n\nOn success it prints the **loop id**, a **deep link** that opens the run in the\napp, and a \"running on your GoCode server — close your laptop; your phone will\nbuzz when it's done\" line, then exits `0`. Unlike the fire-and-forget\n`send`/`on-stop` hooks, `launch` is an **explicit interactive action**: it\nreports real failures (not paired / unreachable / 4xx) with a clear message and a\n**non-zero exit**, and it does **not** queue to the offline outbox (a stale\nlaunch surfacing hours later could duplicate work).\n\n### MCP tool\n\nYour desktop agent (Cursor / Claude Code / OpenCode) can fire a remote loop\nmid-session via the third MCP tool, **`gocode_launch_autopilot`**\n(`{ task (required), repo?, branch? }`). Its description tells the agent to call\nit **only when you explicitly ask to offload / run in the background / overnight**\n— never for a normal task it can do right there. On success it relays the loop id\n+ deep link; on failure it returns an actionable re-pair hint.\n\n> **Heads-up the rule states:** the server loop is a **fresh agent with no access\n> to your IDE's open/unsaved files** — so the task must be **self-contained** and\n> point at a repo the server can build from a clean checkout. If the work depends\n> on local uncommitted state, commit/push first, then hand it off.\n\n### Trust boundary\n\n`launch` reads **only the explicit task string** (and optional repo/branch) you\nhand it — it does **not** read or upload your IDE conversation transcript, and it\ntouches only `~/.gocode/credentials` (the `gck_` key it already uses for notify).\nIt POSTs to **your own configurable GoCode server**. So the base package's \"never\nreads your conversation content\" promise still holds.\n\n## Auto-push to git (opt-in)\n\nGoCode Notify can **auto-commit and push your work after every agent turn** —\nwith an **AI-written commit message** describing what just changed — so an\novernight Cursor/Claude/Ralph session lands as a tidy series of pushed commits\nand your phone tells you each time, commit summary included.\n\nIt is **OFF by default** and deliberately conservative (see the safety posture\nbelow). The full design lives in\n[`docs/GOCODE_NOTIFY_AUTO_PUSH_AND_SYNC.md`](../../docs/GOCODE_NOTIFY_AUTO_PUSH_AND_SYNC.md).\n\n### Enable it\n\nFrom the **GoCode app** (Settings → **GoCode Notify** → *Auto-push after every\nprompt*; a first-enable dialog explains the behaviour), or from the terminal:\n\n```bash\n# Turn auto-push on for ALL repos (global default):\ngocode-notify config set auto_push.enabled true\n\n# Or scope it to just the current repo:\ngocode-notify config set auto_push.enabled true --repo\n```\n\nEither editor writes to the server (the single source of truth); the change is\npicked up by every linked machine on its next turn (within the 60s settings\ncache, or immediately after `gocode-notify config pull`).\n\n### What happens on each turn (when enabled)\n\nThe `on-stop` dispatcher runs this best-effort push flow (it **always exits 0**\nso a git hiccup can never block or fail your agent's turn):\n\n1. Resolve the merged Notify settings for this repo (cached ~60s).\n2. If `auto_push.enabled` is not true for the repo → no-op (plain ping).\n3. Verify it's a git repo; resolve the target branch (per-repo override →\n   global default → current checked-out branch).\n4. **Branch guard:** never push to `main`/`master` unless you have separately\n   set `auto_push.allow_protected true`. Protected + not allowed → skip, no push.\n5. `git add -A`; if the tree is clean → exit 0 (no spurious notification).\n6. Compose the commit message (AI, with deterministic fallback — see below).\n7. `git commit` then `git push <remote> <branch>` — **fast-forward only, never\n   `--force`.** A non-FF rejection sends an `error` notification (\"auto-push\n   rejected — pull + retry\") and exits 0.\n8. Send ONE `finished` push whose body carries the commit summary, branch, and\n   short SHA.\n\n### The AI commit message (free) + deterministic fallback\n\nThe commit subject/body is summarised **using credentials you already have on\nthe machine** — so it costs GoCode nothing. Resolution chain (first that works\nwins, hard **8s** cap):\n\n1. `commit_message.mode = \"deterministic\"` → skip AI, use the template below.\n2. Otherwise an explicit `commit_message.command` (e.g. `\"claude -p\"`,\n   `\"cursor-agent --print\"`, `\"ollama run llama3.2\"`) — the staged diff is\n   piped in on stdin with a fixed prompt; output is sanitised (code fences /\n   \"Here is…\" preambles stripped, subject clamped to ≤72 chars).\n3. Auto-detect from `--source`: `claude` on PATH for Claude Code, `cursor-agent`\n   for Cursor, else `ollama` if present.\n4. **Deterministic fallback** (always available — used if the above fail or time\n   out): `<type>: <N> file(s) changed on <branch>` + a `git diff --stat` block,\n   where `<type>` is inferred from the changed paths (`docs:`/`test:`/`chore:`/\n   `feat:`). The push **never** fails because the AI summary was unavailable.\n\n### Try it without writing anything\n\n```bash\n# Print exactly what the end-of-turn dispatcher WOULD do (no git writes, no push):\ngocode-notify on-stop --dry-run\n```\n\n### Safety posture (conservative defaults)\n\n- **OFF by default**, opt-in, with a first-time confirmation in the app.\n- **Branch guard ON:** `main`/`master` are never auto-pushed unless\n  `auto_push.allow_protected` is explicitly true.\n- **No force-push, ever** — plain fast-forward `git push`; non-FF → error\n  notification, no rewrite.\n- **Never blocks the agent** — every step is best-effort and exits 0, the same\n  contract as `send`.\n\n## Settings sync — the `config` command\n\nNotify behaviour used to be hard-wired; now it's a small set of **per-user\nsettings stored on the server** and editable from either the phone app or the\nterminal. Whatever you change in one place propagates to the other (and to your\nother linked machines).\n\n```bash\ngocode-notify config get [--repo]                 # print the merged settings (JSON/pretty)\ngocode-notify config set <key> <value> [--repo]   # validate, write to server, refresh cache\ngocode-notify config pull                          # force-refresh the local cache from server\n```\n\n- `--repo` scopes a read or write to the **current repo's** per-project\n  override (keyed by a stable `repo_key` derived from the `origin` remote)\n  instead of your global defaults. Per-repo overrides deep-merge over the global\n  blob.\n- Writes go to the server **and** update the local cache so the next stop-hook\n  is immediate. Unknown keys are rejected with the list of valid keys.\n\nValid keys (mirror of the canonical schema):\n\n| Key | Type | Meaning |\n|---|---|---|\n| `kinds.finished` / `kinds.error` / `kinds.awaiting_input` / `kinds.loop_completed` / `kinds.loop_halted` / `kinds.ralph_waiting` | bool | Per-kind notification toggles |\n| `min_duration_seconds` | int ≥ 0 | Only notify if the turn ran ≥ N seconds (0 = always) |\n| `quiet_hours.enabled` / `quiet_hours.start` / `quiet_hours.end` / `quiet_hours.tz` | bool / `HH:MM` / `HH:MM` / IANA tz | Do-not-disturb window |\n| `auto_push.enabled` | bool | Master auto-push switch (OFF by default) |\n| `auto_push.default_branch` | string \\| null | Global default push branch (null = current branch) |\n| `auto_push.branch` | string \\| null | **`--repo` only** — per-repo push branch override |\n| `auto_push.allow_protected` | bool | Permit auto-push to `main`/`master` (default false) |\n| `auto_push.remote` | string | Git remote to push to (default `origin`) |\n| `auto_push.skip_git_hooks` | bool | Pass `--no-verify` to the auto-commit (default false) |\n| `commit_message.mode` | `auto` \\| `ai` \\| `deterministic` | Commit-message strategy |\n| `commit_message.command` | string \\| null | Explicit local summariser command |\n| `commit_message.max_diff_bytes` | int > 0 | Diff byte cap fed to the summariser (default 61440) |\n| `desktop.enabled` | bool | Branded desktop banner on this computer (**ON by default**) |\n| `desktop.sound` | bool | Play a sound with the desktop banner (default true) |\n\n```bash\n# Examples\ngocode-notify config set quiet_hours \"23:00-07:00\"     # shorthand: enable + set window\ngocode-notify config set min_duration_seconds 30\ngocode-notify config set kinds.error false\ngocode-notify config set auto_push.branch dev --repo   # push this repo to \"dev\"\n```\n\n## Ralph/Homer opt-in snippet (trigger C)\n\nFor power users running a loop **they control** (this repo's `ralph`/`homer`\nskills, a `while :; do … done` one-liner, or any custom driver), drop these two\nlines into the loop's completion/halt path:\n\n```bash\n# At loop completion:\ngocode-notify send --kind loop_completed --source ralph --project \"$(basename \"$PWD\")\" || true\n# At loop halt (paused_max_failures / awaiting_human):\ngocode-notify send --kind loop_halted --source ralph --project \"$(basename \"$PWD\")\" \\\n  --title \"Ralph halted — needs you\" || true\n```\n\nThe ready-to-copy version with comments lives at\n[`snippets/ralph-homer.sh`](snippets/ralph-homer.sh).\n\n**This is opt-in and never auto-injected** — the installer does not edit your\nloop scripts. Both lines are fire-and-forget (`|| true` + the CLI's 5s\nself-timeout), so a failed or slow push can never block or fail your loop.\n\n## Notify from any custom script (the minimal one-liner)\n\nAny shell script — a cron job, a `Makefile` target, a post-build hook, or\nsomeone else's automation — can send a push with a single line, no configuration\nbeyond a one-time `gocode-notify login` pairing:\n\n```bash\ngocode-notify send --kind finished --source <name> || true\n```\n\nReplace `<name>` with a short identifier for the script (e.g. `ci`, `build`,\n`deploy`). The `|| true` guard ensures a failed or slow push **never** blocks the\ncalling script (the CLI also self-times-out in 5 seconds).\n\n> **Discovery hint:** `gocode-notify status` always prints this line at the\n> bottom of its report so you can copy-paste it even when you don't have the\n> README handy.\n\n**Other useful kinds for custom scripts:**\n\n| Kind | When to use |\n|---|---|\n| `finished` | Script completed cleanly |\n| `error` | Script hit an error |\n| `awaiting_input` | Script paused; a human is needed |\n| `loop_completed` | Long-running loop finished all work |\n| `loop_halted` | Long-running loop stopped; human needed |\n\nPass `--title \"My script\"` and `--body \"extra detail\"` to customise the\nnotification text. Use `--project \"$(basename \"$PWD\")\"` to badge it with the\nproject name on your phone. All flags are optional — only `--kind` is required.\n\nSee `snippets/ralph-homer.sh` for the full Ralph/Homer lifecycle pattern\n(completed / halted / stall-edge / resumed).\n\n## Troubleshooting\n\n**Start here:** `gocode-notify status` prints a one-screen report — whether\ncredentials are present (and the bound user/label), whether the server is\nreachable, which agent runtimes were detected, and whether each one's config has\nbeen written. Most issues below are diagnosable from that output.\n\n| Symptom | Likely cause & fix |\n|---|---|\n| `test` / `send` prints **\"not paired\"** | No `~/.gocode/credentials`. Run `gocode-notify login` and pair from the app (see [Pairing](#pairing--step-by-step)). |\n| **Pairing fails** (\"invalid or expired code\") | Codes expire after 10 min and are single-use. Tap **\"Generate new code\"** in the app and re-run `login` with the fresh code. |\n| `status` shows **Server: not reachable** | Network/DNS/firewall, or a wrong server URL. Confirm you can reach `https://oh.jeltechsolutions.com`; check the `--server` flag / `GOCODE_SERVER` env / the `server` field in `~/.gocode/credentials`. |\n| **No push arrives** even though `test` exits 0 | The send is fire-and-forget and exits 0 even on failure — check `~/.gocode/notify.log` for the real error. Also confirm push permissions are granted in the GoCode app and the device token is registered (re-open the app once after signing in). |\n| **Double pings** (two notifications per event) | The agent is calling the `gocode_notify` MCP tool *and* the runtime hook is firing. Re-run `setup` so the anti-double-ping rule/skill is installed; it tells the agent not to notify for automatic done/idle/error events. |\n| **Hook doesn't fire** in Cursor / Claude Code / OpenCode | Re-run `setup` and check `status` shows \"config written\" for that runtime. Restart the agent app so it reloads `~/.cursor/hooks.json` / `~/.claude/settings.json` / `~/.config/opencode/plugin/gocode-notify.js`. The hooks are merged, never clobbered — your existing hooks are preserved. |\n| `doctor` says Claude hooks are missing but GoCode Sync is installed | Expected and accurate: Sync's `Stop` hook uploads transcripts; it is not a Notify hook and cannot deliver completion pushes. Run `gocode-notify setup` to install Notify's separate `Stop` + `Notification` hooks. |\n| **Pushes queue up while offline** then arrive later | Expected. Sends made while the server is unreachable are enqueued to `~/.gocode/outbox/` (size-capped, drop-oldest) and flushed best-effort on the next `send`. A missed \"done\" ping is acceptable; a blocked agent is not. |\n| **`npx @trygocode/notify` can't find the package** | Until it's published to npm, run from a local tarball: `npm pack` in `tools/gocode-notify/`, then `npx ./gocode-notify-*.tgz <command>`. See [`docs/GOCODE_NOTIFY_MANUAL_STEPS.md`](../../docs/GOCODE_NOTIFY_MANUAL_STEPS.md). |\n| **Want it gone** | `gocode-notify uninstall` removes exactly the hook/MCP/rule entries this tool added (nothing else). Delete `~/.gocode/` to also drop the stored credentials, and revoke the key from the app's **\"Connected agents\"** screen. |\n\n**Logs & files.** Failures are appended to `~/.gocode/notify.log` (size-capped,\nrotated to `notify.log.1`). Credentials live in `~/.gocode/credentials` (chmod\n`600`); non-secret prefs in `~/.gocode/config.json`; the offline queue in\n`~/.gocode/outbox/`.\n\nFor the device/secret/publish/deploy steps that are **not** part of this package\n(Android `google-services.json`, iOS APNs, server service-account, WSL rebuild,\nnpm publish, real-device E2E), see\n[`docs/GOCODE_NOTIFY_MANUAL_STEPS.md`](../../docs/GOCODE_NOTIFY_MANUAL_STEPS.md).\n\n## Changelog\n\n### 0.6.34\n\n- **Stopped un-attributable Claude “Agent needs you” alerts.** An automatic\n  Claude input notification now requires the documented `Notification` payload:\n  an allowed `notification_type`, `session_id`, and an absolute workspace\n  `cwd`. Missing or malformed legacy fields, and Cursor-imported Claude events,\n  fail closed rather than being guessed as a user blocker. `idle_prompt` is\n  also excluded because it is not proof that a human action is required.\n- **Isolated package tests from your real GoCode state.** `npm test` now runs\n  with a temporary `HOME`, so test-only hook, worker, and failure-log fixtures\n  cannot pollute `~/.gocode/notify.log`, credentials, watcher leases, or outbox.\n- **Clarified Cursor’s exact-evidence boundary.** The watcher remains the\n  installed Cursor path. A native question card that Cursor neither emits as a\n  hook nor persists in the transcript is deliberately silent; it continues to\n  display and accept the same multi-answer choices in Cursor.\n\n### 0.6.30\n\n- **Fixed an unpublished-hook gap.** The safer Cursor code was not active on\n  this Mac: its installed hooks still ran 0.6.27, including the retired\n  `postToolUse` and `afterAgentResponse` paths that could emit a projectless\n  **“Agent needs you”** alert. Re-running `setup` removes only those old\n  GoCode-owned entries, preserves user hooks, and installs the v2 exact\n  transcript watcher.\n- **Superseded by 0.6.34.** Embedded Claude events are no longer accepted as\n  question evidence in Cursor, because Cursor documents the Claude\n  `Notification` import as unsupported. The native Cursor watcher owns\n  attributed Cursor question delivery.\n- **Made `gocode-notify test` a reliable handset probe.** Each run carries a\n  fresh diagnostic dedupe key, so a recently deduplicated test is not\n  misreported as a missing direct device.\n\n### 0.6.28\n\n- **Eliminated stale projectless Cursor question alerts.** Automatic\n  `awaiting_input` delivery now requires a genuine Cursor workspace, conversation\n  ID, generation ID, and exact `AskQuestion` tool evidence. A missing or\n  untrusted hook context is a safe no-op, never a global **“Agent needs you”**\n  alert.\n- The watcher lease now has a validated v2 schema with mandatory project\n  attribution. `setup` replaces pre-v2 leases with terminal tombstones, and the\n  worker rejects them even if an old detached process attempts to run one.\n- Existing Cursor cards, their multiple-choice options, and their answer flow\n  are unchanged. This only changes whether an external notification is emitted.\n\n### 0.6.27\n\n- **Fixed project-less Cursor question cards.** The direct `postToolUse`\n  AskQuestion hook now consumes Cursor’s hook payload through\n  `on-cursor-question`, and both it and the detached transcript watcher derive\n  the workspace project before posting **Agent needs you**. This does not\n  change Cursor’s card, choices, answer flow, or the exact-evidence policy.\n\n### 0.6.25\n\n- **Eliminated the remaining Cursor prose false-alert path.** `afterAgentResponse`\n  and stop-time recovery now require a current, explicit\n  `AskQuestion`/`AskUserQuestion` transcript record before sending **Agent needs\n  you**. A terminal “Want me to …?” sentence, unreadable transcript, and stale\n  legacy turn-state record all resolve to a normal completion.\n- **Preserved exact signals only.** The transcript watcher, stop-time\n  exact-tool recovery, and future Cursor `postToolUse` AskQuestion hook still\n  send one deduplicated awaiting-input alert. Cursor’s native card and choices\n  are unchanged. A card Cursor exposes nowhere remains intentionally silent\n  rather than being inferred from generic activity.\n- **Hardened FCM stale-token cleanup.** On FCM’s typed HTTP-404\n  `UNREGISTERED` response, the dispatcher removes only the exact direct token\n  belonging to the user whose send failed. Generic 404s, topic sends, and a\n  concurrently reassigned token are preserved.\n\n### 0.6.24\n\n- **Eliminated ambiguous force-stop alerts.** Cursor reports both a user force\n  stop and an interrupted question as `aborted`; the stop-time recovery now\n  sends **Agent needs you** only when the transcript contains a real\n  `AskQuestion` record. An unreadable/unknown transcript is safely suppressed\n  rather than guessed as a question.\n- **Preserved exact-question cancellation.** A Cursor terminal hook marks its\n  transcript watcher terminal, so a late-flushed tool record cannot create a\n  stale alert after the turn has already ended.\n\n### 0.6.23\n\n- **Withdrew the Cursor private-trace question heuristic.** Logs proved its\n  generic lifecycle spans occur on ordinary Cursor turns, creating false\n  **“Agent needs you”** notifications without a project or real blocker.\n  Question pings now require an exact `AskQuestion` signal from the public hook,\n  transcript watcher, response classifier, or stop-time transcript recovery.\n- **Cursor’s native multi-answer question experience is unchanged.** The package\n  does not alter the card, choices, or answer flow. Truly hidden cards with no\n  exact signal remain unobservable until Cursor exposes a real needs-input event;\n  that safety trade-off is preferable to notifying about nonexistent blockers.\n- **Upgrades shut off stale 0.6.22 workers.** Every `setup` invocation writes the\n  retired local fallback preference as disabled while preserving other local\n  config. The compatibility command remains for one release cycle: `status`\n  reports inactive, `disable` succeeds, and `enable` fails safely.\n\n### 0.6.22\n\n- **Question-card diagnostics are now correlatable without chat leakage.**\n  Watcher and trace-fallback decisions include the running package version,\n  process ID, and truncated turn/candidate references. This makes it possible\n  to prove which installed runtime observed a card while never logging a path,\n  prompt, question, tool input, or tool output.\n- **“Accepted” is no longer described as “delivered.”** A successful GoCode\n  server response proves the request was accepted for FCM fan-out; it cannot\n  prove that a particular phone rendered it. Command, MCP, watcher, and\n  diagnostic wording now make that boundary explicit.\n- **Stale direct FCM registrations self-heal safely.** The server removes a\n  registration only after FCM returns its exact typed `UNREGISTERED` error for\n  that direct token. Generic 404s and topic sends never delete a token; cleanup\n  failures are logged and do not interrupt delivery attempts to other devices.\n- **Cursor question cards were unchanged.** The now-withdrawn experimental\n  fallback did not alter Cursor’s native multi-answer card, available choices,\n  or response flow.\n- **Runtime versions are deterministic.** Setup writes the current exact\n  package version into live hooks and MCP entries, so a detached hook cannot\n  silently execute an old `@latest` cache. Re-run the `--prefer-online` setup\n  command above after each upgrade to replace those pinned entries.\n\n### 0.6.21\n\n- **Fixed the real Cursor 3.18.9 hidden-card trace shape.** Live evidence\n  showed that Cursor emits its generic `AgentResponseAdapter.toolCallStarted`\n  lifecycle span for both ordinary tools and the native multi-answer question\n  card. The experimental fallback now treats that span as required,\n  non-suppressing corroboration; it still suppresses a candidate when an exact\n  concrete executor (including Cursor's observed `LocalReadExecutor`) appears\n  during the ten-second quiet window. This preserves the question card and\n  avoids turning ordinary tools into notifications.\n- **Made the full package test command deterministic.** Node's default\n  file-level parallelism occasionally hit a test-runner IPC deserialization\n  failure despite every individual test passing. The suite now runs serially,\n  so `npm test` is reproducible.\n\n### 0.6.20\n\n- **Experimental recovery for Cursor 3.18.9 option cards that are invisible to\n  every public hook and the conversation transcript.** Some native\n  `AskQuestion` A/B/C/D cards rendered without a `postToolUse`,\n  `afterAgentResponse`, `stop`, or transcript tool-record signal — so there was\n  literally nothing the normal notifier could observe until a manual force-stop.\n  An explicitly local opt-in,\n  `gocode-notify cursor-question-fallback enable`, now adds a bounded fallback\n  for that exact Cursor/macOS build.\n- **The card itself is unchanged.** The fallback never changes the agent prompt,\n  the AskQuestion tool, the choices, or the user’s answer flow. It only observes\n  local structural request-trace fields, waits 10 seconds, and sends the existing\n  generic **“Agent needs you”** notification if no safer signal wins.\n- **Conservative negative controls, Codex-reviewed:** it is disabled by default;\n  version/platform pinned; reads only recent regular files under Cursor’s log\n  root (including workbench windows) with inode/EOF/age/byte caps; extracts no prompt/tool content; and cancels on\n  concrete normal tool/executor spans (including a two-second look-behind);\n  requires a matching neutral adapter-start lifecycle signal;\n  assistant/transcript activity, terminal stop, superseding prompt, rotation,\n  expiry, or a live local disable. The stop path marks the matching watch\n  terminal before network work and shares the inferred-card dedupe key, avoiding\n  both late and duplicate pings.\n- **Diagnostics without chat leakage:** `TRACE-FALLBACK` log lines report gate,\n  candidate, suppression, and delivery decisions using only truncated IDs. They\n  never log raw trace lines, paths, prompts, question text, tool arguments, or\n  outputs.\n\n### 0.6.19\n\n- **Fixed brand-new/new-window Cursor chats whose transcript does not exist yet\n  at `beforeSubmitPrompt`.** Live logs showed a real new-window question getting\n  `ARM-SKIP has_conv=yes has_transcript=no`, then Cursor creating its JSONL about\n  ten seconds later — too late for the old watcher. The hook now arms a\n  **120-second pending discovery watch** whenever it has a conversation id. It\n  checks once per second for the main conversation JSONL, attaches as soon as it\n  appears, then detects its AskQuestion card normally.\n- **Safe discovery, Codex-reviewed:** transcript resolution is now tri-state:\n  `found` / `confirmed_absent` / `error`. Only a file positively known to be\n  absent at arm-time is scanned from byte zero after creation; an uncertain\n  lookup snapshots EOF instead, so an old answered AskQuestion can never replay.\n  Discovery captures the new inode, does not recurse into subagent transcripts,\n  uses a time-based deadline, and rechecks the lease nonce immediately before\n  delivery to prevent stale/superseded-turn pings.\n\n### 0.6.18\n\n- **Fixed the detached-worker environment gap that could silently lose phone\n  pushes after a question card was detected.** Cursor's GUI hook environment can\n  omit `$HOME`; the detached `question-watch-worker` then read a different/non-\n  existent `.gocode` directory and its phone `send()` failed or was queued\n  silently, while the local desktop banner could still appear. The parent now\n  resolves and explicitly passes the stable home directory to the worker; the\n  worker uses it consistently for credentials, settings cache, outbox, desktop\n  helper and logging.\n- **Question-worker delivery is now observable and fault-isolated.** Every\n  detected card logs `WORKER-SEND start` and then\n  `WORKER-SEND result=ok|ok-zero|fail|throw`, HTTP status, device count,\n  server-source, desktop result, outbox outcome and elapsed time. Phone and\n  desktop attempts use `Promise.allSettled`, so one failure cannot mask the\n  other; an unexpected delivery throw is logged by the watch loop instead of\n  silently swallowed.\n\n### 0.6.17\n\n- **The watcher now arms even when Cursor omits `transcript_path` (the real\n  new-window failure).** Live diagnostics (0.6.16's `ARM-*` logs) revealed the\n  `beforeSubmitPrompt` hook often fires with a `conversation_id` but **no\n  `transcript_path`** — so the watcher skipped (`ARM-SKIP`) and no question ping\n  was possible. It now **derives** the transcript from the conversation id\n  (`<home>/.cursor/projects/<slug>/agent-transcripts/<id>/<id>.jsonl`, globally\n  unique), so a card in a fresh window/chat is watched. `ARM-ENTER` now logs\n  `has_transcript=payload|derived|no` so the source is visible. Path-traversal-\n  guarded; injectable fs for tests.\n\n### 0.6.16\n\n- **Fixed the real reason waiting AskQuestion cards sometimes never notified.**\n  The turn-scoped watcher passed each newly-appended transcript batch to a\n  detector that only inspected the **latest** assistant record. If a poll picked\n  up an `AskQuestion` record **plus a later plain-assistant/user record** in the\n  same ~150 ms batch, the ask was **swallowed** and no ping fired. The watcher now\n  scans **every** appended record in forward order (`scanAppended` +\n  `detectAskToolInRecord`), keeps the **first** AskQuestion, and still flags\n  `turn_ended` — the ask always wins regardless of what lands after it in the\n  batch. (Codex-diagnosed from live transcripts.)\n- **Arm-time diagnostic logging** so \"did the watcher even arm?\" is answerable\n  from `~/.gocode/notify.log`: `ARM-ENTER` (has_conv/has_transcript/stdin_len),\n  `ARM-SKIP` (why it skipped), `ARM-ERROR stage=…`, and `WORKER-SPAWN-ERROR`.\n  These replace the previous silent skips/swallowed errors.\n\n### 0.6.15\n\n- **Waiting AskQuestion cards now notify WITHOUT a force-stop (the real fix).**\n  Root cause: an AskQuestion options-card (A/B/C/D) is a MID-TURN pause — Cursor's\n  `stop` hook only fires when the WHOLE turn ends, so a card left waiting produced\n  no stop-time signal (only a manual force-stop fired `stop` → \"questions only\n  notify if I force-stop\"). New design: a **turn-scoped watcher** armed by a\n  `beforeSubmitPrompt` hook. It snapshots the transcript byte-offset + inode and\n  spawns a tiny detached worker that tails only appended bytes and fires\n  \"Agent needs you\" the instant an `AskQuestion` tool_use record appears —\n  independent of stop/afterAgentResponse timing. One process per turn,\n  self-terminating (ask delivered · turn ended · superseded by a newer prompt ·\n  transcript rotated · TTL). Precision-first: delivers ONLY on the real tool\n  record, never on a plain completion.\n- **Manual Force-Stop is now precise (only questions ping).** The Cursor\n  `aborted` path delivers \"Agent needs you\" ONLY when the transcript's latest\n  assistant turn actually has an AskQuestion tool (or the transcript is\n  unreadable — deliver over silence); a plain manual Stop of a non-question turn\n  is now **suppressed**. This is the long-requested \"only questions, never manual\n  stops\" behaviour, now achievable via the tool record.\n- **No double-ping.** The watcher and the force-stop fallback share ONE\n  event-specific dedupe key (`cursor-ask-<gen>-<hash>` over the tool fingerprint),\n  so a card the watcher already delivered coalesces with a later force-stop.\n- **Hardening (Codex-reviewed):** offline-outbox queue on a failed watcher send;\n  16-hex fingerprint-hashed dedupe key (different questions in one turn don't\n  collide); TTL-derived iteration cap + no-transcript grace (no runaway worker on\n  a frozen clock or a transcript that never appears); detached-spawn `error`\n  handler + `windowsHide`; `beforeSubmitPrompt` uninstall matches only our\n  `arm-question-watch` hook.\n\n### 0.6.14\n\n- **Fix: Cursor question notifications restored via the abrupt-stop signal.**\n  Cursor's `AskQuestion` options card (A/B/C/D) fires **no** hook and writes\n  **no** transcript entry while it waits for you — verified 2026-08-31 by a\n  forensic capture of every Cursor hook payload plus Cursor's private state — so\n  there is no card-specific signal to key on. What Cursor *does* fire reliably is\n  `stop` with `status: \"aborted\"` whenever a turn ends **abruptly** (the agent\n  stops to ask you, OR you press Stop). This restores the original 2026-06-10\n  mapping `aborted → awaiting_input` (\"Agent needs you\"), which the 2026-06-13\n  \"make it question-only\" change had suppressed entirely — killing the question\n  ping for months. Cursor exposes **no** field to tell a question-abort from a\n  manual-Stop-abort, so a manual Stop now also pings; this is the accepted,\n  best-achievable tradeoff. Free-text turn-ending questions (status `completed`)\n  keep their existing `afterAgentResponse`→`stop` classifier path.\n- **Aborted turns bypass auto-push.** An abrupt stop (manual Stop or a\n  question-abort) and an `error` turn never auto-commit/push — they only notify.\n- **Retraction of an overstated 0.6.13 claim.** 0.6.13's changelog implied the\n  AskQuestion **options card** was detected via a transcript `tool_use` reader.\n  It is not — Cursor writes no such record for the live card (see above). The\n  transcript reader still works for any tool call Cursor *does* record; the\n  reliable card path is now the abrupt-stop signal.\n\n### 0.6.13\n\n- **Fix: Cursor questions still didn't notify on real turns (the live race).**\n  `afterAgentResponse` fires per assistant *message* and can run BEFORE the\n  transcript records the final `AskQuestion` tool call, so it writes a `finished`\n  record; `on-stop` then trusted that stored `finished` and skipped the tool\n  recheck, silently dropping a real A/B/C-card question. Corrected the stop-time\n  precedence (Codex-reviewed) to: `error > stop-time AskQuestion tool > stored\n  awaiting_input > final-text awaiting_input > finished` — a stored `finished`\n  no longer has precedence, so `on-stop` ALWAYS re-checks the transcript for a\n  tool ask. Re-running detection is safe; delivery stays bounded by the per-turn\n  `--dedupe-key`.\n- **Fix (double-ping): Cursor-imported Claude questions.** Now that the native\n  Cursor `afterAgentResponse`→`stop` path detects in-Cursor questions, the\n  imported Claude `Notification` copy (carrying `cursor_version`) is suppressed\n  in `on-notification` so a Claude-in-Cursor question fires exactly one ping.\n  Standalone Claude questions (no `cursor_version`) still notify.\n- **Perf: bounded the stop-time transcript text scan.** The finished-turn text\n  classifier now reads only a bounded tail of the transcript (same cap as the\n  AskQuestion reader) instead of loading the whole growing JSONL every stop.\n- **Privacy: redact Windows paths from question snippets** (drive-letter\n  `C:\\…` and UNC `\\\\host\\share\\…`), matching the existing Unix-path redaction.\n- **Diagnostics: added always-on evidence lines** to `on-agent-response` and\n  `on-stop` (`ON-AGENT-RESPONSE: …`, `question resolve → …`) so a real live turn\n  is diagnosable from `~/.gocode/notify.log` — id prefixes + verdicts only, no\n  raw text or paths.\n\n### 0.6.12\n\n- **Hardening for the 0.6.11 AskQuestion-tool detection** (Codex-reviewed): the\n  stop-time transcript recheck now only runs when there is no per-turn record\n  (removes a double-notify vector on a repeated stop); tool question snippets are\n  sanitized + length-capped like every other snippet; the bounded transcript\n  tail-reader keeps a complete first line when the read lands exactly on a line\n  boundary; snippet field precedence is `questions[0].question → question →\n  prompt → title → text`; and non-object JSONL records (`null`, scalars, arrays)\n  are skipped instead of dereferenced. Same behaviour as 0.6.11, just safer.\n\n### 0.6.11\n\n- **Fixed: the `AskQuestion` TOOL (the A/B/C options card) now notifies you.**\n  This is the *other* way a Cursor agent asks you something — and it was silently\n  missed. When the agent uses the AskQuestion / AskUserQuestion tool, its final\n  message text is just filler (\"I'll ask you a quick question\"), so the text\n  classifier can't see the question, and Cursor **never fires `postToolUse` for\n  the AskQuestion tool** (a confirmed upstream Cursor bug). The only reliable\n  signal is the transcript, so `on-agent-response` and `on-stop` now read the\n  tail of the turn's transcript, inspect the **latest assistant message**, and if\n  it invoked an AskQuestion tool they send **\"Agent needs you\"** with the actual\n  question text. A tool ask is definitive — it overrides the text heuristic and\n  even a stored \"finished\" — and `on-stop` remains the single sender so there are\n  no duplicate pings. The question text is sanitized/length-capped like every\n  other snippet.\n\n### 0.6.10\n\n- **Accurate `on-stop` status line.** The CLI now prints the notification kind it\n  ACTUALLY sent (e.g. `awaiting_input delivered` for a question turn) instead of\n  always re-deriving `finished` from the Cursor stop status — the phone push was\n  already correct in 0.6.9; this only fixes the local console/debug line so it no\n  longer looks like a question was sent as \"finished\". Same question-notify\n  behaviour as 0.6.9, no hook changes.\n\n### 0.6.9\n\n- **Fixed: native Cursor questions now notify you again.** When the Cursor agent\n  (not Claude-in-Cursor) ends its turn by asking you something (\"Want me to\n  deploy this?\", \"Should I continue?\"), you now get an **\"Agent needs you\"**\n  ping instead of a plain \"finished\". Cursor's `stop` hook can't tell \"asked a\n  question\" from \"finished\" (it always reports `completed`), and its native\n  question hook (`AskQuestion` via `postToolUse`) never fires — an upstream bug.\n  So we now install an `afterAgentResponse` hook that **classifies the turn's\n  final message** and hands a short-lived, conversation-keyed state record to\n  `on-stop`, which stays the single notification owner. Precision-first\n  classifier: fires on real asks (direct openers like \"Want me to…\" even without\n  a \"?\", explicit \"please confirm/approve\" requests) and stays quiet on courtesy\n  sign-offs (\"anything else?\"), code blocks, and rhetorical headings.\n- **Auto-push + question:** if the turn both changed files (auto-push commits and\n  pushes them) *and* asked a question, **both** the phone push and the desktop\n  banner now read \"Agent needs you\" with the question snippet — the work is still\n  committed/pushed, you're just told it's waiting on you.\n\n### 0.6.8\n\n- **Fixed: Claude questions inside Cursor now notify.** When Claude Code runs\n  inside Cursor and asks a question (permission prompt, idle/elicitation, agent\n  needs input), the notification was being **suppressed** because the imported\n  Claude `Notification` payload carries `cursor_version`. That suppression is\n  correct for *completions* (Cursor's own `stop` hook already fires, so the\n  imported Claude `Stop` would double-notify) — but **wrong for questions**:\n  Cursor's native question hook (`AskQuestion` via `postToolUse`) is broken\n  upstream and Cursor has no `Notification` event, so the imported Claude\n  `Notification` is the *only* question signal. `on-notification` now always\n  forwards a genuine input-requiring notification, even when Cursor imported it.\n  The non-input `notification_type` filter and per-question `--dedupe-key` still\n  apply, so no extra noise or duplicates.\n\n### 0.6.7\n\n- **Notification project name now matches your IDE.** The per-turn completion\n  ping labels the notification with your **workspace folder name** (e.g.\n  `Cursor · OpenHandApp — Agent finished`) instead of the git `owner/repo`.\n- **Fixed the `.cursor` project label.** When a stop hook ran without a piped\n  workspace path, the label derived from the hook's cwd (`~/.cursor`) and\n  rendered as “Cursor · .cursor” (the IDE name twice). `projectLabel` now walks\n  up past any leading-dot tooling dir (`.cursor`, `.git`, `.vscode`, …) and\n  stops at the home dir, so it never surfaces a tooling/home folder as the\n  project. When no real workspace folder is derivable it falls back to the git\n  repo name, and if even that is absent it shows the runtime alone\n  (`Cursor — Agent finished`) with no confusing suffix.\n\n### 0.6.6\n\n- **Claude questions are now classified by notification type.** Setup installs\n  the `Notification` hook only for `permission_prompt`, `idle_prompt`,\n  `elicitation_dialog`, and `agent_needs_input`. The dispatcher repeats that\n  check from stdin so existing 0.6.5 hook configs are protected immediately by\n  `@latest`, even before setup is rerun.\n- Non-input events such as `auth_success`, `elicitation_complete`,\n  `elicitation_response`, and `agent_completed` no longer produce a misleading\n  “Agent needs you” notification or duplicate the Claude `Stop` completion.\n\n### 0.6.5\n\n- **Fixed Cursor lifecycle notifications on current Cursor releases.** The\n  installer now writes `postToolUse` using Cursor's direct\n  `{ \"command\": \"...\", \"matcher\": \"...\" }` schema. Versions 0.5.0–0.6.4 wrote\n  a Claude-style nested `hooks` array, causing Cursor to reject the entire user\n  hooks file—silencing completion, error, and question notifications. Re-running\n  setup migrates the malformed legacy entry in place while preserving user hooks.\n- **Restored standalone Claude Code completion + question notifications without\n  duplicating Cursor.** Claude `Stop` and `Notification` hooks are installed\n  normally. When Cursor's third-party compatibility layer imports the Claude\n  `Stop` hook, the dispatcher detects Cursor's documented `cursor_version` stdin\n  field and suppresses only that embedded duplicate. A real standalone Claude\n  payload has no `cursor_version` and continues to send.\n- **No silent completion when auto-push has nothing to do.** If auto-push returns\n  `clean-tree` (or another non-notifying no-op), `on-stop` now sends the normal\n  completion fallback. A non-notifying commit failure sends an error fallback.\n- **Doctor no longer confuses GoCode Sync with GoCode Notify.** A valid hook must\n  carry both the runtime source marker and a Notify package/command marker.\n- **Hook commands stay silent for Cursor's JSON protocol.** Installed Cursor and\n  Claude lifecycle hooks use `--quiet`, so a successful human-readable\n  `✓ on-stop …` line is never misparsed by Cursor as an invalid JSON hook\n  response.\n- Run `npx -y @trygocode/notify@latest setup` after upgrading, then restart\n  Cursor and any standalone Claude Code process so both reload their hooks.\n\n### 0.6.1\n\n- **Banner now reliably POPS top-right (not just history).** The signed helper\n  posts the notification then exits ~150ms later so macOS does BACKGROUND\n  delivery (the system shows the banner per the user's settings). The previous\n  attempt to force foreground delivery via `willPresent` suppressed the banner to\n  Notification Center history — verified fixed live on macOS 26.4.\n- Surface the underlying `requestAuthorization` error in the helper's JSON result\n  (`detail`/`authError`) instead of collapsing to a bare \"not authorized\".\n- Extract the post-`add()` exit delay to a documented named constant.\n\n### 0.6.0\n\n- **Real native macOS \"Allow Notifications\" dialog (signed helper).** GoCode now\n  ships a tiny **Developer-ID-signed** macOS app bundle (`GoCodeNotifier.app`,\n  Team `88DC7KFY7M`) inside the package. On macOS, `gocode-notify permissions`\n  (and the post-`setup` nudge) now pop the **real system Allow/Don't-Allow\n  permission modal** — the thing a plain `npx`/`osascript` helper can't do —\n  instead of only opening System Settings and asking you to hunt for the toggle.\n  Once allowed, desktop banners post as a **first-class, authorized** app\n  (proper attribution + a real click-to-open-your-IDE action).\n  - **How it ships:** the bundle is **pre-signed at build time** by the\n    maintainer (`native/macos/build_and_sign.sh`) and committed to `assets/`, so\n    end-users need **no Xcode, no Developer ID, no compile step** — the one-line\n    install is unchanged. The signature survives the npm pack/extract round-trip.\n  - **Two macOS rules it honors (both required for the dialog to appear):** the\n    helper is copied to a **stable** location (`~/.gocode/desktop/`) — never\n    `/tmp` — and is always launched via **LaunchServices** (`open`), never by\n    exec'ing the inner binary (direct-exec auto-denies and the denial sticks).\n  - **Hot-path stays fast:** fire-and-forget banners read a cached auth status\n    (`~/.gocode/desktop/.auth-status`), so a notification never does a slow live\n    permission round-trip. The signed banner is used only once you've granted;\n    otherwise it transparently falls back to the legacy applet banner.\n  - **Own identity:** the signed helper uses bundle id `com.gocode.notify.helper`\n    (distinct from the legacy applet's `com.gocode.notify.desktop`) so it owns\n    its own row in System Settings → Notifications.\n  - **Linux/Windows unchanged.** This is a macOS-only enhancement; other\n    platforms keep their existing branded-banner paths.\n\n### 0.5.0\n\n- **Question detection across ALL IDEs — \"Agent needs you\" vs \"finished\".** When\n  the agent **pauses to ask you a question**, you now get an `awaiting_input`\n  (\"Agent needs you\") notification instead of a misleading `finished`, on every\n  supported runtime that exposes a question signal:\n  - **Claude Code** — already wired (`Notification` hook); unchanged.\n  - **OpenCode** — NEW: the plugin now listens to `permission.asked` (the moment\n    the agent raises a request) and fires `awaiting_input`. OpenCode genuinely\n    exposes a \"the agent needs the user\" signal via permission events. (We listen\n    to `permission.asked` only, not `permission.updated`/`replied`, which also\n    fire after the user answers.)\n  - **Cursor** — NEW (dormant): installs a `postToolUse` hook scoped to the\n    `AskQuestion` / `AskUserQuestion` tool. Cursor has a\n    [confirmed-open bug](https://forum.cursor.com/t/askquestion-tool-does-not-trigger-cursor-hooks/152230)\n    where that tool fires zero hooks, and Cursor exposes no `Notification` event,\n    so the hook is dormant today — but it **auto-activates with no new install**\n    the moment Cursor ships their fix. Until then, Cursor keeps its `finished`\n    fallback.\n- **Corrected the documented Cursor `aborted` mapping.** The README table\n  previously (incorrectly) showed `aborted → awaiting_input`; the actual\n  behaviour (since the 0.4.0 fix) is that a manual **Stop** press (`aborted`)\n  sends **no notification at all**. A user force-stop is now clearly\n  distinguished from a genuine IDE question.\n- Run `gocode-notify setup --force` once to wire the new hooks into Cursor +\n  OpenCode.\n\n### 0.4.0\n\n- **New: branded desktop notifications (on by default).** Every event that pings\n  your phone now also raises a native, **GoCode-branded** banner on the computer\n  you're working on — macOS (a one-time `osacompile`d `GoCode.app` helper +\n  `sips` icon), Windows (a WinRT `ToastGeneric` toast bound to a one-time\n  Start-Menu shortcut with the `GoCode.Notify` AppUserModelID), and Linux\n  (`notify-send -a GoCode`). **Zero new dependencies** — OS-native tools only,\n  so the one-line install is unchanged. Controlled by the same server-synced\n  settings as the phone push via the new `desktop.enabled` / `desktop.sound`\n  keys (both default ON); toggle from the app or `gocode-notify config set\n  desktop.enabled false`. Try it with `gocode-notify test --desktop`. Hard-\n  disable per machine with `GOCODE_NOTIFY_NO_DESKTOP=1` (headless / CI / SSH).\n  Best-effort + non-blocking: a failed banner never blocks or fails your turn.\n- **Word-for-word match with the phone push.** The desktop banner now reads\n  EXACTLY like the phone notification — same status emoji + IDE/source label +\n  project + per-kind title/body (e.g. `✅ Cursor · openhandapp — Agent\n  finished`). New `src/notify_copy.ts` mirrors the server's `_decorated_title` /\n  `_decorated_body` + `_DEFAULT_TITLES` / `_DEFAULT_BODIES` and the Flutter\n  client's `decorateNotificationTitle` / `sourceLabelFor`, pinned by a\n  cross-check test so the CLI/server/app surfaces can't drift.\n- **Click to open the IDE window for the project (macOS).** Clicking the banner\n  opens the IDE that raised the turn (Cursor / VS Code) focused on the project\n  directory. Implemented zero-dependency: the branded AppleScript applet handles\n  the click re-run (documented macOS behaviour) and `open -a <ide> <project>`.\n  Best-effort — display-only when the IDE/project can't be named. Opens the\n  project *window*, not a specific chat (IDEs lack reliable per-chat deep links).\n\n### 0.3.0\n\n- **New: Cursor `stop.status` → kind mapping (T-CUR1/T-CUR4).** The `on-stop`\n  dispatcher now reads the Cursor `stop` hook's stdin JSON and maps `status` to\n  the right notification kind: `completed→finished`, `aborted→awaiting_input`,\n  `error→error`. Back-compatible: absent/unrecognised status → `finished`.\n  Run `gocode-notify setup --force` to pick up the updated hook command.\n- **New: `ralph_waiting` + `ralph_resumed` kinds (T-C1).** `NOTIFY_KINDS` now\n  includes the Ralph/Homer offline-stall lifecycle kinds. `ralph_waiting` fires\n  once on the stall edge (server drops repeats until a recovery event re-arms\n  it); `ralph_resumed` is a silent control event that resets the stall state\n  machine. See `snippets/ralph-homer.sh` for the edge-trigger pattern.\n- **Kind taxonomy (T-S1).** The server now classifies every kind into push-worthy\n  vs. silent-info buckets: `ralph_question` / `ralph_advanced` are never pushed\n  (Oracle-answerable questions are silent); `ralph_halted` / `ralph_completed` /\n  `ralph_waiting` (edge) are the only loop kinds that reach FCM.\n- **Foreground suppression (T-S2/T-S3).** The server suppresses a push when the\n  app is open on that exact chat (`POST /api/v1/notify/presence` heartbeat, 45s\n  TTL). Different-chat or closed app → push goes out as normal.\n- **Offline/stall debounce (T-S4).** Server-side edge-triggered state machine:\n  a loop retrying every 60s on a quota outage pushes once on stall and stays\n  silent until it recovers and stalls again.\n\n### 0.2.0\n\n- **New: `launch` / `autopilot` command** — hand a large, multi-step task off to\n  your GoCode server to run as an autonomous Autopilot loop. Reuses the existing\n  `gck_` pairing; prints a loop id + app deep link; explicit failures exit\n  non-zero (no offline queueing). See\n  [Hand off to your server](#hand-off-to-your-server--launch--autopilot).\n- **New: `gocode_launch_autopilot` MCP tool** — the third tool on the stdio MCP\n  server, so a desktop agent can fire a remote loop mid-session (explicit offload\n  only). The installed Cursor rule / Claude skill / OpenCode snippet teach the\n  agent *when* to offload and that the server ","readmeFilename":"README.md"}