{"_id":"pincushion-mcp","_rev":"56-fd1211dbbccd4a808d57c8684be457a3","name":"pincushion-mcp","dist-tags":{"latest":"1.12.0"},"versions":{"1.0.0":{"name":"pincushion-mcp","version":"1.0.0","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.0.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/pincushion-dev/pincushion-mcp/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"4d74911ad5f978ba45a140f0f4ef231c21c54e34","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.0.0.tgz","fileCount":6,"integrity":"sha512-+3cdxrhyegn8td5sz2p3349h4zH60gtKmHtPSCngO+/GoZPx1nQunGBko9dQiyu0ssA0m0jqO5Ltb+7+pG0ViQ==","signatures":[{"sig":"MEYCIQDFpZ83GIIpHhRGDDfk13+YVo4kbgxSeJJIg6FQwqmUAwIhAKofbrTqw0gvnh+tnSydZFBFvtOlkBp0oz6BiJxOOlIq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186130},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"05f96ad0117d4c38e4744a491eae8e4147c9ae2e","scripts":{"test":"node --experimental-vm-modules node_modules/.bin/jest --forceExit","start":"node server.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/pincushion-dev/pincushion-mcp.git","type":"git"},"_npmVersion":"11.11.1","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"25.8.2","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.0.0_1775016346188_0.9810317862360809","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"pincushion-mcp","version":"1.0.1","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.0.1","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/pincushion-dev/pincushion-mcp/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"8a3e66c2c83557485fb066b4479ae91dd1e9c93a","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.0.1.tgz","fileCount":11,"integrity":"sha512-zH7lGpdFWO/nEdzOFOcu9vGxIhviz3irAKF2twyo7JuR/5MKEcBaRJHf+S+1Ge2JcZuGPiOycZKglmdRAn0+Pw==","signatures":[{"sig":"MEUCIDRqgjJ7UeA0zppVCmf6bUzms5hCL06Uu47qbKfjRMyiAiEAhGNu61HO4IQDMazrib8ABs5KFLdiTCoi4EOhA9d5neY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":207554},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"8b02031dc863426455cdb1c5a8557edaa30c28f3","scripts":{"test":"node --experimental-vm-modules node_modules/.bin/jest --forceExit","start":"node server.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/pincushion-dev/pincushion-mcp.git","type":"git"},"_npmVersion":"11.11.1","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"25.8.2","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.0.1_1775178414192_0.15511663449224433","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"pincushion-mcp","version":"1.0.2","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.0.2","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/pincushion-dev/pincushion-mcp/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"04a6da0f03daabb542f0a9c81c0bd3e5699ee722","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.0.2.tgz","fileCount":6,"integrity":"sha512-xucqnSktR9QEewEF/0zlrk0BGaThQaZ/w6R3NwOZKvzpqoF0d6Y5mDr9YTrY5fCRG+aq0XTkt6lmDl0Q9M55oA==","signatures":[{"sig":"MEUCIG9z5Aq0XavVtra2mAtYej5l/xW3Sz7Xq0LV659tM2b9AiEAtXhOohMGhdsgR6PRnNsT1+a5uYuBxJo6N7DXXaSrvpE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187041},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"8b02031dc863426455cdb1c5a8557edaa30c28f3","scripts":{"test":"node --experimental-vm-modules node_modules/.bin/jest --forceExit","start":"node server.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/pincushion-dev/pincushion-mcp.git","type":"git"},"_npmVersion":"11.11.1","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"25.8.2","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.0.2_1775178462845_0.026768217922197968","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"pincushion-mcp","version":"1.0.3","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.0.3","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/pincushion-dev/pincushion-mcp/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"025f6a719c1a2b550b51479faf955b6d89d2bb57","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.0.3.tgz","fileCount":7,"integrity":"sha512-Afuy5/j8IPBpa1p0qqxKKnIfLvOwa12QRf5JJ0FR1gkXOKCC2yjdEE9V7243q5qznns86+89nPEjI2a4hJxCGA==","signatures":[{"sig":"MEMCIHCNjDaiihI7hJiTeZ61WiHtshVBbRnPkgxYxyQa+r1oAh8WZpfZc8Q4OIjVVok7wNeO7FNhHt/8lFFVKqO/5aYf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":210136},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"cb20f0123ca6e6b480f4c2a1136c20196b6321ec","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/pincushion-dev/pincushion-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.0.3_1778094674869_0.6196228805665847","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"pincushion-mcp","version":"1.0.5","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.0.5","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/pincushion-dev/pincushion-mcp/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"e5d1ff0dcd3afb448ccfdc4b8439a19db054a5cf","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.0.5.tgz","fileCount":8,"integrity":"sha512-44NBCaBOQZ92GUZ832no5foVZdmwYtFB4XWhnhThNUAEg0Nz/08zrcqz26qaBcGRP+5M49mFvNVpXuEDHn4jvQ==","signatures":[{"sig":"MEQCIBxJPgW/zrhU3qKMLMtgtPvfQsbBGuiOTKCTTX0HC4/OAiApYrRxApVWkMMPvL5fiJ709jwO3ugSxkDY3WJ1X304Kg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":264247},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"dee629942091c19a6e8dd7582ef763b4c80f35d7","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/pincushion-dev/pincushion-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.0.5_1778382718686_0.9757887163486152","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"pincushion-mcp","version":"1.1.0","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.1.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/pincushion-dev/pincushion-mcp/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"6477cd9167efa5345939d926eac0d086c83cb35f","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.1.0.tgz","fileCount":9,"integrity":"sha512-Ljmhd+Tsgmcu+rGLRjzspz0fhuHLqMRmeIrdetFPWEcxJkRRSXfgkj6RZb08NI1mfOKRuBEbFfuiABTv1FTdQg==","signatures":[{"sig":"MEQCICl7NWZh/iJRm03s+QsW0JFQqdOMdtSaHy3R3V8z7pShAiB2/R13LCmzOmyGUQSNs3y7BQrop+nA5IoXkuRWmBCdFw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":273819},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b7156afc45881ec72dfa8b726d9c3fae679d8b5a","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/pincushion-dev/pincushion-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.1.0_1778386466907_0.5708288586132013","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"pincushion-mcp","version":"1.2.0","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.2.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/pincushion-dev/pincushion-mcp/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"fc05b21d4906220bb34d592673d9ebb76c6a8a1a","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.2.0.tgz","fileCount":12,"integrity":"sha512-1fTbTKXklAPzgkahBkH9U2m8B7z3jGcFVQqZxFRkCvNeVliutkFHc3p8clRRJINSRsvXw0yGiNtfeeKplz7tCw==","signatures":[{"sig":"MEUCIQCjtPYRUjQvYZ3/7Pu08bobt35ZdnDxUtkuk65ccA2e5AIgKMAJNDLYlZiyIad7tq5F4BadG9gVrBHKgZAw34skkCw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":309756},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/pincushion-dev/pincushion-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.2.0_1778734949965_0.21650095883135712","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"pincushion-mcp","version":"1.2.1","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.2.1","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/pincushion-dev/pincushion-mcp/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"a3b992f1bfe6498d1040ff1ab65109fdbc9390f7","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.2.1.tgz","fileCount":12,"integrity":"sha512-M7eobY1+bTr7rqbmtZxYY5MVnAaGaxocayWrZP5gworN/1/4txBGb0SMVMp9HDsEY12MGMpblDO22KBZkfyzmw==","signatures":[{"sig":"MEUCIQCI5NGrvsBGSVPBW61GG9i6T4hnt5/OZhxcK0+5FcosfQIgGgEESA5euEPYbKmVSHA+9F4Svu869uRLx2DxOQ4AweU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313636},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"70b2a4f549fd43b394ab2adb2224e4b72ae7f0e6","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/pincushion-dev/pincushion-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.2.1_1778824384366_0.230097808265449","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"pincushion-mcp","version":"1.3.0","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.3.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/pincushion-dev/pincushion-mcp/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"86eafdb028fa78ff7d74647ac90e9cd8b65929cb","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.3.0.tgz","fileCount":12,"integrity":"sha512-cC1aIq+iM3tkwHYhvhlb0lhuOjiV9mgJi2BtT7WqAJXinxWe0OPMPrq5zD/F9ZKdLT8tBXVpAZlomhyH63d6RA==","signatures":[{"sig":"MEYCIQClM94dZrxqCEmxPCwVT7nPIriWPCU+V8SR3t9sr5bqyQIhANqUra6dAHV6SZnUA5JUvM2gzEBKn/Kx069hCEjJiAAp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":327279},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/pincushion-dev/pincushion-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.3.0_1779223789287_0.6748491809099539","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"pincushion-mcp","version":"1.3.1","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.3.1","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"297c2cef57b36a82873567a3428427c52345ae4d","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.3.1.tgz","fileCount":13,"integrity":"sha512-giuPN7wd4LF++H1yp9hRuzADCCYnKyukcRE65CviahrLDmRlYwV4YJlOwebyFzCY852JbniLSz4ArSFtH8CCaA==","signatures":[{"sig":"MEUCIHw/6wG1YAluHfb+dlDNLoTvGE9i9EvA4hVpsuIqWfc7AiEAwk4oQUdB4StZois+Ig3+QveLJn3QKp7FFoMUBT6p+y8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":361334},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"3b99e045c6e798b5b56bd26c457d494772228ff5","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"11.12.1","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.3.1_1780598483199_0.29094363094491404","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"pincushion-mcp","version":"1.3.2","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.3.2","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"9a031ee27d36a8354d62a17d4a32e64af58cbc02","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.3.2.tgz","fileCount":13,"integrity":"sha512-8GQ9CbhzakLuOF+XHOLPlRzGt000exgmiT/vyKiwvIy8aj+SHB4qH7kv+XLbYRbFbER9VWREmVCE2uosAqBJOA==","signatures":[{"sig":"MEUCIQCh3IZYTnYxp0rn/gvYUBTIhmVvEtPu9obqvlciNpw3GQIgMXLfuDOvU9C4GZwgOnfy+FRwhpQAq/7up81VWthzZL0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":364893},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"18371574cf87faa50e71f2911ba4f3ac3c05733d","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.3.2_1781068159131_0.686960317264705","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"pincushion-mcp","version":"1.3.3","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.3.3","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"f46012303b2c4d03b1a5fe950201457322eefc2f","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.3.3.tgz","fileCount":14,"integrity":"sha512-7C4AfOjiZodlUvCYd6L200aMu7vnu0WIZXLkYs409RSA9PW8YPXHz1NKzRQ1Ejm93rkkRTCRBK8BEV+QIHXCtA==","signatures":[{"sig":"MEUCIBrbh3HXmSM1jKxprpqnRSbZKf58umMPWTaZOjTbRFUrAiEAwXH28yz7BGqcozYEgI+nPGLZl5wZlEMzLHQ1ENGoIb0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":376606},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"53ff8d2c44c3016562495f5156fa3c63d5769275","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.3.3_1781119841958_0.10752164587464708","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"pincushion-mcp","version":"1.3.4","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.3.4","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"a2ad7139cd95aca0640eee9ac2a192d6bb6bd86c","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.3.4.tgz","fileCount":14,"integrity":"sha512-RqOVDxAuFzsu6p257yIL+F0PqJGQXuC6tO5/Eus33qOMHRtkfsE1BV5iAJVOMgVkreY4NYeHn0b8h8Qz1IX/9g==","signatures":[{"sig":"MEUCIQDhd36+SmcMwZLk1M1nmw6mYtPjXhnfWZVu0vcutUlUCAIgGPE79ua5qBnlM1ghmbtrpCM2GZHOCaEhod3Q2mGc40k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":379251},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"aeb6044b0dc959a9d41ccc2a3887481144359606","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.3.4_1781152503374_0.058059871416165976","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"pincushion-mcp","version":"1.3.5","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.3.5","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"e0c949c6d5af4a3b85dca5d698fdf5e2ffad3a11","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.3.5.tgz","fileCount":14,"integrity":"sha512-yvj/osGVMtD6DozgD49il8WhfD9NDtrQQO7igafF9iSGVBilmDopNPJcoChEuVEREfuD8o2AoOZra7EPzYUJ/A==","signatures":[{"sig":"MEYCIQC4G8I/UV8LwtFhHmaXY/kJOmTFRi0SUv037XWdWFz7OwIhAMp62fVvmor0XXX4IKpF9r6vFsjF2DqsAmHnN5YRWVah","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":379840},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"1d8202a090c6029ccb57333acbd16e81c866f047","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.3.5_1781377623279_0.27103279910540135","host":"s3://npm-registry-packages-npm-production"}},"1.3.6":{"name":"pincushion-mcp","version":"1.3.6","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.3.6","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"bc21b0d2c490243dde5f031f851b317758cbd796","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.3.6.tgz","fileCount":15,"integrity":"sha512-MbN2rsXmZTjAbjvcdIGOTqZzjy5zD3C1LcmJI/PT1ngYyS1tmifLAKofrAkQTFDSb2vD5B6COmsMPSrf2EBIpQ==","signatures":[{"sig":"MEYCIQDCr19Tgr/FsbdMjn795b/FIffTpAAYNUarx3YADrJjtgIhAOw+F6jgI3dkbX1xYUM9bziEDWMeyscPA5hx7ZHF+W6t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":386806},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"377f8bcfdf116d86a8f8d89d7009c6d71fe70753","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.3.6_1781405611523_0.15141498186593916","host":"s3://npm-registry-packages-npm-production"}},"1.3.7":{"name":"pincushion-mcp","version":"1.3.7","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.3.7","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"f982bb6bb590c017a098a1a9132fabcdedfd599d","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.3.7.tgz","fileCount":16,"integrity":"sha512-5kCd4P9JCSyTJGrTPax7Mg4S3+5GXnanK3uwSqnQ1Wu3/xKadCknIUBDifGDvVto/hli0UV4wLFUSlZfpVya1g==","signatures":[{"sig":"MEUCIQC0KwBjkTSI/oJaVU9xfkHCm0vmpGZAhoNGhUT0v9hADAIgKuHmNpLPPJp/fJSYSFmptXtQ0+8JWO1ON9mJpDcviEg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":392287},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ec0cb19265a43cb6d9f07897d7c5bdcab05313ba","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.3.7_1781410439986_0.16965164914685604","host":"s3://npm-registry-packages-npm-production"}},"1.3.8":{"name":"pincushion-mcp","version":"1.3.8","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.3.8","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"f94969d9f4ced7bd46b1e2ec9bc6550de608a6cc","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.3.8.tgz","fileCount":16,"integrity":"sha512-4Ekiz+Ueruc3uMCIM7kfuvtmiaKMq0116y0u8udLgOGQDLVs9eCz++m1d6xVgD4YhVr3T0RJRedFUPSkGeM9vA==","signatures":[{"sig":"MEYCIQCMU7Hx3CgBypNrfJKHR3s7pgrlXzZZpKwe9ptrk/IxWwIhAOpIjLHP6kcUC+TixvpBzIThXzUKTVmNCThhtgKZ/wct","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":394164},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"89022e0d5bd2d2b02e57629cdb2b77809a49a142","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.3.8_1781458724498_0.16664818580314344","host":"s3://npm-registry-packages-npm-production"}},"1.3.9":{"name":"pincushion-mcp","version":"1.3.9","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"name":"PinCushion Team"},"license":"MIT","_id":"pincushion-mcp@1.3.9","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"0e8daa79619e7da4ac9b05e593676f29829d5b41","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.3.9.tgz","fileCount":16,"integrity":"sha512-WPWuDLh8aD550DlmHy6ryKIsv53Qz/kmtw9NWQJ7VYhR094ZJjeq+e80bcRGSnRLBUe2iMUFSggsNdT3/Uq1Yg==","signatures":[{"sig":"MEUCIAiECPBPc7+8FtBv52EpRxkMdMXLagJ2np3tDTgVK8diAiEA8Q//1UOCHRTLU3EpXC8qVycM1bK6cKwt+dipg++yBPY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":397502},"jest":{"transform":{}},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"98a45e9cdf254e93bb4dd0e56771f87ec0a0a786","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","agent-loop":"node agent-loop.mjs","test:smoke":"node tests/mcp-smoke.mjs","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.3.9_1781460672548_0.6896109370344605","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"pincushion-mcp","version":"1.4.0","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.4.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"ea0681793b63a8eab2a187659c14318a6ac30d28","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.4.0.tgz","fileCount":23,"integrity":"sha512-DNtoH9f9k+zhjbdO0VquiEB6X3OYcJywXFLI0s6C3FNmJl2qxnOVfiIsIWrvFrdtGWxcdYFYRPFaNYbG9/sMMA==","signatures":[{"sig":"MEQCIGQzojJHxsiHF/l4o7tzRb5/42r1bBkoVT+RLh56r8zwAiBW4/0BKREA7hGztX+BaW+dmRVQv06XWuqKFgfh6E4QNw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":435945},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"c5ed0b78ee922306391b88e6d426fdfb5de989b2","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.4.0_1781553979087_0.9417373737680632","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"pincushion-mcp","version":"1.4.1","keywords":["mcp","model-context-protocol","feedback","annotations","pincushion","ai-agent"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.4.1","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"8ba4abf89f29560d86833f6a650eaf0f86438d22","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.4.1.tgz","fileCount":23,"integrity":"sha512-1NvVKrDy23dPGwYdMknarYxy0rwfTEKrfcnPnLk09XajYRApFQcwz7oJfFowQsx/clwm5u6mJlRX6RZuUF21HQ==","signatures":[{"sig":"MEUCIApLqvuK3DdiPyhVupMUSYXetvqCuEntzr6KoXGMvTlnAiEAocvp5Ew8BdorcJOtLhkb2bsPeNt6pWOFYthNL4UhIyc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":438133},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"22a5c4f4bb99983737858d4f141cd91ffd37e9c4","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for PinCushion feedback annotations. Exposes feedback pins from .feedback/ directory to AI agents.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.4.1_1782091067978_0.8155350479674799","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"pincushion-mcp","version":"1.4.2","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.4.2","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"3046d242ccecd70c98b78bbefd21ed8dbd40e03f","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.4.2.tgz","fileCount":23,"integrity":"sha512-kqWA89nnUtN+eooK5GIAhOYAwjO+JlbNY5ThOwa5BxUNnnDV6M25SDAMWqsNssbalSjRh9dGl93ajnnGRB/Cmw==","signatures":[{"sig":"MEUCIFgdLqXADdQ0e2puwivUCltAI2qrCEaCTQVWMJgnuQ//AiEAxQwyx0cZV0fD8K6Rfi+dHmtwGPlqsCCmIXVY1iPAD5U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":439939},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"5f1baa59ca0985e90fd76bbdd983396aca9ac199","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.4.2_1782109304585_0.860216953896334","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"pincushion-mcp","version":"1.5.0","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.5.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"4ae2edeb6908d9fa928c66c11d2335e5f420f3c0","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.5.0.tgz","fileCount":30,"integrity":"sha512-qljDdUEMXfQHGRi9KzwZYdZhZ7+kOGXsnDi1ooptn/jiofvIp/nLNILyBmGJrEE05CT1ROgr7HMw2rgCmvZ3fQ==","signatures":[{"sig":"MEQCIEuXs2Oz6yL9SOQbUIAqnK7yELNE2oZExTC3n7JdBZLlAiB4ZQaxwfqbHSnXZGK9T52LO+/lSJXlHdGhNMFVtopzvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":509793},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"80b17af6f0791e3ff25b79b35cebe04c8a8e6f06","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.5.0_1782282115393_0.049561153247586365","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"pincushion-mcp","version":"1.5.1","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.5.1","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"e435399c9c34697c2776240ca83042d9d13869ea","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.5.1.tgz","fileCount":30,"integrity":"sha512-Mt6mq1TxJyplwUFgEmKClCmpkMU5OOV1nB3SjQkFv0i2kthHRc0i7psoMwjlXACmwP1mCMgefEWXHLja1Aj7mg==","signatures":[{"sig":"MEYCIQCySeXX9R/zgJ+XPHOFHhlViPfFGBb4Rq2JjeUqMqL83AIhAKcRof3DwT8Q5mdwpDeUeNRD96W3nT8H71n3xdQ3LvLC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":512416},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"a58198c49ef561c1f21346919ba996abf7315430","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.5.1_1782429605360_0.9910862095904693","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"pincushion-mcp","version":"1.5.2","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.5.2","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"46ec7f0b2cdd69d89885179c2a07d1b8772618f5","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.5.2.tgz","fileCount":30,"integrity":"sha512-Qoil9hWQjntK+m5vkZQjFmjeFIgQZhU4taffFTN96cblWmEHd0SNfw2P4CUxyI5aVIU1UMqSj3n+Zxxy12Pbrg==","signatures":[{"sig":"MEUCIH++PX/nR/SWwCfI4IEV9ZEp1bbyqeQabkoAbgTnuk5KAiEAmp6p0VyBaFm5XPxLP7MiejGXOMzUfschuRpuVWi7w0U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":513954},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b752c9c14fd3c8a94f64d7b270c732c9bda400f1","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.5.2_1782439106650_0.45364981569413554","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"pincushion-mcp","version":"1.6.0","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.6.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"530f9f102b4fcce74e80aa4aebad4f78783b38e5","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.6.0.tgz","fileCount":32,"integrity":"sha512-ZGboyp6NcJx9FyOph5GS8VRUZgsgafEY0hNJA+Jd9TXnJumMvrGAYtuRQiaTvpwI0CkSDIdi5lyjC0112mAP9g==","signatures":[{"sig":"MEUCIQD8BmWOVtuQmnzlBnPJcc4oyseH3kyuy4IL9vFXXXecqgIgQio2t+LhyzA59JCxNPvcZejLCqZTEQu1XfE5bi7/6AE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":541027},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"e475cf9ebccea29b378ca469a019818cfc13232f","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.6.0_1783005215164_0.7789622291329865","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"pincushion-mcp","version":"1.6.1","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.6.1","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"626c60ff44f21f4eb073ccbbdf152e64cff7dfcd","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.6.1.tgz","fileCount":32,"integrity":"sha512-nRI6u/sepFMpFt0UaCmWPTGW38KJ0c0swWPMK+79NbKGKEEO8+MqDrHscj2CafY+EbbDFb0hVFAOj/DBCRda4A==","signatures":[{"sig":"MEUCIQDvj+xeLJy1+vCBXxQsgw9nwOKzsUfovinm3DK7oMC+dQIgcSgS1nfrV9IOx0fsLbXqeQw/CVqoJCBGQ4J/45EXaKg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":541347},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"6266274b777c59828d2ddd5c244c31fe6f69e68b","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.6.1_1783005373464_0.9402050840849541","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"pincushion-mcp","version":"1.7.0","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.7.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"37d1dbd1625d99dfbd542949d8e7ff8bdc33989f","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.7.0.tgz","fileCount":34,"integrity":"sha512-3Yte6mYTCK9GzoLzl2E+pJZl1j9Z8Fok7IJZ9HAhS5/LYifMKBW+PQijulvOB6Z4hJr2UdqJGG8rmCtg8itX9Q==","signatures":[{"sig":"MEUCIQCj54f76Gn26JKZMVRddl3KgehWLE9qtOwtTRvnUeh2tgIgVEFV7UrC8Kxhtg7xa/zFAIImXA+TkKR04ftmurfK9xA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":592371},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"53eb047ff2ea562f0e6d6b3330be8e0199f91e88","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.7.0_1783013999610_0.9521983506771086","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"pincushion-mcp","version":"1.8.0","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.8.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"576d0b81d870e07e724488692345106a7b32b471","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.8.0.tgz","fileCount":34,"integrity":"sha512-NYaOwD3jwQIHlYTONuxWeHu10FRS2imsOnxQXUxOBnUFlAEpVLhVoXbBNiCt3JDZafcnepxu1JchkU7GpPWCIQ==","signatures":[{"sig":"MEQCIHTHNJGT5chUGGpmj6KVgGGaIERuX0aQV+c2zuVaRQcoAiBe4xCu9hCBgto3JU/a8esmitUBckmyxYAzsyhSYpz/mg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":638088},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"116cfe671912b994b9ecd75261d7f62c3a3dee57","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.8.0_1783034368342_0.35304824330827733","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"pincushion-mcp","version":"1.9.0","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.9.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"7bcb8e99f436f6cb26e9a1cc530244eb69893f04","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.9.0.tgz","fileCount":36,"integrity":"sha512-x5BxgEevC4RrEhMrKAZaz4JeXKShU9tiIYHWa+DXXmnJMy2UKQbk+aVdT4GJfHwjgtEE8ZzPSUtQ8qvcNyH6og==","signatures":[{"sig":"MEUCIHaOCa0s4ALmxKH3qog44VsnJ6PpqnDNQRM2KyaNYauCAiEAj0cB3DCIMNOT0aw5R+J9/lgyXcc3bYmksYqhyaRPLtU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":657931},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b3d574cd622bce3b0370a24d032bc703971fd846","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.9.0_1783118977999_0.1326151470266761","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"pincushion-mcp","version":"1.10.0","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"MIT","_id":"pincushion-mcp@1.10.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"3e576b3ace1743dabbcd3207fa4c52f64ea28b0b","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.10.0.tgz","fileCount":36,"integrity":"sha512-M2N99c9GJw4kf8NVRm4qRjwDXJvYZFnRxz2TYORWEtqaIvU89O1xrUTYOTuNzLBFy6KRnnIACNko3B0pUrVDtQ==","signatures":[{"sig":"MEYCIQDizkqMcslbDsQxgYKLxC1c3leTOj2xLJYTI3ET+SDtcQIhAL2escAxEP8n0sJcPA1p9Onitpd2HdzIwq3tvxWu3NME","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":666085},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d0d28dc3dbd8dc98f3efbc43eb98c75ffeb3d677","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.10.0_1783127956812_0.668582619537325","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"name":"pincushion-mcp","version":"1.11.0","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.0","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"a3aef0228ab3e82d208905febd1a140699930db6","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.0.tgz","fileCount":40,"integrity":"sha512-VtdmHP9Rvkg82mTdF36KuyBaXvdzgNUBjSHtNaaSYttnAlaNAPaLRMDPXA6z8tg8yMOuAxMtdZAHxocKqPRFfg==","signatures":[{"sig":"MEQCIGzCNCd5wj4nC252SltIvD1TqAh3a416R0e7XDTxgOS3AiAxDI1cdXkdSuJUMkph0qVVnoBW/776pGXEDw+zsWsdWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":722910},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"758d58944e1160b7a08a7f23a69cc727ba90a2bc","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.0_1783653049414_0.06670699963226001","host":"s3://npm-registry-packages-npm-production"}},"1.11.1":{"name":"pincushion-mcp","version":"1.11.1","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.1","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"a0d4a29fafc9a1b0a93fe1c238562d1a419c32fb","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.1.tgz","fileCount":42,"integrity":"sha512-/7fgeq09iCExUCQsLmlws47aIRwfWXQ0JyBC/QyKYQ4jZOfCmGsUNyly5PW3I2/zSGeszqlSfYaZlCX7PEluKQ==","signatures":[{"sig":"MEUCIEYVPt6sOm95rNjkFSblbEfDTy5irio86DuRO2G2eEFOAiEAwjrVZAe3wvs4izD68d94XPMpiV0jytnCMn4f9tDQ5eg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":728809},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"a3fba185bc22208da38eebc1cc77ed376bbc5fd3","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.1_1783710514642_0.45995893911310404","host":"s3://npm-registry-packages-npm-production"}},"1.11.2":{"name":"pincushion-mcp","version":"1.11.2","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.2","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"b6fc9dc4e8d7f89dfeb3935abe5ccae6eb3881cf","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.2.tgz","fileCount":42,"integrity":"sha512-xZ9gVr2yyDAzPb59lOWVjiZkoR+t/esRFniT85B0B8b0FlN6BLkQRYpb133aZ9DkdDeEiTsLecg5HcPgxqRWcg==","signatures":[{"sig":"MEYCIQDgx0kdhTbHJ5jRofopfu/ec0fD6p/w7CUMY2s1Dyjv4gIhAIchdMr8Docws8kQeePAXxSMOTlnnGa9ofNH/xZjPf3T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":732639},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"f3f18b528f4d13297940fa7a2f8690e9fd4020c7","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.2_1785136039340_0.008391616668243174","host":"s3://npm-registry-packages-npm-production"}},"1.11.3":{"name":"pincushion-mcp","version":"1.11.3","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.3","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"f0ff462b9b8d29ec876c38344ece8b067c7b01e1","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.3.tgz","fileCount":45,"integrity":"sha512-2tVex22noEwydu3IY1TPv7KXzomv9XrR3Tu8mdX/trLUmRIbfuS0VZx/+hhye5ZUYxapTiMb7R6xRZDzuwqnyw==","signatures":[{"sig":"MEUCIQC8S8Q97/cOw2rJMeCoxzjG6jM+5a/jfcJZTes2HZrVGwIgI+Bejl4t+RalM7/YW9Ga9AR/UjmFqNFTD87ESy7jQ78=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":770357},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"27c036faf4b5950197c9a60d4f7c3e7ad19edffe","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.3_1785386845373_0.9262553519615051","host":"s3://npm-registry-packages-npm-production"}},"1.11.4":{"name":"pincushion-mcp","version":"1.11.4","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.4","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"2af5277832ee48e5707b2d9990fe8fa950b2c1e8","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.4.tgz","fileCount":45,"integrity":"sha512-jzdVAmaVzWlvakwABeG0s0M/5x1hL8KUSwe7+/9AbFRyPXL9nv/OZ9573AVyjaASpP8UG6lmApHnEu6K7hg3eA==","signatures":[{"sig":"MEQCIEcY4yEGiKXtfEYA0qPCEWLOu+A2jpWFHjZHUUFPY7VaAiAxUdIhqZiypzqfg6L/nCxBGPB0LKXRS0184C2ZiCN6Ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":773734},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"2d43e5ebc1428fe75b594824840738d59842ae96","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"10.8.2","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.4_1785387442811_0.09238424725492189","host":"s3://npm-registry-packages-npm-production"}},"1.11.7":{"name":"pincushion-mcp","version":"1.11.7","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.7","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"8e56e5fc5f794d7dbb45f5e2dfb67c7dfdf528dd","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.7.tgz","fileCount":74,"integrity":"sha512-EYycLL2doH0roUC6LWLwTwP6qfWnn2521KlKY47YsvdUmP7yyCoMct4tRszMlu6YKocVvov0QX7CBatlk50lJQ==","signatures":[{"sig":"MEYCIQC/ass1FQdDMZuC5Q16v5lS/neXHFgUUsgg0bZNm7YTkwIhAM7OiPPlC8gKAbhtv3vjZk2LYFXjTQKPLyNxNoalr/7o","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1558180},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"25e1cb7702ed1bc9371bf354f4a7c903f9e6ef8e","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.12.1","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.7_1786588560181_0.6542267025862938","host":"s3://npm-registry-packages-npm-production"}},"1.11.8":{"name":"pincushion-mcp","version":"1.11.8","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.8","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion-plugin/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"2299779195ed313f0254c596b2d006fe2dc407da","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.8.tgz","fileCount":51,"integrity":"sha512-yoj7UHBxganx09OBx3VaBppeuNTVpGbZK5ag3JqdXpfR6FkQHVQzSHgQBI4Y2Ny2K3OsTgg/3UkErjO7cLKmMw==","signatures":[{"sig":"MEYCIQCDl6gzwB68B7In6P1lREoSjvoENTBhN/t4jDyzywZJtwIhAKbXrTISipH2i6Kt/Lxpm+blyQvMGIW8DjqC++B5dN0O","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":982697},"jest":{"transform":{},"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"2217529871db85ae1a20a98df25d1fe9702133ae","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion-plugin.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.12.1","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.8_1786595596795_0.8390233323611533","host":"s3://npm-registry-packages-npm-production"}},"1.11.10":{"name":"pincushion-mcp","version":"1.11.10","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.10","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"5dd0eb0701e229a231352ccc30b73960493542bc","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.10.tgz","fileCount":60,"integrity":"sha512-Bj6kadW/HI9G1+r00GgqAJkQ9OwHZ4UtZRJvH83o6pN+DlnUqsoBXm9B6uEyNREky6gv/1DIkNA/Wa6+w5sWAA==","signatures":[{"sig":"MEUCIE270iAapc9J7649JNqJl8VS50yDsFlyQNpX+CAKv6gtAiEAxu3rcgSwGeDQy+nIhkceNv6HHZm/XMh5Yui0hEcyKL4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1339590},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ed40e373c216ab413be665d3db49cd126a84a1ab","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.12.1","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.10_1786646578013_0.23292253936513974","host":"s3://npm-registry-packages-npm-production"}},"1.11.11":{"name":"pincushion-mcp","version":"1.11.11","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.11","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"c02fbff60b8e987fac0638df8aec151b331c0ccb","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.11.tgz","fileCount":60,"integrity":"sha512-US3S3wQkfvRaQD2K9R5nXkyvHajECpuB/edgAh7zsMgpgudSeDA0f8d5GC7gHsIEt1HSkTfl81r3PtNVaS8RkA==","signatures":[{"sig":"MEUCIQCPunhzn2tEegwQ1gyGdE5P9uIIEGD0VTe/TnDEoqWNiQIgVXKKq7mNbIhxtR8mQ0VRTW41CALZK6czdlzvduSoCAE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1339590},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"06f366dbb57c01b71c5aefed3b36c1d3bccc76f7","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.12.1","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.11_1786657524100_0.32490270920870445","host":"s3://npm-registry-packages-npm-production"}},"1.11.12":{"name":"pincushion-mcp","version":"1.11.12","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.12","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"fb04dc488d278b618c19073e24e90b04fbd46158","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.12.tgz","fileCount":62,"integrity":"sha512-P7cyicvebpENnBmYioAvhFZrKKUIVlTXSxJfbCWlcmCKfYNapjBwYWPz6xO+4LnQqSWLCoKbEyU4xaplDE1U+A==","signatures":[{"sig":"MEYCIQDheOUIJYXLQSx/cdYNhDkRIp/dJbKnPT7/g2dzHa0rtQIhAMNajR50cCc/fiwL+AOnO2wLuzwqotmMbd5yrzFLYKhw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1359449},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"3c5f608351c029fa8f26284b1c34f6cea7937aef","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.12.1","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.12_1786727596837_0.7078300358118417","host":"s3://npm-registry-packages-npm-production"}},"1.11.13":{"name":"pincushion-mcp","version":"1.11.13","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.13","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"626d0aea8b0dea6b1a75fecbb5a92735c8fe60f3","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.13.tgz","fileCount":62,"integrity":"sha512-25iJ74D2/W0GL5T13dHZLH5dnlQbxPCjcP6EWvlqetoIyQ5gR0dCvGebX9MoLUAO6AoVqjrskfD2xv4K0GldCw==","signatures":[{"sig":"MEQCIHIDsNXUV4/JuNLHbpOn4HMJPGmxEyBMKS7hu9dUcVc6AiANhA3rzGoqSmXYluYpdZOW3BMPBHQ8+Ya2u+e3QeFPZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIE/QK0jEANFxI2yvflZwfyOjLsw0vp5dwyfyvuVNW9EKAiEA+Q/IscDjahdRzku8acRzlQ1n4hgJcllXwD9tApxr15w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1426929},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ec4904841dd8e2353248d6f2bd9085aaf0f92f9f","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.12.1","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.13_1788147486491_0.07010901929998825","host":"s3://npm-registry-packages-npm-production"}},"1.11.14":{"name":"pincushion-mcp","version":"1.11.14","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.14","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"126bb58c80ddaf6abfa6fc71b4b04e076d193c8f","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.14.tgz","fileCount":64,"integrity":"sha512-zKUkn/7TG/tzcoswuz6olkaSJ9eMC7Wv9hv45pnG/HNcokySYauU0QjPyyDe9XoSvqkkV1alO7w4rIPb4eTa/w==","signatures":[{"sig":"MEUCIAME5U/K2KUeat1JOlQPf4Pwfw9jffQlDKtT1AaM5CL2AiEAsMsTaBFR9tFjlcuGlFJfy5T1rvuW0XqCA5CVZpugXuk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFS9Iym3/45VEn9kW2AcQvDUQRGnfDIwfa7weYslq1YgAiAVcDXbKPHs3IJhBQI4NxIgjArwrRYMf0ZV2jSCjJsXzg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1447993},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"422c9518918fa3d1704012bb302f96d927319d98","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"matttdamon","email":"me@joshcooley.com"},"repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.12.1","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.14_1788560325614_0.6968597268513472","host":"s3://npm-registry-packages-npm-production"}},"1.11.16":{"name":"pincushion-mcp","version":"1.11.16","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.16","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"0d7f33015489c4a6c107d79845e67d68f05f704d","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.16.tgz","fileCount":68,"integrity":"sha512-MfnWC3VoVnG8NXakSj8wQImD3H/h94V+31tBKgnHeZn51XQRzeNkNA0bg0K3zZLOFqIRwo7GgzYCTufTgPIPig==","signatures":[{"sig":"MEYCIQDVeBISpeDO2ZOmXnQ6EQf2NGi0Kayw8h3GnTIyl8VGfAIhAPG7RN79WcUAh2pytUN6DxeV+QUa3t4sG7ACLENf0vFT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDkOcT/CIC7JcJXs8GoH4tg7GCmKkCvqG/oz1XdgxPb9wIgE7Uo+s6ZQsZ10JUGjqJU1XRUqJIG2UByXIzI8QG38Rw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1548474},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/source-suggestions.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.16.tgz","engines":{"node":">=18.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/source-suggestions.test.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.16.tgz","_integrity":"sha512-MfnWC3VoVnG8NXakSj8wQImD3H/h94V+31tBKgnHeZn51XQRzeNkNA0bg0K3zZLOFqIRwo7GgzYCTufTgPIPig==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.16_1788886677084_0.24040540461479276","host":"s3://npm-registry-packages-npm-production"}},"1.11.17":{"name":"pincushion-mcp","version":"1.11.17","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.17","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"5d1716e8ffa0f66ee03b134fb471231afb49671e","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.17.tgz","fileCount":69,"integrity":"sha512-qvvGrH4Y2d4JnqnqXtupMUiEFAJEbD0iAFjviwCjzHMcwxHLw8hXn7Gbm1oz62wX2qli6AMGhKVCjTFg2RrOQg==","signatures":[{"sig":"MEQCIH0EJuRK4OabMoSFrr+UEfHTqSbWVvSf9EjR8l6kXNl0AiAYWrXY/Xi3/NjUHIE4kFys1RnMa8BuCAtRT5EkF3fVgQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDUG8z+OhZTMJW8LnZlLjIREggaNXwTRps7GR1ltAOKewIhAMef1Yqp5/B/zRIiwUpiPba35Ay5MxvHtnjzAifQX73k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1608042},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.17.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/source-suggestions.test.mjs tests/submission-journal.test.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.17.tgz","_integrity":"sha512-qvvGrH4Y2d4JnqnqXtupMUiEFAJEbD0iAFjviwCjzHMcwxHLw8hXn7Gbm1oz62wX2qli6AMGhKVCjTFg2RrOQg==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@sentry/node":"^9.0.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.17_1788906859257_0.9016095984261192","host":"s3://npm-registry-packages-npm-production"}},"1.11.19":{"name":"pincushion-mcp","version":"1.11.19","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.19","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"6faa7b3e3852ac0d08fe0994e55636ed35e921be","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.19.tgz","fileCount":75,"integrity":"sha512-Jq/3ODDUIMZDhQEE3+XHSCPAkhyyzzBEU+QxfJwWRejD9/buAMf/8Lk7Pzg/KI4Dh6PkkzxwxS1Rusz6wZjmcg==","signatures":[{"sig":"MEUCIQDawp2Co9p5Yk738VqUHKAiF5DZsNcIEooqBai5aCYjLQIgFEIXnqRMUJBVHf+KxNgTuIbFJA4jmWrSVvLkUkPAFSg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDhtyAkJFHAxX45yFRdTO51vecuJinVxRRAugHFOnVnJAIhAI6dF7+oua/WoBs2I7gg+LO2etbGHqlYOQN2IzT1bB00","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1773585},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.19.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/source-suggestions.test.mjs tests/submission-journal.test.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.19.tgz","_integrity":"sha512-Jq/3ODDUIMZDhQEE3+XHSCPAkhyyzzBEU+QxfJwWRejD9/buAMf/8Lk7Pzg/KI4Dh6PkkzxwxS1Rusz6wZjmcg==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.19_1789069221622_0.692417293155918","host":"s3://npm-registry-packages-npm-production"}},"1.11.20":{"name":"pincushion-mcp","version":"1.11.20","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.20","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"e6c7608dc938161fa8eb916d512172b66f446f9f","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.20.tgz","fileCount":76,"integrity":"sha512-sY8/yhbbA3deZHVYrZGtqldObTMidIK9ZlvbdDjZn0v7dfvqK9PWSGMeDk0TzfI2jotGwPumNp7XWaj33K8rng==","signatures":[{"sig":"MEQCIB8xnbdDKsrNSXibOnm/kgrm8mfTuFUu0dfDhBUal5ftAiAc8VkX1EijtO56C0BkDxHxvmvR276Vxu7f28g7k7dDow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDyob7RwFUAiqI0pa/W3v0QfMA2GKztA43+33gOeeVTMAIhAKxFcNWxDJ9nuaoo/gKfUEAzjzKFyS+v9VcUA4Giann3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1793937},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.20.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.20.tgz","_integrity":"sha512-sY8/yhbbA3deZHVYrZGtqldObTMidIK9ZlvbdDjZn0v7dfvqK9PWSGMeDk0TzfI2jotGwPumNp7XWaj33K8rng==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.20_1789097125245_0.35064503406082626","host":"s3://npm-registry-packages-npm-production"}},"1.11.21":{"name":"pincushion-mcp","version":"1.11.21","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.21","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"bf5a3561c820f12e46aaef1afdb2d1e27463fa4d","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.21.tgz","fileCount":77,"integrity":"sha512-JHagsnB/QvrG0ckSWTiknOyWKLvSXDxSlUOxjsx358z9hAflW/eF4Jn2yUWZNKaI4K6sdoOke9/ZdJ6ib5yP2w==","signatures":[{"sig":"MEUCIQCwe4O+hHobAut1rakBB6z2de1sOlFoBg4PLodaiBWRJQIgfzt6SZ+4q0xObgEt8KHfWDi0yOtgdoz3qt0Z/pr0If0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBzRMoYsT4hgueiXEtoEpCw3TKcFxUjy0ED/UKSqlQfAAiEA/RlpyXd+KyOoVNLMzngWFeGQiZ+PQtzgYUrU13tu4eg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1797298},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.21.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/realtime.contract.mjs tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs tests/tool-registry.contract.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.21.tgz","_integrity":"sha512-JHagsnB/QvrG0ckSWTiknOyWKLvSXDxSlUOxjsx358z9hAflW/eF4Jn2yUWZNKaI4K6sdoOke9/ZdJ6ib5yP2w==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.21_1789133521626_0.2523508054480015","host":"s3://npm-registry-packages-npm-production"}},"1.11.22":{"name":"pincushion-mcp","version":"1.11.22","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.22","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"14d6594248cee6fbba7cf95031e6c9039267387a","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.22.tgz","fileCount":77,"integrity":"sha512-PWB7WErjO3GRrUC37zYz5nfPgeumSaGfneQ/Bd+K8J0jpvbJ6VO+n2vc+EJ8VoH1oaF0tW0g5KVY2nR8tp9FvA==","signatures":[{"sig":"MEUCIEY61mTrhiXv7ATyYp96YhZQRYybc6TUJ/TrDWBNvfpWAiEAoAteygrxes0+SVagm98P7getUxQx62wtb49OJkmcZpE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDfp1DhHPqWLe2pmKVSWWwzc+rbYMcSEOh2qT0E3vlqJgIhALdLMwWhRpz/TytOeY0xTDP6ehX7nRHlXk4+mAq3eKAz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1797237},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.22.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/realtime.contract.mjs tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs tests/tool-registry.contract.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.22.tgz","_integrity":"sha512-PWB7WErjO3GRrUC37zYz5nfPgeumSaGfneQ/Bd+K8J0jpvbJ6VO+n2vc+EJ8VoH1oaF0tW0g5KVY2nR8tp9FvA==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.22_1789168408035_0.35488272924283626","host":"s3://npm-registry-packages-npm-production"}},"1.11.23":{"name":"pincushion-mcp","version":"1.11.23","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.23","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"cce3861267dbd1d0eb31adec10b1d404e6ca8174","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.23.tgz","fileCount":79,"integrity":"sha512-HhrZa1swhnrm3NHzhNi28tjDhURWodoprkm64nzlzj9nzU+XEeG0IJxym16w4SKkiLd+YPicaf4g+qqlpaJ53A==","signatures":[{"sig":"MEQCIHmtVcKox7DEOOeBlXyYVTIuxWntcEyejSmQR0RgBsfrAiA3QRSOmz86URNDRB4AtbW8CWXp6Vo0cE5lQ5dSOmdLOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEFH3bcOB7szTvU9IRYTsnLQskaXA698Mr5t1NwcbbEMAiAOmYnivZ9uxS4NRnnwKbF0fyqysK8NcSweULZvzDwPXA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1862396},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$","/tests/critique-capture.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.23.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/realtime.contract.mjs tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs tests/tool-registry.contract.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.23.tgz","_integrity":"sha512-HhrZa1swhnrm3NHzhNi28tjDhURWodoprkm64nzlzj9nzU+XEeG0IJxym16w4SKkiLd+YPicaf4g+qqlpaJ53A==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.23_1790285305616_0.20145668847680964","host":"s3://npm-registry-packages-npm-production"}},"1.11.24":{"name":"pincushion-mcp","version":"1.11.24","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.24","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"3b2ef62e3e6f983b54284293f48d0ce911d5e24c","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.24.tgz","fileCount":79,"integrity":"sha512-Md3lyUlCzAcqOT0vbhMeMGTQSmwcmg/O6qI8wdtJami7DMgJurtpF+0laxS1zlbg7pBdclv3NUvdThsVFvs0Cg==","signatures":[{"sig":"MEQCIB4KZSnb+ph72n1Be+rk2MkOeChCn2z3JcjYeulbu13vAiBQAPcj0KRUCYULrUUxhHWiQ1WTdIZ9/6Jymb1sj/hIOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFwVB/6NxyUfymc98dzpBzr49bZbgaJWlmvV0DVnNQH8AiEAwzBzVfKn2/Sbj3E0XFpxqgLK7VKyzYYi3SLMEujup5Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1864160},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$","/tests/critique-capture.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.24.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/realtime.contract.mjs tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs tests/tool-registry.contract.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.24.tgz","_integrity":"sha512-Md3lyUlCzAcqOT0vbhMeMGTQSmwcmg/O6qI8wdtJami7DMgJurtpF+0laxS1zlbg7pBdclv3NUvdThsVFvs0Cg==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.24_1790544289275_0.6645105277649601","host":"s3://npm-registry-packages-npm-production"}},"1.11.25":{"name":"pincushion-mcp","version":"1.11.25","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.25","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"fee9229999265bf684410c6c01a5421f8d5be684","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.25.tgz","fileCount":79,"integrity":"sha512-6T6B1iGltfJao/4AZLpW/w821J/z8Sz9Uw12AEuXvuIrUKI8Rj40Ig0Ndx4ngGcNrSA5Y0NEXIubqw88ZYKgUA==","signatures":[{"sig":"MEUCIQC6pYJdvRctjhS+xB1OkuuEWa8gOPa+wdPQ+vsqhQaTDgIgfZDAItPvyPWN700jMyBO0M3aRG9+7fUcRBgyhzIaeVg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFzpqiq2OQ/DFLNTAsDch6ZIuuHFZ+Rk14GzxJapJdLlAiAEy6IzeOcjrZ+nuPwM4KBn/8TGKjAimZW+XnVQ19FchA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1878228},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$","/tests/critique-capture.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.25.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/realtime.contract.mjs tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs tests/tool-registry.contract.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.25.tgz","_integrity":"sha512-6T6B1iGltfJao/4AZLpW/w821J/z8Sz9Uw12AEuXvuIrUKI8Rj40Ig0Ndx4ngGcNrSA5Y0NEXIubqw88ZYKgUA==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"smol-toml":"1.9.0","@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.25_1790630717632_0.8601000672129677","host":"s3://npm-registry-packages-npm-production"}},"1.11.26":{"name":"pincushion-mcp","version":"1.11.26","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.26","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"4e9d3dacaf275ee7076f3d6c03fa9a4917e703ef","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.26.tgz","fileCount":79,"integrity":"sha512-llDdbRRbUeKLwGLI55r0NQMMKxFX+GWccbpAgeQ3ahs7wymvUUCEJ535Uv+f7RzgqYIn9kCQxBYbZVas8MNOVA==","signatures":[{"sig":"MEUCIQCcSxsU+FQZk9hTIYAUlLKMY29/t+ZPSjfmj73pg1suogIgO8ao22J+H9u9i59sS1D+Ji0RJbTVUVS9e/nMY8On8/4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDUAcXSmk/xmyILeOg6w75kyz+sNCfM5xoSIXuGCBioYwIgesUEkGA0vaOx5OwSw3BdKdwjQKXX1fJm5MFYWERdRsY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1880917},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$","/tests/critique-capture.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.26.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/realtime.contract.mjs tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs tests/tool-registry.contract.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.26.tgz","_integrity":"sha512-llDdbRRbUeKLwGLI55r0NQMMKxFX+GWccbpAgeQ3ahs7wymvUUCEJ535Uv+f7RzgqYIn9kCQxBYbZVas8MNOVA==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"smol-toml":"1.9.0","@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"dotenv":"^21.0.0","@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.26_1790642167040_0.7733687486274965","host":"s3://npm-registry-packages-npm-production"}},"1.11.27":{"name":"pincushion-mcp","version":"1.11.27","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.27","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"d85b30a8b0a054ae8f78a416d6c8ce8f57cf247e","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.27.tgz","fileCount":86,"integrity":"sha512-YezNoFe3qFOcRbhi62+YlehuDr2vcSz1C7cZnnU2i8Bt3AkA2NMgMYSzotLX8x8j4O5uW2JY+6HKM0M0r8nmjA==","signatures":[{"sig":"MEUCIDgxtPYsw+wf+NeYRHUQKhx1CWysYtq7DdH7TXwXgWBOAiEAtUBK84wLQJs0YjtbvsZ+SOtzxe7nnBEGYLaI2Q5kZaQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCZecAQeDOcMyfTRJlpAO81UFm6B6gPeJiDvAKcZ0nqDgIhAK0vpjK+rWaRaaO6EVOQqxqSXvfkCMfISe0CCx5jtdaF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2198339},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$","/tests/critique-capture.test.mjs$","/tests/claude-critique-package.test.mjs$","/tests/setup-critique.test.mjs$","/tests/setup-runtime.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.27.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/realtime.contract.mjs tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs tests/tool-registry.contract.mjs tests/claude-critique-package.test.mjs tests/setup-critique.test.mjs tests/setup-runtime.test.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.27.tgz","_integrity":"sha512-YezNoFe3qFOcRbhi62+YlehuDr2vcSz1C7cZnnU2i8Bt3AkA2NMgMYSzotLX8x8j4O5uW2JY+6HKM0M0r8nmjA==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"smol-toml":"1.9.0","@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.27_1790843560458_0.3439857937093156","host":"s3://npm-registry-packages-npm-production"}},"1.11.28":{"name":"pincushion-mcp","version":"1.11.28","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.28","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"e594a6216cf2ccf49cded357a485cecace39fcec","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.28.tgz","fileCount":86,"integrity":"sha512-YhjbM0UEe3//ayEaiFGTnCALQ2tSQMVsrTszkp6EzlnuuLZZviFbOWeiH7ZYw7pY4c/T+7pI00RdoKPXS1XR2w==","signatures":[{"sig":"MEYCIQCNKUyoLayAarDbLR82XXGqZuhLXXuriqGEmqJAWSFqTAIhAPuhEBprBlUb5XpsHTgCsDZve7DFRwCPTqE8LxDv0e9x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHK18gQeDsJE8HKSzJ9bR4RzD0xk6QeGBJJAGZ54nUenAiEAiGD3pJfKVAYTSwli9RyRhhdCCYslYPa6HRNzWAfnT7g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2205427},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$","/tests/critique-capture.test.mjs$","/tests/claude-critique-package.test.mjs$","/tests/setup-critique.test.mjs$","/tests/setup-runtime.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.28.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/realtime.contract.mjs tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs tests/tool-registry.contract.mjs tests/claude-critique-package.test.mjs tests/setup-critique.test.mjs tests/setup-runtime.test.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"npx -y @anthropic-ai/mcpb validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.28.tgz","_integrity":"sha512-YhjbM0UEe3//ayEaiFGTnCALQ2tSQMVsrTszkp6EzlnuuLZZviFbOWeiH7ZYw7pY4c/T+7pI00RdoKPXS1XR2w==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"smol-toml":"1.9.0","@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.28_1790873856257_0.4175194811359171","host":"s3://npm-registry-packages-npm-production"}},"1.11.29":{"name":"pincushion-mcp","version":"1.11.29","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","_id":"pincushion-mcp@1.11.29","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"homepage":"https://pincushion.io","bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"bin":{"pincushion-mcp":"server.js"},"dist":{"shasum":"ab92edf98c5f1f32e257ab249d19e7923d42b59c","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.11.29.tgz","fileCount":86,"integrity":"sha512-NgJ+bLE/Beaiz7ZxpNDOSokvQILO97ELY9wpQCnyOrR+6yHUeqTAvzBtFW15NvaDKCDxBKGPWux49d1JUY4rXA==","signatures":[{"sig":"MEUCIGmSOw8+jAlXuG2ggSHRFqnKawccpmkYpu7gkEAYSPS6AiEA51B9reYU+Qz01NqtCGidffMpuhSsLspjbkHxeyXdkrE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGbNWxA7gUSHjO/rHBriT/T57Blpcu/y6eBIMOypKGB7AiEA5uRZnvgd6DQCTDJEid/YcZvjBDuQ//V3QYe0tcEFkRg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2207339},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$","/tests/critique-capture.test.mjs$","/tests/claude-critique-package.test.mjs$","/tests/setup-critique.test.mjs$","/tests/setup-runtime.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.29.tgz","engines":{"node":"^22.22.0 || ^24.0.0"},"mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/realtime.contract.mjs tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs tests/tool-registry.contract.mjs tests/claude-critique-package.test.mjs tests/setup-critique.test.mjs tests/setup-runtime.test.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"node ../scripts/mcpb-format.mjs validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"9149a905-200a-46e7-ae8e-b4379265a18f"}},"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.11.29.tgz","_integrity":"sha512-NgJ+bLE/Beaiz7ZxpNDOSokvQILO97ELY9wpQCnyOrR+6yHUeqTAvzBtFW15NvaDKCDxBKGPWux49d1JUY4rXA==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"smol-toml":"1.9.0","@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"tmp":"tmp/pincushion-mcp_1.11.29_1790990902785_0.2202996006592577","host":"s3://npm-registry-packages-npm-production"}},"1.12.0":{"_id":"pincushion-mcp@1.12.0","bin":{"pincushion-mcp":"server.js"},"bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"dist":{"shasum":"0b12a4de0cca33e9c4a6ffda2f5abb758fd46088","tarball":"https://registry.npmjs.org/pincushion-mcp/-/pincushion-mcp-1.12.0.tgz","fileCount":86,"integrity":"sha512-0CVxCjnaeUroywWykzBZw+O8Kz59hdeUZSUKJFegG494TwHy6nernguLwjhHY85ZjUi3cwai9CzvKwlCJhzXnQ==","signatures":[{"sig":"MEUCIBvJEe585dIbRgYmH1dPt8MEz5NwNS8prz5311S+5lK7AiEA5y8tGHS3j5LIGeANLqGQ7VnAKyyk43yngOW0Tol3p+w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIC4akPAsDA7OKtafjBAte/HZ7lKu76/TN1pwfe4qWQ6rAiAzIILOoQ7Cu4bk206yhdfxS5fNjkcDftDUYbyPcX/Ofw=="}],"unpackedSize":2213944},"jest":{"transform":{},"testPathIgnorePatterns":["/tests/deployment-frame-executor.test.mjs$","/tests/deployment-frame-runtime.test.mjs$","/tests/agency-coordination.test.mjs$","/tests/source-suggestions.test.mjs$","/tests/submission-journal.test.mjs$","/tests/qa-ingestion.test.mjs$","/tests/qa-import-core.test.mjs$","/tests/annotation-sync.test.mjs$","/tests/critique-capture.test.mjs$","/tests/claude-critique-package.test.mjs$","/tests/setup-critique.test.mjs$","/tests/setup-runtime.test.mjs$"],"modulePathIgnorePatterns":["<rootDir>/build/"]},"main":"./server.js","name":"pincushion-mcp","type":"module","_from":"file:/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.12.0.tgz","author":{"url":"https://pincushion.io","name":"Pincushion"},"engines":{"node":"^22.22.0 || ^24.0.0"},"license":"SEE LICENSE IN LICENSE.md","mcpName":"io.github.jcooley8/pincushion","scripts":{"test":"npm run test:smoke && npm run test:transport","start":"node server.js","test:all":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand && node --test tests/realtime.contract.mjs tests/source-suggestions.test.mjs tests/submission-journal.test.mjs tests/annotation-sync.test.mjs tests/tool-registry.contract.mjs tests/claude-critique-package.test.mjs tests/setup-critique.test.mjs tests/setup-runtime.test.mjs","preflight":"node scripts/preflight.mjs","agent-loop":"node agent-loop.mjs","build:mcpb":"node scripts/build-mcpb.mjs","test:smoke":"node tests/mcp-smoke.mjs","validate:mcpb":"node ../scripts/mcpb-format.mjs validate build/mcpb/manifest.json","test:transport":"node --experimental-vm-modules node_modules/.bin/jest --testRunner=jest-circus/runner --runInBand tests/agent-loop.test.js","release:fallback":"node scripts/release-fallback.mjs"},"version":"1.12.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"9149a905-200a-46e7-ae8e-b4379265a18f"}},"homepage":"https://pincushion.io","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"_resolved":"/home/runner/work/_temp/pincushion-mcp-release/pincushion-mcp-1.12.0.tgz","_integrity":"sha512-0CVxCjnaeUroywWykzBZw+O8Kz59hdeUZSUKJFegG494TwHy6nernguLwjhHY85ZjUi3cwai9CzvKwlCJhzXnQ==","repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"_npmVersion":"11.19.0","description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","directories":{},"maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"_nodeVersion":"24.21.0","dependencies":{"smol-toml":"1.9.0","@sentry/node":"^10.74.0","posthog-node":"^5.37.0","playwright-core":"1.52.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","@jest/globals":"^30.3.0"},"optionalDependencies":{"@supabase/supabase-js":"^2.45.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pincushion-mcp_1.12.0_1791151236872_0.029136754321897884"}}},"time":{"created":"2026-04-01T04:05:45.984Z","modified":"2026-10-04T22:00:37.143Z","1.0.0":"2026-04-01T04:05:46.348Z","1.0.1":"2026-04-03T01:06:54.405Z","1.0.2":"2026-04-03T01:07:43.028Z","1.0.3":"2026-05-06T19:11:15.018Z","1.0.5":"2026-05-10T03:11:58.839Z","1.1.0":"2026-05-10T04:14:27.056Z","1.2.0":"2026-05-14T05:02:30.153Z","1.2.1":"2026-05-15T05:53:04.632Z","1.3.0":"2026-05-19T20:49:49.438Z","1.3.1":"2026-06-04T18:41:23.515Z","1.3.2":"2026-06-10T05:09:19.298Z","1.3.3":"2026-06-10T19:30:42.120Z","1.3.4":"2026-06-11T04:35:03.528Z","1.3.5":"2026-06-13T19:07:03.436Z","1.3.6":"2026-06-14T02:53:31.658Z","1.3.7":"2026-06-14T04:14:00.154Z","1.3.8":"2026-06-14T17:38:44.646Z","1.3.9":"2026-06-14T18:11:12.706Z","1.4.0":"2026-06-15T20:06:19.226Z","1.4.1":"2026-06-22T01:17:48.149Z","1.4.2":"2026-06-22T06:21:44.716Z","1.5.0":"2026-06-24T06:21:55.565Z","1.5.1":"2026-06-25T23:20:05.534Z","1.5.2":"2026-06-26T01:58:26.830Z","1.6.0":"2026-07-02T15:13:35.311Z","1.6.1":"2026-07-02T15:16:13.671Z","1.7.0":"2026-07-02T17:39:59.846Z","1.8.0":"2026-07-02T23:19:28.570Z","1.9.0":"2026-07-03T22:49:38.174Z","1.10.0":"2026-07-04T01:19:16.940Z","1.11.0":"2026-07-10T03:10:49.642Z","1.11.1":"2026-07-10T19:08:34.837Z","1.11.2":"2026-07-27T07:07:19.512Z","1.11.3":"2026-07-30T04:47:25.523Z","1.11.4":"2026-07-30T04:57:23.039Z","1.11.7":"2026-08-13T02:36:00.362Z","1.11.8":"2026-08-13T04:33:16.944Z","1.11.10":"2026-08-13T18:42:58.181Z","1.11.11":"2026-08-13T21:45:24.380Z","1.11.12":"2026-08-14T17:13:17.040Z","1.11.13":"2026-08-31T03:38:06.600Z","1.11.14":"2026-09-04T22:18:45.776Z","1.11.16":"2026-09-08T16:57:57.184Z","1.11.17":"2026-09-08T22:34:19.342Z","1.11.19":"2026-09-10T19:40:21.763Z","1.11.20":"2026-09-11T03:25:25.380Z","1.11.21":"2026-09-11T13:32:01.728Z","1.11.22":"2026-09-11T23:13:28.153Z","1.11.23":"2026-09-24T21:28:25.729Z","1.11.24":"2026-09-27T21:24:49.364Z","1.11.25":"2026-09-28T21:25:17.735Z","1.11.26":"2026-09-29T00:36:07.138Z","1.11.27":"2026-10-01T08:32:40.578Z","1.11.28":"2026-10-01T16:57:36.344Z","1.11.29":"2026-10-03T01:28:22.891Z","1.12.0":"2026-10-04T22:00:36.988Z"},"bugs":{"url":"https://github.com/jcooley8/pincushion/issues"},"author":{"url":"https://pincushion.io","name":"Pincushion"},"license":"SEE LICENSE IN LICENSE.md","homepage":"https://pincushion.io","keywords":["mcp","model-context-protocol","claude-code","cursor","ai-coding-agent","visual-feedback","code-review","design-feedback","qa","pincushion","annotations","agent-work-packets"],"repository":{"url":"git+https://github.com/jcooley8/pincushion.git","type":"git","directory":"pincushion-mcp"},"description":"Visual feedback as agent work packets. Stakeholders drop pins on your live app; your AI coding agent reads each pin (selector, screenshot, DOM, thread, acceptance criteria) via MCP and ships the fix.","maintainers":[{"name":"matttdamon","email":"me@joshcooley.com"}],"readme":"# Pincushion MCP Server\n\n[![jcooley8/pincushion MCP server](https://glama.ai/mcp/servers/jcooley8/pincushion/badges/score.svg)](https://glama.ai/mcp/servers/jcooley8/pincushion)\n\nPincushion turns visual feedback into work your coding agent can ship. Teammates and clients pin feedback on your pages in the Pincushion app. Your agent (Claude Code, Cursor, VS Code, Codex, Windsurf or any MCP client) reads each pin through this server, fixes it in your code, and records the commit and PR.\n\n## What's in a pin\n\nEach pin carries what an agent needs to make the change without a back-and-forth:\n\n- **URL and element selector:** exactly what, exactly where\n- **Screenshot, viewport and DOM snippet:** the visual and structural context\n- **Thread and project context:** the conversation and the codebase it lives in\n- **Likely files and acceptance criteria:** where to look, and how to know it's done\n\nResolving a pin records the commit, branch and PR. An optional post-deploy check confirms the fix landed.\n\n## Quick start\n\n1. **Create a project.** [Download the Pincushion app](https://pincushion.io/download) for Mac, or open [pincushion.io/app](https://www.pincushion.io/app) and install it from your browser. Sign in with Google and create a project with your site's URL.\n2. **Connect your code.** Open the project's **Connect code** tab and pick one:\n   - **GitHub (recommended).** Enter your repository and choose your coding agent, then click **Add to GitHub**. GitHub opens with the Pincushion config file ready to commit. Everyone who opens the repo in that agent is connected to the project.\n   - **Command.** In your project folder, run the command the tab shows:\n\n     ```bash\n     npx -y pincushion-mcp setup --project-id <your-project-id>\n     ```\n\n     It signs you in, connects the project, and sets up your agent.\n\n   Each developer signs in once with `npx -y pincushion-mcp login`. Setup does this for you.\n3. **Invite reviewers.** On the **People** tab, create an invite link and share it. Invitees sign in, open a review, and pin feedback. Nothing to install.\n4. **Fix pins.** Open your agent in the project folder (restart it if it was already open) and ask: *\"Show my Pincushion pins.\"* The loop is `get_actionable_pins` → `claim_pin` → change the code → `fix_and_resolve`.\n\nRequires Node.js 22.22+ or Node.js 24.\n\nStarting from the terminal instead? Run `npx -y pincushion-mcp setup` in your project folder with no flags. It lists your projects (or creates one) and connects your agent.\n\n### Optional: a first AI critique\n\nAfter connecting, setup offers to run a first AI critique of your site through the agent you chose. It captures desktop and mobile screenshots, saves findings as pins in your project, and opens a private report. It uses your agent's own model access and your Pincushion plan's AI actions. To run it later, run `npx -y pincushion-mcp setup` again and accept the critique. Once installed, it's also available in your agent as `/pincushion-critique <url>` (Claude Code, Cursor, VS Code) or `$pincushion-critique <url>` (Codex).\n\nCapture screenshots only, with no findings or uploads:\n\n```bash\nnpx -y pincushion-mcp capture https://your-site.example ./captures\n```\n\nCapture uses an installed Chrome or Chromium on macOS or Linux; Windows capture isn't supported yet. To capture pages behind a sign-in, save the session once with `npx -y pincushion-mcp snapshot --login <url> --proof-selector <selector-only-shown-when-signed-in>`, then add `--require-auth`.\n\n## Installation\n\n`npx -y pincushion-mcp` always runs the latest version, which is what the setup command and the committed config use. To install it globally instead:\n\n```bash\nnpm install -g pincushion-mcp     # or: pnpm add -g pincushion-mcp / yarn global add pincushion-mcp\n```\n\nRun `npx -y pincushion-mcp --help` for every command.\n\n### More ways to collect feedback\n\nReviews in the Pincushion app need nothing installed. Two optional extras:\n\n- The [Chrome extension](https://pincushion.io/install/chrome) lets signed-in reviewers pin directly on your live site.\n- Your agent can file pins itself with `create_agent_pin`, for example from a browser QA run.\n\n### Optional automatic deployment-frame refresh\n\nProduction deployment receipts have a frame-refresh gate that is separate from\npin and Crit status: every accepted non-removed page needs newly rendered\n1280×900 desktop and 390×844 mobile JPEG bytes before its canonical frame can\nadvance. Unchanged pages still require a fresh byte pair.\n\nThe local MCP executor for that gate is off by default because it launches a\nbrowser and uploads production page images. To authorize it for one\nunambiguously configured project, set `PINCUSHION_AUTO_FRAME_REFRESH=1` in the\nMCP server environment. Cloud credentials are required. Signed-in targets also\nrequire the origin-bound `PINCUSHION_STORAGE_STATE` file documented in\n[`docs/page-snapshot-capture.md`](docs/page-snapshot-capture.md). The executor\nfails closed when project scope, credentials, auth state, exact page scope,\nbrowser availability, or any upload receipt is uncertain.\n\n---\n\n## Agent Configuration Guides\n\n### OpenAI Codex (native MCP)\n\nRun `npx -y pincushion-mcp setup` in the project and select **Codex**. It writes\n`.codex/config.toml` with the acknowledged project ID. A clean manual entry is:\n\n```toml\n[mcp_servers.pincushion]\ncommand = \"npx\"\nargs = [\"-y\", \"pincushion-mcp\", \"--project-dir\", \".\"]\n```\n\nSign-in uses the shared `~/.pincushion/license-key`; never put a key in this\nfile. After restarting Codex, ask it for `get_project_context` to verify the\nauthenticated project binding. Other MCP clients can use the same package and\nlogin without a separate account or embedded key.\n\n### Cursor\n\n**File:** `.cursor/mcp.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"pincushion\": {\n      \"command\": \"npx\",\n      \"args\": [\"pincushion-mcp\", \"--project-dir\", \".\"]\n    }\n  }\n}\n```\n\n> **pnpm / yarn users:** replace `\"command\": \"npx\"` with `\"command\": \"pnpm\"` and add `\"dlx\"` as the first arg, or use `\"command\": \"yarn\"` with `\"dlx\"` likewise.\n\n**With Supabase sync:**\n\n```json\n{\n  \"mcpServers\": {\n    \"pincushion\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"pincushion-mcp\",\n        \"--project-dir\", \".\",\n        \"--sync-url\", \"https://your-supabase.com/api\",\n        \"--api-key\", \"YOUR_API_KEY\"\n      ]\n    }\n  }\n}\n```\n\n### Claude Desktop\n\n**File:** `~/.config/Claude/claude_desktop_config.json` (Linux/Windows)\nor `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)\n\n```json\n{\n  \"mcpServers\": {\n    \"pincushion\": {\n      \"command\": \"npx\",\n      \"args\": [\"pincushion-mcp\", \"--project-dir\", \"/path/to/your/project\"]\n    }\n  }\n}\n```\n\n**pnpm users:**\n```json\n{\n  \"mcpServers\": {\n    \"pincushion\": {\n      \"command\": \"pnpm\",\n      \"args\": [\"dlx\", \"pincushion-mcp\", \"--project-dir\", \"/path/to/your/project\"]\n    }\n  }\n}\n```\n\n**yarn users:**\n```json\n{\n  \"mcpServers\": {\n    \"pincushion\": {\n      \"command\": \"yarn\",\n      \"args\": [\"dlx\", \"pincushion-mcp\", \"--project-dir\", \"/path/to/your/project\"]\n    }\n  }\n}\n```\n\n**With Supabase sync:**\n\n```json\n{\n  \"mcpServers\": {\n    \"pincushion\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"pincushion-mcp\",\n        \"--project-dir\", \"/path/to/your/project\",\n        \"--sync-url\", \"https://your-supabase.com/api\",\n        \"--api-key\", \"YOUR_API_KEY\"\n      ]\n    }\n  }\n}\n```\n\n### Claude Code (CLI)\n\nRun this command to add Pincushion to Claude Code:\n\n```bash\nclaude mcp add pincushion -- npx pincushion-mcp --project-dir .\n```\n\nOr with Supabase sync:\n\n```bash\nclaude mcp add pincushion -- npx pincushion-mcp --project-dir . --sync-url https://your-supabase.com/api --api-key YOUR_API_KEY\n```\n\n### VS Code (Copilot / Continue)\n\n**File:** `.vscode/mcp.json`\n\n```json\n{\n  \"servers\": {\n    \"pincushion\": {\n      \"command\": \"npx\",\n      \"args\": [\"pincushion-mcp\", \"--project-dir\", \".\"]\n    }\n  }\n}\n```\n\n### Windsurf / Codeium Windsurf\n\n**File:** `~/.windsurf/mcp.json` or `~/.config/windsurf/mcp.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"pincushion\": {\n      \"command\": \"npx\",\n      \"args\": [\"pincushion-mcp\", \"--project-dir\", \".\"]\n    }\n  }\n}\n```\n\n### Antigravity\n\n**File:** `~/.antigravity/mcp.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"pincushion\": {\n      \"command\": \"npx\",\n      \"args\": [\"pincushion-mcp\", \"--project-dir\", \".\"]\n    }\n  }\n}\n```\n\n### OpenAI Codex / REST API Clients\n\nFor tools that don't support MCP directly, use the REST API wrapper:\n\n```bash\nnpx pincushion-mcp --rest --port 3456\n```\n\nThis starts an HTTP server on `127.0.0.1:3456`. It prints the path to a\nprocess-specific capability file under `~/.pincushion/local-transports/`.\nThat directory is owner-only and the capability file is mode `0600`. Read the\n`restCapability` from the current file and send it as\n`X-Pincushion-Local-Capability`; it rotates whenever the MCP process restarts.\n\nThe REST listener accepts the exact `Host: 127.0.0.1:<port>` only. It rejects\nbrowser `Origin` requests and intentionally sends no generic CORS headers.\nUse a native REST client or an MCP-capable client rather than putting the\ncapability in a browser page, URL, source file, or repository.\n\nLocal HTTP has a 15-second header deadline, a derived request-receive deadline\nof at least 90 seconds, and a separate five-minute `call-tool` response\ndeadline. A `202` response with `tool_execution_pending` means the operation's\noutcome is unknown and `retrySafe` is false; inspect the resulting local or\ncloud state before deciding whether to send another mutation. See the local\ntransport guide for the bounded environment overrides.\n\nEndpoints:\n\n- `GET /health` — Check server status\n- `POST /call-tool` — Invoke a tool\n  - Body: `{ \"toolName\": \"get_feedback_summary\", \"args\": {} }`\n\nExample using curl:\n\n```bash\ncurl -X POST http://127.0.0.1:3456/call-tool \\\n  -H \"Content-Type: application/json\" \\\n  -H \"X-Pincushion-Local-Capability: <restCapability from the 0600 capability file>\" \\\n  -d '{\"toolName\": \"get_feedback_summary\", \"args\": {}}'\n```\n\nSee [local transport security](docs/local-transports.md) for dashboard and\nChrome bridge boundaries, request limits, and the cloud-grant integration seam.\n\n---\n\n## CLI Flags\n\n```bash\nnpx pincushion-mcp [flags]\n```\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `--project-dir PATH` | Root directory containing `.feedback/` | Current working directory |\n| `--sync-url URL` | Supabase API endpoint for remote sync | None (local only) |\n| `--api-key KEY` | API key for Supabase authentication | None |\n| `--license-key KEY` | Pro license key (optional) | None |\n| `--rest` | Enable REST API mode | Disabled (uses MCP/stdio) |\n| `--port PORT` | Port for REST API server | 3456 |\n\n### Examples\n\n**Local project:**\n```bash\nnpx pincushion-mcp --project-dir /path/to/project\n```\n\n**With Supabase sync:**\n```bash\nnpx pincushion-mcp \\\n  --project-dir /path/to/project \\\n  --sync-url https://abcd1234.supabase.co/api \\\n  --api-key sb_project_key_abc123...\n```\n\n**REST API server:**\n```bash\nnpx pincushion-mcp --rest --port 8080\n```\n\n---\n\n## Mobile Crit Walls (iOS)\n\nPincushion pins live on web pages — `mobile-wall` brings native iOS apps into the\nloop by turning a booted simulator into a static, pinnable **crit wall**: one page,\nevery screen, with semantic hotspot overlays generated from the app's accessibility\nhierarchy so pins anchor to real element labels (`data-ax=\"Send message\"`) instead\nof raw pixels.\n\n**Headless (one command, CI-able):**\n\n```bash\nnpx pincushion-mcp mobile-wall run     # first run scaffolds crit-wall/wall.plan.json\n```\n\n`wall.plan.json` declares the whole session: the app (`bundleId`, optional\n`appPath` to install, optional `boot` device to cold-boot a simulator with no\nSimulator.app window) and the screens, each with the maestro navigation that\nreaches it — steps written as JSON (`{\"tapOn\": \"Get started\"}`; YAML is a JSON\nsuperset, so they pass into the generated flow verbatim), or `flow` pointing at\na hand-authored maestro flow file. Re-running `run` boots/installs/launches,\ndrives every screen, captures, and builds the wall — no human at the simulator.\nGenerated flows persist under `crit-wall/flows/` so a failing step can be\nreplayed with `maestro test` directly. maestro's JVM is resolved automatically\n(`/usr/libexec/java_home`, then keg-only Homebrew JDKs) — headless shells and\nCI don't need `JAVA_HOME` exported.\n\n**Manual (navigate the simulator yourself):**\n\n```bash\n# 1. Boot your app in the iOS simulator, navigate to a screen, then:\nnpx pincushion-mcp mobile-wall capture 01-first-launch\nnpx pincushion-mcp mobile-wall capture 02-connect        # …repeat per screen\n\n# 2. Generate the wall:\nnpx pincushion-mcp mobile-wall build --name \"My App\"\n```\n\n**Publish after the app PR merges:**\n\n```bash\nPINCUSHION_LICENSE_KEY=... npx pincushion-mcp mobile-wall publish \\\n  --snapshot crit-wall-snapshot.jpg \\\n  --deploy-command \"vercel deploy --prod\" \\\n  --resolve-implemented \\\n  --verify verified\n```\n\n`publish` is the no-plugin maintenance path for public/native critiques. It\nreruns the headless capture plan by default, rebuilds `wall/`, optionally deploys\nthe static wall, fetches cloud pins for `projectId` + `pageUrl`, recomputes public\nreport marker positions from `snapshot.rects` + current AX hotspots, uploads the\nlatest JPEG/WebP page snapshot, and can mark implemented pins resolved with a\ndeploy URL and verification status. Use `--no-run` when CI already has fresh\ncaptures and only needs to rebuild/upload. It writes\n`crit-wall/wall/publish-manifest.json` and `crit-wall/wall/publish-report.md` for\nthe release artifact. Existing deployed walls are static HTML, so run\n`mobile-wall publish` once after this version lands to republish their\n`index.html`; after that, the wall canvas behavior is loaded from the centrally\nhosted `https://pincushion.io/widget/mobile-wall-canvas.js` script and can be\nupdated by deploying Pincushion rather than regenerating every wall.\n\nBoth modes capture a screenshot (`xcrun simctl io booted screenshot`) plus the\naccessibility hierarchy (**maestro** or **idb**, auto-detected on your PATH) into\n`crit-wall/screens/` + `crit-wall/ax/`. `build` emits `crit-wall/wall/index.html` —\na brandable gallery page (edit `crit-wall/wall.config.json` for the title, copy,\naccent color, and per-screen captions, then rebuild) — and prints the next steps:\ndeploy the wall to any static host, register it with `configure_project`, and mint\na public crit link with `create_share_report`. Once the config carries the\n`projectId` + deployed `pageUrl`, a rebuild turns on zero-install click-to-pin:\nvisitors drop pins straight on the screens with just a name + email. Pins dropped\non a hotspot prefix the comment with `[Flow: ...] [Route: ...] [Build: ...]\n[Screen: ...] [Element: ...]` when that metadata exists, and every\nbuild also writes `crit-wall/wall/agent-context.json` with screen selectors,\nimage dimensions, and accessibility hotspot selectors. Builds also emit\n`crit-wall/wall/agent-work-packet.json` and\n`crit-wall/wall/agent-work-packet.md`: a reusable app-agent handoff with\nheadless capture provenance, `wall.plan.json` reproduction commands, native\nsource hints, screenshot-only warnings, and per-hotspot source search commands.\nThat packet is the handoff for a coding agent: use it to map critique back to\nnative UI labels instead of treating the report as screenshots.\n\nFor stronger native-source context, edit `wall.config.json` before rebuilding:\nset `agent.targetRepo`, `agent.sourceRoots`, optional `agent.implementationNotes`,\nand `sourceHints.screens` / `sourceHints.labels` entries for known SwiftUI/UIKit\nfiles, routes, and screen identifiers. `mobile-wall` still derives useful `rg`\nsearches from accessibility labels by default, but explicit source hints make\npin-to-PR routing much less ambiguous for a future agent.\n\nFor social sharing, set `ogImage` in `wall.config.json` (a file inside `wall/`,\ne.g. `og.png`). To make click-to-pin markers land exactly on the annotated share\nreport, run `upload_page_snapshot` and record the mapping in the config\n(`snapshot: { w, h, rects: { \"<screen>\": { x, y, w, h } } }` — each exhibit\nimage's rect within the snapshot); screens without a rect fall back to\ndocument-relative pin coordinates.\n\nThe OpenClaw iOS pilot exposed the important boundary: `mobile-wall` can make a\nnative-app critique actionable, but it should not pretend to fix the native app\nby editing the wall. Use the wall PR to improve capture, pin context, snapshot\nmapping, and reviewer ergonomics; use the app repo PR to change copy, buttons,\nnavigation, empty states, and other product behavior.\n\nOptions: `--out <dir>` (default `crit-wall`), `--plan <file>` (run),\n`--backend maestro|idb`, `--udid <udid>` (default `booted`). Requires Xcode\ncommand line tools; maestro is required for `run` navigation (idb works for\ncapture-only AX). Android (adb/uiautomator) is not supported yet.\n\n---\n\n## Tools\n\n<!-- BEGIN GENERATED:tool-index -->\n<!-- Generated index of every MCP tool — edit descriptions in pincushion-mcp/server.js, then run `npm run sync`. Pro\\* = degrades to a partial result on Free. -->\n| Tool | Plan | Summary |\n|---|---|---|\n| `add_agency_internal_message` |  | Pilot: append an owner/editor-only internal thread note to one pin. It never enters the public… |\n| `add_agent_reply` |  | Add a reply to an annotation thread (e.g. to ask a clarifying question or note a finding). |\n| `add_bot_reply` |  | Post a Pincushion AI reply to a pin's thread. Hardcodes author=\"Pincushion AI\" and… |\n| `add_member` | Pro | Add a collaborator to a Pincushion project. Developers consume a paid seat and can implement… |\n| `approve_pin` |  | Mark a pin as approved for implementation. Only approved pins should be implemented by agents.… |\n| `archive_agency_label` |  | Pilot: archive one owner/editor-only agency label. Archived labels cannot be applied or used in… |\n| `assign_pin_to_agent` |  | Assign a pin directly to your local coding agent. Promotes the pin to \"ready\" (if not already),… |\n| `attach_verification_run` |  | Pilot: ask Pincushion to retrieve and validate a configured GitHub Actions run for an existing… |\n| `claim_pending_slack_install` |  | LEGACY FALLBACK. Since May 2026, Slack installs auto-link to a Pincushion license when the… |\n| `claim_pin` |  | Claim an actionable pin before starting work on it. Transitions the pin from… |\n| `complete_critique_request` |  | Mark a critique_queue request as completed after the critic subagent has run on its page URLs.… |\n| `complete_deployment_capture_run` |  | Requests server-side frame-refresh completion after all exact page/device receipts have been… |\n| `configure_collaboration_integration` |  | Connect a Pincushion project to Slack, Microsoft Teams, or Discord using an incoming webhook.… |\n| `configure_project` |  | Register a Pincushion project and associate it with your app's URLs. Registration does not call… |\n| `create_agency_label` |  | Pilot: create an owner/editor-only custom label. Labels are private agency metadata and never… |\n| `create_agent_pin` |  | File a pin as a THIRD-PARTY agent — the write half of the browser-agent → coding-agent handoff.… |\n| `create_critique_pin` |  | Create a pin authored by Pincushion AI. ONLY call this from the pincushion-critic subagent,… |\n| `create_invite_link` |  | Generate a Figma-style shareable invite URL for a project. The recipient opens it, enters their… |\n| `create_share_report` |  | Mint a public read-only crit report link (pincushion.io/r/<token>) for a project: numbered pins… |\n| `create_slack_install_link` |  | Generate an Add-to-Slack OAuth URL pre-bound to a project. Most users should prefer the public… |\n| `export_agency_evidence` |  | Pilot: produce a bounded owner/editor-only structured export for one project, filtered exactly… |\n| `fix_and_resolve` |  | Resolve a pin after applying a code fix. Transitions the pin directly to \"resolved\" status so it… |\n| `generate_critique_report` |  | Turns supplied real captures into a report receipt; it does not inspect a page or generate… |\n| `get_actionable_pins` |  | Get all pins waiting for developer attention. Returns three categories: (1) \"auto-agent\" — pins… |\n| `get_agency_coordination_state` |  | Pilot: read the exact owner/editor-only agency coordination state for one project. This does not… |\n| `get_agency_internal_thread` |  | Pilot: read the append-only internal agency thread for one exact pin. This is restricted… |\n| `get_annotations` |  | Retrieve annotation pins from the .feedback/ directory. Filter by page URL, LWC component name,… |\n| `get_component_feedback` |  | Get all feedback pins targeting a specific LWC component, with a plain-language summary ready… |\n| `get_deployment_reconciliation_status` |  | Read a compact, provider-neutral deployment readiness diagnostic. It never creates a binding,… |\n| `get_feedback_summary` |  | Get a high-level rollup of all open feedback: counts by status, page, and component. Use this to… |\n| `get_implementation_packet` |  | Get a single implementation packet for one page URL. Useful when you want to batch-fix one page… |\n| `get_pending_critiques` |  | Used by /critique-latest-deploy. Lists pending critique requests queued by the deploy-hook for… |\n| `get_pending_deployment_frame_refreshes` |  | Lists production deployment frame-refresh work independently of the Critique queue. Use this… |\n| `get_pin_verification` |  | Read authoritative verification evidence for one explicit project and pin. Separates caller… |\n| `get_project_context` |  | Read-only cloud-project lookup of context (name, URLs, brand context, autoCritique flag,… |\n| `get_project_identity_diagnostic` |  | Read-only diagnostic for project identity repair. Returns only authentication state, safe key… |\n| `get_project_write_authorization` |  | Read current developer write authorization for this server's exact acknowledged project. Uses… |\n| `get_reply_candidates` |  | Used by /pincushion-replies. Returns pins where Pincushion AI should respond, with each… |\n| `get_review_activity` |  | Pilot: read authenticated client-review decisions and completion for exact frozen review… |\n| `get_selected_pins` |  | Get pins that the developer has selected for implementation from the dashboard or PINS.md… |\n| `get_setup_instructions` |  | Continue an existing critique with claim, or start a project with setup and explicit editor… |\n| `get_time_to_fix_metrics` | Pro\\* | Compute median + p25/p75 time-to-fix from resolved pins. Returns sample size + threshold flag so… |\n| `implement_approved_pins` |  | CALL THIS FIRST when approved pins exist. Returns all stakeholder-approved pins grouped into… |\n| `import_qa_results` |  | Pilot: import already-parsed axe JSON or Playwright JSON from an authenticated… |\n| `link_pin_deploy` |  | Link a deploy URL to a resolved pin. Typically called by the deploy-hook edge function once a… |\n| `list_agency_pins` |  | Pilot: read owner/editor-only pins with private labels and evidence summaries. `status`,… |\n| `list_collaboration_integrations` |  | List Slack and Microsoft Teams webhook subscriptions for a Pincushion project. Webhook URLs are… |\n| `list_members` | Pro | List all members of a Pincushion project with their roles, plus seat usage info. |\n| `manage_deployment_automation` |  | Owner-keyed deployment automation management. inspect is read-only. repair is available only for… |\n| `preview_collaboration_notification` |  | Preview the Slack, Teams, or Discord notification shape and recommended event routing before… |\n| `record_deployment_page_result` |  | Record one terminal page result for a deployment frame refresh. Every non-removed page in an… |\n| `record_pin_verification` |  | Record a caller-reported verification verdict using the compatible legacy workflow. This does… |\n| `register_deployment_discovered_pages` |  | Register the exact bounded URL inventory discovered in one local browser context before staging… |\n| `remove_collaboration_integration` |  | Remove a Slack, Microsoft Teams, or Discord webhook subscription from a Pincushion project. |\n| `remove_member` | Pro | Remove a collaborator from a Pincushion project. Frees up the seat if they were an editor. |\n| `resolve_annotation` |  | Mark an annotation as resolved after addressing the feedback. Optionally add a resolution… |\n| `resolve_quickstart_demo` |  | Finish the quickstart demo loop after editing the demo copy. Confirms the change, returns the… |\n| `search_annotations` |  | Full-text search across all annotation comments, selectors, component names, and tags. |\n| `set_agency_coordination_pilot` |  | Pilot: owner-only switch for the private agency coordination increment. It is off by default.… |\n| `set_agency_pin_labels` |  | Pilot: replace the private agency-label set on one pin. Every label must belong to the same… |\n| `set_slack_preferences` |  | Read or update the caller's Slack DM preferences. Resolves the user via license_key → email,… |\n| `start_deployment_capture_run` |  | Starts one short-lived local frame-refresh run for an exact deployment and returns its opaque… |\n| `start_quickstart_demo` |  | Start the 60-second Pincushion quickstart: returns one sample stakeholder feedback pin (element… |\n| `submit_verification_report` |  | Pilot: append a project-scoped caller-reported verification observation. An idempotency key… |\n| `update_critique_context` |  | Lightweight write-only path for the layered critique-context system. Use this from /setup and… |\n| `upload_page_snapshot` |  | Upload a full-page screenshot that turns the public share report into an annotated page: viewers… |\n<!-- END GENERATED:tool-index -->\n\n### `get_annotations`\n\nRetrieve annotations from `.feedback/`. Filter by page, component, or status.\n\n**Parameters:**\n- `pageUrl` (string, optional) — Filter by page URL (partial match)\n- `componentName` (string, optional) — Filter by LWC component name\n- `status` (string, optional) — Filter by `open`, `in-progress`, or `resolved`\n\n**Example:**\n```javascript\nawait mcp.callTool('get_annotations', {\n  componentName: 'wmlHomePage',\n  status: 'open'\n});\n```\n\n### `search_annotations`\n\nFull-text search across all annotations, comments, selectors, and tags.\n\n**Parameters:**\n- `query` (string, required) — Search term\n\n**Example:**\n```javascript\nawait mcp.callTool('search_annotations', {\n  query: 'button label'\n});\n```\n\n### `get_feedback_summary`\n\nHigh-level rollup of all feedback: counts by status, priority, page, and component.\n\n**Example:**\n```javascript\nawait mcp.callTool('get_feedback_summary', {});\n```\n\n### `get_component_feedback`\n\nGet all feedback for a specific LWC component with a plain-language summary.\n\n**Parameters:**\n- `componentName` (string, required) — LWC component name\n\n**Example:**\n```javascript\nawait mcp.callTool('get_component_feedback', {\n  componentName: 'wmlHomePage'\n});\n```\n\n### `resolve_annotation`\n\nMark an annotation as resolved after fixing the issue.\n\n**Parameters:**\n- `annotationId` (string, required) — Annotation ID\n- `comment` (string, optional) — Resolution message\n- `resolvedBy` (string, optional) — Name to attribute resolution (default: \"AI Agent\")\n\n**Example:**\n```javascript\nawait mcp.callTool('resolve_annotation', {\n  annotationId: 'ann_abc123',\n  comment: 'Updated button label in line 42 of wmlHomePage.js'\n});\n```\n\n### `add_agent_reply`\n\nAdd a reply to an annotation thread (e.g., ask clarifying questions).\n\n**Parameters:**\n- `annotationId` (string, required) — Annotation ID\n- `body` (string, required) — Reply message\n- `author` (string, optional) — Author name (default: \"AI Agent\")\n\n**Example:**\n```javascript\nawait mcp.callTool('add_agent_reply', {\n  annotationId: 'ann_abc123',\n  body: 'Is this button in the main navigation or sidebar?'\n});\n```\n\n### `fix_and_resolve`\n\nCombine fixing code and marking an annotation as resolved in one call. Optionally records commit / branch / PR metadata so the dashboard can backlink to what shipped.\n\n**Parameters:**\n- `annotationId` (string, required) — Annotation ID\n- `fixDescription` (string, required) — Description of the fix\n- `filePath` (string, optional) — File where fix was applied\n- `lineNumber` (number, optional) — Line number of the fix\n- `commitSha` (string, optional) — Commit SHA that landed the change\n- `branchName` (string, optional) — Branch the commit was made on\n- `prUrl` (string, optional) — Pull request URL (GitHub/GitLab/Bitbucket; shape-validated)\n\n**Example:**\n```javascript\nawait mcp.callTool('fix_and_resolve', {\n  annotationId: 'ann_abc123',\n  fixDescription: 'Updated button label to match design spec',\n  filePath: 'src/components/wmlHomePage.js',\n  lineNumber: 42,\n  commitSha: 'abc123def456',\n  branchName: 'pincushion/checkout-fix',\n  prUrl: 'https://github.com/acme/app/pull/142'\n});\n```\n\n### `get_implementation_packet`\n\nFetch a single implementation packet for one page URL — selector list, full pin payloads, suggested branch name, and traceability config. Use when an agent wants to batch-fix one page in a single branch.\n\n```javascript\nawait mcp.callTool('get_implementation_packet', { pageUrl: '/checkout' });\n```\n\n### `assign_pin_to_agent`\n\nDispatch a pin straight to your local coding agent. Promotes the pin to `ready` if not already, marks `pending_implementation`, and writes a `.feedback/.agent-queue/<id>.json` trigger file that `agent-loop.mjs` picks up and shells out to Cursor / Claude Code / Codex.\n\n```javascript\nawait mcp.callTool('assign_pin_to_agent', { annotationId: 'ann_abc123' });\n```\n\n### `link_pin_deploy`\n\nAttach a deploy URL to a resolved pin. Typically called by the deploy-hook edge function once production includes the fix, but available manually too.\n\n```javascript\nawait mcp.callTool('link_pin_deploy', {\n  annotationId: 'ann_abc123',\n  deployUrl: 'https://acme-app.vercel.app'\n});\n```\n\n### `record_pin_verification`\n\nWrite Pincushion AI's post-deploy verdict back to the pin. Called by the critic agent after `/critique-latest-deploy` runs against a fresh deploy.\n\n```javascript\nawait mcp.callTool('record_pin_verification', {\n  annotationId: 'ann_abc123',\n  status: 'verified',  // or 'regressed' or 'inconclusive'\n  notes: 'Button matches the primary token. No regression on adjacent CTAs.'\n});\n```\n\n### `get_time_to_fix_metrics`\n\n**Pro/Team feature** — Free callers get sample size + upgrade hint. Median + p25/p75 of pin-to-resolve duration, with a 5-pin minimum so the metric is never noise.\n\n```javascript\nawait mcp.callTool('get_time_to_fix_metrics', { scope: 'project', projectId: 'pc_proj_abc' });\n// → { sampleSize, thresholdMet, median, p25, p75, medianHuman, ... }\n```\n\n### `get_setup_instructions` (NEW)\n\nGet setup and configuration instructions for all supported agents.\n\n**Example:**\n```javascript\nawait mcp.callTool('get_setup_instructions', {});\n```\n\n### Slack and Microsoft Teams integrations\n\nPincushion can notify Slack or Microsoft Teams through project-scoped incoming webhooks. The defaults are intentionally quiet and Figma-inspired: notify when a pin is ready for implementation, when someone is @mentioned, and when a collaborator adds follow-up on work already being handled. Every newly dropped pin and every resolution are opt-in events.\n\n**Recommended use cases:**\n- Developer channel: `pin_ready` and `follow_up`\n- Design or PM channel: `mention` and optionally `resolved`\n- Launch or QA channel: `pageUrlPatterns` plus `pin_ready`, `follow_up`, and `resolved`\n- Temporary incident channel: enable a focused subscription, then pause it after the ship window\n\n**Example:**\n```javascript\nawait mcp.callTool('configure_collaboration_integration', {\n  projectId: 'my-project',\n  provider: 'slack',\n  webhookUrl: 'https://hooks.slack.com/services/...',\n  targetLabel: '#product-feedback',\n  events: ['pin_ready', 'mention', 'follow_up'],\n  pageUrlPatterns: ['staging.example.com/checkout'],\n  sendTest: true\n});\n```\n\nFor Slack, use `create_slack_install_link` when the hosted Slack app secrets are configured. It returns an Add-to-Slack URL; after approval, Slack returns the incoming webhook and Pincushion stores it automatically.\n\nUse `list_collaboration_integrations` to audit configured destinations, `remove_collaboration_integration` to disconnect one, and `preview_collaboration_notification` to see the payload shape before adding a real webhook. Webhook URLs are stored server-side and returned only as masked values.\n\n---\n\n## Auto-Agent Loop (Optional)\n\nFor agents that don't watch the file system (Claude Code, Cursor, generic),\n`agent-loop.mjs` polls `.feedback/.agent-queue/` and dispatches new pins\nto the configured agent automatically.\n\n```bash\n# from inside the pincushion-mcp directory\nnpm run agent-loop -- --project-dir /path/to/your/project\n\n# or directly\nnode agent-loop.mjs --project-dir /path/to/your/project [--agent claude-code|cursor|generic] [--interval 3000]\n```\n\nThe bridge (server.js) writes one trigger file per approved pin into\n`.feedback/.agent-queue/`. The loop reads them, builds a prompt with\nthe pin's thread + element selector, and shells out to the chosen agent.\nThe agent uses MCP tools (`claim_pin` → fix → `fix_and_resolve`) and\nthe queue file is removed when the pin closes.\n\n`detectAgent()` auto-detects `claude` or `cursor` on the `PATH`; falls\nback to `generic` (writes the prompt to `.feedback/.agent-prompt` and\nstdout). Run with `--interval 3000` to control poll cadence.\n\n---\n\n## Local File Structure\n\nThe server reads annotations from `.feedback/` in your project:\n\n```\n.feedback/\n├── annotations/\n│   ├── example-com-login.json\n│   ├── example-com-dashboard.json\n│   └── ...\n└── index.json\n```\n\nEach annotation file contains:\n\n```json\n{\n  \"pageUrl\": \"https://example.com/login\",\n  \"pageTitle\": \"Login\",\n  \"annotations\": [\n    {\n      \"id\": \"ann_abc123\",\n      \"status\": \"open\",\n      \"priority\": \"high\",\n      \"tags\": [\"design\", \"accessibility\"],\n      \"createdAt\": \"2026-03-19T10:30:00Z\",\n      \"element\": {\n        \"lwcComponent\": \"wmlLoginForm\",\n        \"selector\": \".login-button\",\n        \"textContent\": \"Sign In\"\n      },\n      \"thread\": [\n        {\n          \"author\": \"Design Team\",\n          \"timestamp\": \"2026-03-19T10:30:00Z\",\n          \"body\": \"Button label should say 'Sign In' not 'Login'\",\n          \"type\": \"comment\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n---\n\n## Supabase Sync\n\nTo sync annotations with a remote Supabase database:\n\n1. Set up a Supabase project at [supabase.com](https://supabase.com)\n2. Create an `annotations` table with columns matching the annotation schema\n3. Generate an API key from your project settings\n4. Configure the server with `--sync-url` and `--api-key`\n\n**Example:**\n```bash\nnpx pincushion-mcp \\\n  --project-dir . \\\n  --sync-url https://your-project.supabase.co/rest/v1 \\\n  --api-key sb_project_key_abc123...\n```\n\nThe server merges local `.feedback/` files with remote data, with remote taking precedence on newer updates.\n\n---\n\n## Pro License\n\nPincushion Pro includes additional features. Activate with `--license-key`:\n\n```bash\nnpx pincushion-mcp --project-dir . --license-key YOUR_PRO_KEY\n```\n\n---\n\n## Troubleshooting\n\n### \"Module not found\" error\n\nUse Node.js 22.22+ or Node.js 24. Node.js 18 and Node.js 20 are unsupported:\n\n```bash\nnode --version\n```\n\nInstall dependencies:\n\n```bash\nnpm install @modelcontextprotocol/sdk\n```\n\n### Annotations not appearing\n\nCheck that `.feedback/` exists in your project directory:\n\n```bash\nls -la .feedback/\n```\n\nIf it doesn't exist, create it and add some test annotations, or the extension will create it when you pin your first feedback.\n\n### Supabase sync not working\n\nVerify your credentials:\n\n```bash\ncurl -H \"x-api-key: YOUR_API_KEY\" \\\n  https://your-project.supabase.co/rest/v1/annotations\n```\n\n### Agent can't find the server\n\nIn your agent config, use the full path to `pincushion-mcp`:\n\n```bash\nwhich pincushion-mcp\n# Use the output path in your config\n```\n\nOr use `npx` to let it find the package:\n\n```json\n{\n  \"command\": \"npx\",\n  \"args\": [\"pincushion-mcp\", \"--project-dir\", \".\"]\n}\n```\n\n---\n\n## Development\n\nClone the repository and install dependencies:\n\n```bash\ngit clone https://github.com/jcooley8/pincushion.git\ncd pincushion\nnpm install\n```\n\nRun the server:\n\n```bash\nnpm start\n```\n\nOr with test data:\n\n```bash\nnpm start -- --project-dir ./test-feedback\n```\n\n---\n\n## License\n\nMIT License. See LICENSE file for details.\n\n---\n\n## Support\n\n- **Issues:** [GitHub Issues](https://github.com/jcooley8/pincushion/issues)\n- **Docs:** [Pincushion Documentation](https://pincushion.io/docs)\n\n---\n\n## Changelog\n\n### v1.0.0 (March 2026)\n\n- Initial release\n- Support for Cursor, Claude Desktop, Claude Code, VS Code, Windsurf, Antigravity\n- Local `.feedback/` file support\n- Supabase remote sync\n- REST API wrapper for non-MCP clients\n- New tools: `fix_and_resolve`, `get_setup_instructions`\n\nVS Code uses `code chat --mode agent` for the acknowledged local workspace. GUI launch is not completion: setup waits up to ten minutes for exact-run server readback, then verifies and opens the report. Ambiguous profiles, inherited MCP/skill precedence, custom or unrestricted permission settings stop rather than being rewritten. Existing agent/model access and Manual tool approvals are required. Node/npm must exist before `npx` can start; npm dependencies are installed by the package, while Chrome/Chromium and the selected client remain checked prerequisites rather than silently provisioned binaries.\n","readmeFilename":"README.md"}