{"_id":"@ahmednawaz/crank","_rev":"23-0584a79c6646329e2aa8663b03b45887","name":"@ahmednawaz/crank","dist-tags":{"latest":"0.3.10"},"versions":{"0.1.2":{"name":"@ahmednawaz/crank","version":"0.1.2","keywords":["crank","glean","mcp","copy","ux-writing"],"_id":"@ahmednawaz/crank@0.1.2","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"01b651de8db71b8d9abbdfd9e2dda196cf16c04b","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.1.2.tgz","fileCount":36,"integrity":"sha512-K6bYP5mdhgUgbfbUBHjXtaDMfNnRjCn0AFE2y3B0TrKClXYSIBfgMuHsOhN0FRPjupqYJ0ZhYo+MPhLLgSi9rQ==","signatures":[{"sig":"MEYCIQDKVl3jFH8Qg1d+mk+0hO5gqOf8wLBJ/4RohV9DexzEqQIhANUbZPrZqJIIb+gcvNGJT/RQLHJOq8ZzytyKQXqPWAfo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311785},"main":"vite.js","engines":{"node":">=18"},"exports":{".":"./vite.js","./vite":"./vite.js","./package.json":"./package.json"},"gitHead":"66ae009f195fd1022083a2804509b0f469ab050e","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","publish:team":"node scripts/prepare-publish.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"},"workspaces":["companion","mcp-server"],"_npmVersion":"11.12.1","description":"One-command copy iteration: select UI text → Glean variants → MCP apply. Works in Cursor, VS Code, Claude, and Replit.","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/crank_0.1.2_1784972954248_0.738346269955807","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@ahmednawaz/crank","version":"0.1.5","keywords":["crank","glean","mcp","copy","ux-writing"],"_id":"@ahmednawaz/crank@0.1.5","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"f4a534ac95ca821c339ab10f47f48bc1a5534fa4","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.1.5.tgz","fileCount":38,"integrity":"sha512-3rAJGWb2eqPKoFWIZxsYunjN3EZiHzXXzsT2vMZF6JBMdwS/zPF5i8i9miL9zBtQLz3stbQfJ0GAuZz7cStTgg==","signatures":[{"sig":"MEQCIFexggtQJZ9B0oaa+xeGm7BEqu1aTpGYz0Z53XYGMNfYAiAajw1uQgltHeFVJiL9cGXOta9359Luz146sbYmFDSRlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":328833},"main":"vite.js","engines":{"node":">=18"},"exports":{".":"./vite.js","./vite":"./vite.js","./package.json":"./package.json"},"gitHead":"4700e56b1c34efa8bee1923b09b9427967955118","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","publish:team":"node scripts/prepare-publish.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"11.12.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/crank_0.1.5_1784974264850_0.7225906764737982","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@ahmednawaz/crank","version":"0.1.6","keywords":["crank","glean","mcp","copy","ux-writing"],"_id":"@ahmednawaz/crank@0.1.6","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"c939c1986bf4ead554ecd8c51fed9595961993aa","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.1.6.tgz","fileCount":38,"integrity":"sha512-XrjMaSjcGD+Xwk2FTYc+46YjdegVNR2s3goQn/mTu2/3zGDXAHSHk53Q9+xku2BO0oGolq0rJw5AMAK27l8UsQ==","signatures":[{"sig":"MEUCIQCTsHJI5DQctwbZMetvU4iUVyd5Wv6PBlMq2WwISPX++wIga5bFh/xvHw/DBkSrV2nH9r0UGm6pyqvb9Iy3m6Trqdc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":329169},"main":"vite.js","engines":{"node":">=18"},"exports":{".":"./vite.js","./vite":"./vite.js","./package.json":"./package.json"},"gitHead":"51031942e7ca7daba03351bd939303ff56ba7bac","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","express":"^4.21.2","@cursor/sdk":"^1.0.23","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/crank_0.1.6_1784975316743_0.043285475210175894","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@ahmednawaz/crank","version":"0.1.7","keywords":["crank","glean","mcp","copy","ux-writing"],"_id":"@ahmednawaz/crank@0.1.7","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"6afbf75b7c155aa870aa68b1aff3e22605de7e3a","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.1.7.tgz","fileCount":38,"integrity":"sha512-6AN3jPrwhpIGN4ETnCEXAHD86PpwkhZfhv4NX/JYNtWBNDrKSb63V6KqnOo+r88kBjLGvCmnzOoAEgV5YQFYdg==","signatures":[{"sig":"MEYCIQDmVfDq7CpKu4IiA9+SHvzilpC4rUxosUsdy9O8If3eawIhALY6DP1WDulBvC9TCgH+Rik60sDy1tMrnDABXr7thead","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":329174},"main":"vite.js","engines":{"node":">=18"},"exports":{".":"./vite.js","./vite":"./vite.js","./package.json":"./package.json"},"gitHead":"422cb00f88a288e39333f5f06f394a19532408e0","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","express":"^4.21.2","@cursor/sdk":"^1.0.23","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/crank_0.1.7_1784975641162_0.47797953883988153","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@ahmednawaz/crank","version":"0.1.8","keywords":["crank","glean","mcp","copy","ux-writing"],"_id":"@ahmednawaz/crank@0.1.8","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"5066893f7828831760bc437d732b4a8946841576","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.1.8.tgz","fileCount":40,"integrity":"sha512-F5hX/M0rv5iFAqmUalTp9VpLBiSOOewSXGbkTLjqk8+ARkGDE7lZOe8osnsp05wKkKXrJgFeaqJqu1f5a2OhdA==","signatures":[{"sig":"MEYCIQCDINOeCxd6eFK6pLDPZygNihQ/c02KLxSR4FXm48ACLwIhAJ7BLmaCs27V0viGVsUrg4JcB7+dWyGuB9hhzc6q4mCc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392707},"main":"vite.js","engines":{"node":">=18"},"exports":{".":"./vite.js","./vite":"./vite.js","./package.json":"./package.json"},"gitHead":"cc50a2659528b8ebc578ad1014a2b50a0ba6a8fe","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/crank_0.1.8_1784976147884_0.8644898983820299","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@ahmednawaz/crank","version":"0.1.9","keywords":["crank","glean","mcp","copy","ux-writing"],"_id":"@ahmednawaz/crank@0.1.9","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"3965e1150e8bff2a45f83f202dca1d7e964ead7d","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.1.9.tgz","fileCount":44,"integrity":"sha512-5rft0BZ8ooOHi9Deq/aXFFQ6MQUbRGvOTi0Khw9OXteCLPiHdUYc2pdgIj4whYnHSJeusp46BlBzW20LcRuSgQ==","signatures":[{"sig":"MEQCIG0Es3IkZ1aL8yvMNE403LSVBqFpwrKtDIooFntmAEjBAiA3Jwj1uWRS+F/WxbAHBAfVDEVGmOrvNOex7xjWxYroxw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":411188},"main":"vite.js","engines":{"node":">=18"},"exports":{".":"./vite.js","./next":"./next.js","./vite":"./vite.js","./react":"./react.js","./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"e95f5a6a9c2baee926df154dc5287b21713132c5","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.1.9_1784976726451_0.07523220461145863","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@ahmednawaz/crank","version":"0.2.0","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.2.0","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"18bafaaa8b605fec57b8c027f3ca1bad5c4ee241","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.2.0.tgz","fileCount":47,"integrity":"sha512-UzoIO4F3xSDoQXkWxKA+uN9VBB0fSxJEtxdA+7WK3iU5i888RK4q37cPUukY5aI/8vHuZw0ar7tr9QaTazKe9A==","signatures":[{"sig":"MEUCIEZIz8zRdhtidpitcd0Dpzf8OD/IV8Ti8m9T5Lz1j6znAiEA0WeI9U3IT6B6cz1tXn3YUyES13+rntX2bfGS+EQvIQM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":415640},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"63a8d54f6a57beac33c8e2eeab1c3804be997763","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.2.0_1784977222615_0.649253983353109","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@ahmednawaz/crank","version":"0.2.2","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.2.2","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"4ccebefae5e10535927fa388d148ea6b3fc53a27","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.2.2.tgz","fileCount":48,"integrity":"sha512-R9sqnYB28sr86WVKcJKp0fgYF9S1qT5BH9nZhiYePhrg13VUYg7eTSLzi2thT7zOh1huvklGGFRA+flHd5zeuA==","signatures":[{"sig":"MEUCIQDu3gw7Q/piVC781VLqLeMvpLhRoAoXQhMQcAmLcmODYgIgAeVcCq0TafiZGWFn2nf856yCj4npvvsaESnD/LQR0Tw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":424011},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"ad6c94376a977a2a831aed8f425d97224288577a","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.2.2_1784977619449_0.13504839913333777","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@ahmednawaz/crank","version":"0.2.3","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.2.3","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"ec9711e2833d43dc38ef8d04d0ac383dd8a2db00","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.2.3.tgz","fileCount":48,"integrity":"sha512-7DjnoNrV54iI7/YMCEDhtSa3A5W6BujQpW9QQTyGLIxe7+6tB8q0dbokjN8bfHFZ9vT+9bfudXu1KfhxjppJqg==","signatures":[{"sig":"MEYCIQCm9JZMmsIh1+zZHScCwubAcqLZeftyTYfamMBEgy2jNwIhAKmnqoi4+DJvn1MFA9Dov+0CrZB/r9+LiO9gxCKc6plo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":427050},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"cc241935fdc0da7dad4c2a1b2d86afef6faa61b1","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.2.3_1784978140750_0.30956075193888566","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@ahmednawaz/crank","version":"0.2.4","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.2.4","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"f11539942ecaad3d9d11a6feda161ef9950d2861","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.2.4.tgz","fileCount":48,"integrity":"sha512-G3UPa4gCL5PnvFW/+dK+f2JVT01CaCXlmYb30YzJMJrlGHZ3isDR6d5Xp5C/A+ZIyifsHMV+9UmdcCVrySwKtw==","signatures":[{"sig":"MEQCIF/1nQG6jM2jEO+5dNump+qOSYHE5F03ZBDBPkBmr/5TAiAmRANm4Im+KxM4xrsb0aYx3Wd9MhkUqNM3APZp0itvWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":423630},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"0225a5d5dc114d49e7debf4c3e561bd8dbdfd672","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.2.4_1784978493094_0.16506125408235528","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@ahmednawaz/crank","version":"0.2.5","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.2.5","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"04b4e6cd6dac2f209245f153f2112657ce3cd8e8","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.2.5.tgz","fileCount":49,"integrity":"sha512-kHSnBTmLFG8j80XXvf/B6IM5/r9GOtwZ4fS7o7Nz09FMVDOcEAa3+b3iYD3oazJDqVihtd/c0vJmvhPR0wRkZg==","signatures":[{"sig":"MEUCIQDpyjsxxvN/74LdXIZ1T6lEztwZfo7qrEk7LNA6m5myCAIgZBqlFfR9IieDLtGHJNrh9R2rIYX53fgNQJmkTqbcneY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":423160},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"fd43f0d7456099488f867e31335a5746f3d49ae1","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.2.5_1784978723336_0.12116316095968083","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@ahmednawaz/crank","version":"0.2.6","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.2.6","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"e7b83f1383b6149102faf8360cad0f2bc4225508","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.2.6.tgz","fileCount":49,"integrity":"sha512-jD+85BvkLz8qPTPHOHL+4fVPfnGWo14ZsURTgXYDC5h9Ziyp47ZPa6af9UJF6nbL25KYu7TFzflBZKrC+tIo3g==","signatures":[{"sig":"MEUCIQCgddswCadAGAX5kRksovd7Rvm0emokGf5ZRYaY1ZOD5AIgYD13DtP90KaRzhbH+2pgORUvPXGsomEPdctwAT6KWik=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.2.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":426574},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"0b41015f176758735dce8667ab195d81f3dd6c6e","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js","test:patch-vite":"node scripts/test-patch-vite.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.2.6_1784979078972_0.035448486417475555","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@ahmednawaz/crank","version":"0.2.7","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.2.7","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"4907fb013ef51f26099855a0f2a3c495f7a3eb38","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.2.7.tgz","fileCount":49,"integrity":"sha512-jZ0uwsJawic6IY5jGwoUUHHhZ5uEwZ4dmCgvPmPyuDKQUGKUF+USGHMrnxmFYGFz7SrqREagt18ubofN6sghhw==","signatures":[{"sig":"MEUCIFwHqtUSarPWYF5QFEIj4AXvN/ZMNxbciG8Hfj4USZOjAiEAwpyybCaGesmDrSY5dkwsPeqkNIdj0CEaTYzX7XjC0f4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.2.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":429610},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"3b0e92ff0e9cbb4c67285096d90ff6de8f4962e6","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js","test:patch-vite":"node scripts/test-patch-vite.js","test:react-detect":"node scripts/test-react-detect.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.2.7_1784979232222_0.6492338188401394","host":"s3://npm-registry-packages-npm-production"}},"0.2.8":{"name":"@ahmednawaz/crank","version":"0.2.8","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.2.8","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"10c2e4d9cc91f98cf8566f4b69da4ebf9882b7ca","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.2.8.tgz","fileCount":49,"integrity":"sha512-xgYBZl/iaPrshF1xQpIlSm0OvSPAFz2u5FqWmLwE7nAXujaPNSoJqHulkIJs7FX6gjWiVu0BqgOLI6dTlhtYGg==","signatures":[{"sig":"MEUCIQCedzJTYe0edSnq9pD1WysUA/YrRDjsjxuFlqxnbeT4QgIgEB+gEFfroLYAKtIRwZrdvtZ8S/Uc348HFYicSTuXBoQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.2.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":437223},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"194f7266738edadbf81e7a9b63c98d2404aedc16","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js","test:patch-vite":"node scripts/test-patch-vite.js","test:react-detect":"node scripts/test-react-detect.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.2.8_1784979612624_0.6149360880092096","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@ahmednawaz/crank","version":"0.3.0","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.3.0","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"b2258ebfaf7f959618d1b409dfc416fd018b2df7","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.3.0.tgz","fileCount":50,"integrity":"sha512-v1CunOnF2B35b8USrs3oWED81brvMRpWZAcjr7YbeqtTrtrcEvt1b45nUlcWaMHrJJxLsDryBbXLGgk5TR8SDA==","signatures":[{"sig":"MEQCICOQ+NhgzVZ4swUVu3c4nDmFkrjNjbEIY7FUXJ4VxrSFAiBYcBBwPrDQDVM9MLOI68qAQilpvqBDj3cqrbT0k0s0gw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":595479},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./panel":"./panel-boot.mjs","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./panel-boot":"./panel-boot.mjs","./package.json":"./package.json"},"gitHead":"6410d85ebbb48947528178a9450743ef2aa3771b","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","embed:panel":"node scripts/embed-panel.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/embed-panel.js && node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/embed-panel.js && node scripts/prepare-publish.js","test:patch-vite":"node scripts/test-patch-vite.js","test:react-detect":"node scripts/test-react-detect.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.3.0_1784979807045_0.32592209540801553","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@ahmednawaz/crank","version":"0.3.1","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.3.1","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"35adafec8b7afd717a2df1e28861209776b2f619","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.3.1.tgz","fileCount":49,"integrity":"sha512-YBqeF5Rz6Y8bdBOmsyQVJ4fR5hYtj3ehV7XQfAM/khNHf0bchyJCuWbx297ygSRCpbiBtK2/nuYZT4rvnzbzaA==","signatures":[{"sig":"MEQCIFZe92SVFwvZfOYe+yMJBM/l7PQ4PwP5Ws8CDAwUB9WvAiBGf4busJxWOaGam9flvZyVYKYkckkocZ/AhFKDxyMzBg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":441581},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"a5cfbbdccf32fb9f2193676459b8f82411da17e0","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js","test:patch-vite":"node scripts/test-patch-vite.js","test:react-detect":"node scripts/test-react-detect.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.3.1_1784990601134_0.795604043614583","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@ahmednawaz/crank","version":"0.3.2","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.3.2","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"d7113f87f03a3b2b24f6e35b92ee0d2fd7de395a","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.3.2.tgz","fileCount":49,"integrity":"sha512-cuNuq16+ZNpgmCe6bQ8/N0dgvKIPSHUk1XRIvs7vSenGj7uG6zlvwEoHIEVDP4sWLazPt+GOyo9vemYaynBWQg==","signatures":[{"sig":"MEUCIQCT1sxpBbWHfvTKROJK0+LvokwQdPalwjcBCItOzOSbgQIgZ1S01qBCs2m/7FV8+r3oviXPjW74yvagSAsRZ03c3sM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":441618},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./package.json":"./package.json"},"gitHead":"4fc850f7157853544557e712697d87e9d9c65584","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/prepare-publish.js","test:patch-vite":"node scripts/test-patch-vite.js","test:react-detect":"node scripts/test-react-detect.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.3.2_1784990650790_0.43731572678347397","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@ahmednawaz/crank","version":"0.3.3","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.3.3","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"eebef452f5b0096075f0bd712e0e0bcb53b80c4f","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.3.3.tgz","fileCount":50,"integrity":"sha512-f9yKSn0Re1lfQGk5BnTr+gCY2sAiGhuErnxdWveRCa9Ls4frk5Ck8b0E8UEN55+o8vWvrsV766YgNkDpW+rbNQ==","signatures":[{"sig":"MEUCIQDsrNV2UFoUwnGedW3c4JILXag9s7Vnrjcy77XSlzVVggIgJq58LPf4jfIbHKGGXkbzlAqYqtM8JBE3usEUTcxXZ10=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":600575},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./panel":"./panel-boot.mjs","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./panel-boot":"./panel-boot.mjs","./package.json":"./package.json"},"gitHead":"250e7ecc175320136402eadb1366397927d5139b","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","prepack":"node scripts/embed-panel.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","embed:panel":"node scripts/embed-panel.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/embed-panel.js && node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/embed-panel.js && node scripts/prepare-publish.js","test:patch-vite":"node scripts/test-patch-vite.js","test:react-detect":"node scripts/test-react-detect.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.3.3_1784991001157_0.3001703848716779","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@ahmednawaz/crank","version":"0.3.4","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.3.4","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"24a019d7c7caa18ffaf886aaf1f8ee344ffacd69","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.3.4.tgz","fileCount":50,"integrity":"sha512-V77qjAgorD0sTg8yfVpRiHgtPb3WRKpqGOsko2D3Xr4JVqQL/Gt+Dtrt360Vx+d8yguRnXNdy7k12k0wQazkHA==","signatures":[{"sig":"MEUCICSPOPv0cLSvg1BeWotuqleL+XUDxZmQGbfSvSQ/+vXMAiEAsn5H4BWg6s6RoPeN2qESKomz6rmS8tWi3FO7xX/+TuU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":603709},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./panel":"./panel-boot.mjs","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./panel-boot":"./panel-boot.mjs","./package.json":"./package.json"},"gitHead":"a5a49b0a6ec0cbb79e07e9f6b6dea60479b29d8b","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","crank":"node bin/crank.js","start":"node bin/crank.js","prepack":"node scripts/embed-panel.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","embed:panel":"node scripts/embed-panel.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/embed-panel.js && node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/embed-panel.js && node scripts/prepare-publish.js","test:patch-vite":"node scripts/test-patch-vite.js","test:react-detect":"node scripts/test-react-detect.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.3.4_1784991689447_0.5417071259106101","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@ahmednawaz/crank","version":"0.3.5","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.3.5","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"35252d5ec1eb93eb2f454e578726f95c4336e3fa","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.3.5.tgz","fileCount":51,"integrity":"sha512-w6ZUjY5sVim/sBtBQfIvO6EYghc7tS5l0d3iqJKntEhdLcqXqbTSc4oVGpD/Q4Os/dYlinLmt2c4KJDbPmfCeg==","signatures":[{"sig":"MEUCIQCzIZvbCp880YSmeMGcGaObDIVgOcGlIHVbPOSYd/AGFQIgDLaTBDuEuCUz/zu5CCjKxse9w0D1PRnFsem/cwph1VM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.3.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":608221},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./panel":"./panel-boot.mjs","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./panel-boot":"./panel-boot.mjs","./package.json":"./package.json"},"gitHead":"3731c874bbff897afa47f9c1e5d9e5334e78ff98","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","test":"npm run test:parse && npm run test:resolve && npm run test:patch-vite && npm run test:react-detect && npm run test:health-ws","crank":"node bin/crank.js","start":"node bin/crank.js","prepack":"node scripts/embed-panel.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","embed:panel":"node scripts/embed-panel.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/embed-panel.js && node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","test:health-ws":"node scripts/test-health-ws.js","prepare:publish":"node scripts/embed-panel.js && node scripts/prepare-publish.js","test:patch-vite":"node scripts/test-patch-vite.js","test:react-detect":"node scripts/test-react-detect.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.3.5_1784992934113_0.7593626847748367","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@ahmednawaz/crank","version":"0.3.6","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.3.6","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"42cc086e9a70ce46499e6e0e697e5416a2b7f217","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.3.6.tgz","fileCount":52,"integrity":"sha512-YhIHLdc9Sf5928QGpb2UjUj+/Fu8v3w0blUU6B7aqOtRmAY5J8F8fYoApsJC3iLsus+LYA3iJXP7lHQlSQUHBg==","signatures":[{"sig":"MEUCIQDN4V5EmCL5l7TKgh9ne2FBMCDLL1qeH5jWzsymuhE9yQIgcubDVHzkrfIZ4V+qpm2QF2JwKsndXCCBlhLdJHqo3xc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.3.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":612299},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./panel":"./panel-boot.mjs","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./panel-boot":"./panel-boot.mjs","./package.json":"./package.json"},"gitHead":"a345cb13656f59f5f7c3203ddde8326e34ad319c","scripts":{"mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","test":"npm run test:parse && npm run test:resolve && npm run test:patch-vite && npm run test:react-detect && npm run test:health-ws && npm run test:companion-url && npm run test:vite-ws","crank":"node bin/crank.js","start":"node bin/crank.js","prepack":"node scripts/embed-panel.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","test:parse":"node scripts/test-parse-options.js","embed:panel":"node scripts/embed-panel.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/embed-panel.js && node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","test:vite-ws":"node scripts/test-vite-ws-proxy.js","test:health-ws":"node scripts/test-health-ws.js","prepare:publish":"node scripts/embed-panel.js && node scripts/prepare-publish.js","test:patch-vite":"node scripts/test-patch-vite.js","test:react-detect":"node scripts/test-react-detect.js","test:companion-url":"node scripts/test-companion-url.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","http-proxy":"^1.18.1","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.4"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.3.6_1784993607901_0.4752799720337102","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@ahmednawaz/crank","version":"0.3.8","keywords":["crank","glean","mcp","copy","ux-writing","react"],"_id":"@ahmednawaz/crank@0.3.8","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"homepage":"https://github.com/ahmednawaz619/crank#readme","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"bin":{"crank":"bin/crank.js"},"dist":{"shasum":"855d0303de60d14bd24876e0b688db441d5e4c3a","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.3.8.tgz","fileCount":57,"integrity":"sha512-NVih7CqKvt14KFwxGY0PqjSig32WSp8OIWosE6zyQwoEcPXe9CJauWq8NyrLK2rdnYWmdHENr+orwcoZYEJ8RQ==","signatures":[{"sig":"MEUCIAQTEa656SpDhpPhHQppJrN0eV7+mIYo2CaMcYfv9u0DAiEAvvFRCXjupRP+YJcUE6Nh+ZOLZHq9rvzaTy+xR6LviPo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.3.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":903729},"main":"./react.js","types":"./react.d.ts","module":"./react.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./next":{"import":"./next.mjs","default":"./next.mjs","require":"./next.js"},"./vite":"./vite.js","./panel":"./panel-boot.mjs","./react":{"types":"./react.d.ts","import":"./react.mjs","default":"./react.mjs","require":"./react.js"},"./webpack":"./webpack.js","./panel-boot":"./panel-boot.mjs","./package.json":"./package.json"},"gitHead":"1770fcd4ca3d3e1f718e43096f41829286c47213","scripts":{"dev":"node scripts/dev-live.js","mcp":"npm run start --workspace=mcp-server","demo":"node scripts/demo-flow.js","test":"npm run test:parse && npm run test:copy-prompt && npm run test:resolve && npm run test:patch-vite && npm run test:react-detect && npm run test:health-ws && npm run test:companion-url && npm run test:vite-ws","crank":"node bin/crank.js","start":"node bin/crank.js","prepack":"node scripts/embed-panel.js","dev:demo":"node companion/server.js","mcp:http":"npm run start:http --workspace=mcp-server","companion":"npm run start --workspace=companion","dev:watch":"node scripts/watch-panel.js","dev:client":"npm run dev --prefix client","dev:preview":"CRANK_CHANNEL=preview node scripts/dev-live.js","embed:panel":"node scripts/embed-panel.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/embed-panel.js && node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","test:resolve":"node scripts/test-resolve-project.js","test:vite-ws":"node scripts/test-vite-ws-proxy.js","test:health-ws":"node scripts/test-health-ws.js","prepare:publish":"node scripts/embed-panel.js && node scripts/prepare-publish.js","publish:preview":"CRANK_CHANNEL=preview node scripts/embed-panel.js && node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --tag preview --access public","test:patch-vite":"node scripts/test-patch-vite.js","test:copy-prompt":"node scripts/test-copy-prompt.js","test:react-detect":"node scripts/test-react-detect.js","test:companion-url":"node scripts/test-companion-url.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"repository":{"url":"git+https://github.com/ahmednawaz619/crank.git","type":"git"},"workspaces":["companion","mcp-server"],"_npmVersion":"12.0.1","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ws":"^8.18.0","zod":"^3.24.2","cors":"^2.8.5","cheerio":"^1.0.0","express":"^4.21.2","http-proxy":"^1.18.1","@cursor/sdk":"^1.0.23","@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@modelcontextprotocol/sdk":"^1.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@ahmednawaz/crank":"^0.2.8"},"peerDependencies":{"next":">=13","react":">=17","html-webpack-plugin":">=5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"html-webpack-plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/crank_0.3.8_1785322401116_0.40427559515665346","host":"s3://npm-registry-packages-npm-production"}},"0.3.10":{"name":"@ahmednawaz/crank","version":"0.3.10","description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","repository":{"type":"git","url":"git+https://github.com/ahmednawaz619/crank.git"},"homepage":"https://github.com/ahmednawaz619/crank#readme","bin":{"crank":"bin/crank.js"},"main":"./react.js","module":"./react.mjs","types":"./react.d.ts","exports":{".":{"types":"./react.d.ts","import":"./react.mjs","require":"./react.js","default":"./react.mjs"},"./react":{"types":"./react.d.ts","import":"./react.mjs","require":"./react.js","default":"./react.mjs"},"./panel":"./panel-boot.mjs","./panel-boot":"./panel-boot.mjs","./next":{"import":"./next.mjs","require":"./next.js","default":"./next.mjs"},"./vite":"./vite.js","./webpack":"./webpack.js","./package.json":"./package.json"},"peerDependencies":{"html-webpack-plugin":">=5","next":">=13","react":">=17"},"peerDependenciesMeta":{"react":{"optional":true},"next":{"optional":true},"html-webpack-plugin":{"optional":true}},"workspaces":["companion","mcp-server"],"scripts":{"start":"node bin/crank.js","crank":"node bin/crank.js","companion":"npm run start --workspace=companion","mcp":"npm run start --workspace=mcp-server","mcp:http":"npm run start:http --workspace=mcp-server","dev":"node scripts/dev-live.js","dev:preview":"CRANK_CHANNEL=preview node scripts/dev-live.js","dev:client":"npm run dev --prefix client","dev:watch":"node scripts/watch-panel.js","demo":"node scripts/demo-flow.js","dev:demo":"node companion/server.js","test:parse":"node scripts/test-parse-options.js","test:copy-prompt":"node scripts/test-copy-prompt.js","test:upgrade":"node scripts/test-upgrade.js","test:resolve":"node scripts/test-resolve-project.js","prepare:publish":"node scripts/embed-panel.js && node scripts/prepare-publish.js","postinstall":"node lib/postinstall-consumer.js","verify:deps":"node scripts/verify-deps.js","publish:team":"node scripts/embed-panel.js && node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --access public","publish:preview":"CRANK_CHANNEL=preview node scripts/embed-panel.js && node scripts/prepare-publish.js && node scripts/verify-deps.js && npm publish --tag preview --access public","test:patch-vite":"node scripts/test-patch-vite.js","test:react-detect":"node scripts/test-react-detect.js","test:health-ws":"node scripts/test-health-ws.js","test:companion-url":"node scripts/test-companion-url.js","test:vite-ws":"node scripts/test-vite-ws-proxy.js","test":"npm run test:parse && npm run test:copy-prompt && npm run test:upgrade && npm run test:resolve && npm run test:patch-vite && npm run test:react-detect && npm run test:health-ws && npm run test:companion-url && npm run test:vite-ws","embed:panel":"node scripts/embed-panel.js","prepack":"node scripts/embed-panel.js"},"engines":{"node":">=18"},"dependencies":{"@babel/parser":"^7.28.0","@babel/traverse":"^7.28.0","@cursor/sdk":"^1.0.23","@modelcontextprotocol/sdk":"^1.12.1","cheerio":"^1.0.0","cors":"^2.8.5","express":"^4.21.2","http-proxy":"^1.18.1","ws":"^8.18.0","zod":"^3.24.2"},"publishConfig":{"access":"public"},"keywords":["crank","glean","mcp","copy","ux-writing","react"],"devDependencies":{"@ahmednawaz/crank":"^0.2.8"},"gitHead":"724df4bbc762fe024c1cd22b338c20f9846641c4","_id":"@ahmednawaz/crank@0.3.10","bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"_nodeVersion":"24.18.0","_npmVersion":"12.0.1","dist":{"integrity":"sha512-dVJbHFhwJqijS6tq9Aj+wsS5VLP09LvvomvdGYZpQ8TvP96KOUSy1P/YysmyPtRvsivlwFJebz+/9+iEBXg6PQ==","shasum":"1b6b844eea5b7a4fa41b403088675d08a1f32b15","tarball":"https://registry.npmjs.org/@ahmednawaz/crank/-/crank-0.3.10.tgz","fileCount":60,"unpackedSize":923913,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmednawaz%2fcrank@0.3.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGLlJ8nKPZHEciCmZGfbkj22cHUJN2WEuMcsO2b7rxdZAiEA+ZFKCfL9kkxzujp9UTl3uV0TXX+iVF7u84WGgssJgD4="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:34f624e7-b15a-4005-bd69-4fb88ec8021f"}},"directories":{},"maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/crank_0.3.10_1785336984883_0.8250072148544207"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-25T09:49:14.036Z","modified":"2026-07-29T14:56:25.429Z","0.1.2":"2026-07-25T09:49:14.398Z","0.1.5":"2026-07-25T10:11:05.006Z","0.1.6":"2026-07-25T10:28:36.894Z","0.1.7":"2026-07-25T10:34:01.310Z","0.1.8":"2026-07-25T10:42:28.025Z","0.1.9":"2026-07-25T10:52:06.612Z","0.2.0":"2026-07-25T11:00:22.808Z","0.2.2":"2026-07-25T11:06:59.596Z","0.2.3":"2026-07-25T11:15:40.896Z","0.2.4":"2026-07-25T11:21:33.229Z","0.2.5":"2026-07-25T11:25:23.522Z","0.2.6":"2026-07-25T11:31:19.140Z","0.2.7":"2026-07-25T11:33:52.367Z","0.2.8":"2026-07-25T11:40:12.760Z","0.3.0":"2026-07-25T11:43:27.187Z","0.3.1":"2026-07-25T14:43:21.310Z","0.3.2":"2026-07-25T14:44:10.934Z","0.3.3":"2026-07-25T14:50:01.342Z","0.3.4":"2026-07-25T15:01:29.584Z","0.3.5":"2026-07-25T15:22:14.264Z","0.3.6":"2026-07-25T15:33:28.063Z","0.3.8":"2026-07-29T10:53:21.270Z","0.3.10":"2026-07-29T14:56:25.062Z"},"bugs":{"url":"https://github.com/ahmednawaz619/crank/issues"},"homepage":"https://github.com/ahmednawaz619/crank#readme","keywords":["crank","glean","mcp","copy","ux-writing","react"],"repository":{"type":"git","url":"git+https://github.com/ahmednawaz619/crank.git"},"description":"Internal Motive UX copy iteration: select UI text → Glean variants → MCP apply. Cursor, Replit, Claude.","maintainers":[{"name":"ahmednawaz","email":"ahmed.nawaz@gomotive.com"}],"readme":"# Crank\n\nInternal Motive tool for **copy iteration on live UI panels**.\n\nSelect a `div` → send its text nodes to a **Glean** agent (skills/rules aware) → review 3–4 copy options → apply the chosen variant via **MCP** into whatever product the panel is running in.\n\nThis repo owns the **copy iteration** loop (select → Glean variants → MCP apply). CSS inspection lives in a separate tooling track if needed.\n\n---\n\n## Architecture\n\n```mermaid\nflowchart LR\n  subgraph Browser\n    Page[Product page / panel]\n    BM[Crank bookmarklet]\n    Page --> BM\n  end\n\n  subgraph Local_or_Hosted[\"Local or hosted bridge\"]\n    Comp[Companion :3344]\n    Store[(Selection store)]\n    GleanClient[Glean client]\n    Comp --> Store\n    Comp --> GleanClient\n  end\n\n  subgraph Agent_backends[\"Agent backends\"]\n    Glean[Glean agent API]\n    Skills[skills/ rules]\n    GleanClient --> Glean\n    Skills -.-> Glean\n  end\n\n  subgraph MCP_clients[\"MCP clients\"]\n    Cursor[Cursor / Claude Desktop]\n    Replit[Replit Agent]\n    MCP[Crank MCP server]\n    Cursor -->|stdio| MCP\n    Replit -->|HTTPS custom MCP| MCP\n    MCP -->|HTTP| Comp\n  end\n\n  BM -->|WS / HTTP selection| Comp\n  Comp -->|APPLY_VARIANT| BM\n  Glean -->|3–4 variants| Comp\n```\n\n### Flow\n\n1. **Select** — Bookmarklet hover/click picks a `div`, extracts text nodes (`path`, `role`, `text`), posts to companion `/api/selection`.\n2. **Propose** — Companion calls Glean (`glean-client.js`) with selection context. Stub returns deterministic variants when `GLEAN_STUB=true` (count = `CRANK_GLEAN_OPTION_COUNT`, default 3).\n3. **Review** — Variants appear in the bookmarklet panel and/or via MCP tool `propose_copy_variants`.\n4. **Apply** — Panel **Apply** (or MCP `apply_copy_variant`) updates live DOM **and** persists editable hardcoded literals via the bundled Crank `text-writer`. **Preview** is DOM-only.\n5. **Agent handoff (same chat)** — Panel **Agent** queues structured pending changes for MCP pull and copies a short phrase (`Apply the pending Crank change`) to the clipboard. Paste that phrase in your **current** Cursor chat (or keep an agent session that already has the `crank-apply-changes` skill). The agent calls `crank_get_formatted_changes` → edits source → `crank_clear_changes`. Optional secondary: **Open new chat instead** uses a `cursor://…/prompt` deeplink (opens a *new* prefilled chat — not the same Composer).\n\n**There is no silent push into the IDE chat panel.** Cursor has no public “append to current Composer” API. MCP is pull-only (the agent calls tools). Prompt deeplinks always require user confirm ([docs](https://cursor.com/docs/reference/deeplinks): “never trigger automatic execution”) and open a new chat. Community workarounds (`composer.newAgentChat` + clipboard paste) also start a new chat — Crank does not ship those as primary. A background run via Cursor SDK / CLI (`Agent.prompt`, `agent -p`) is a separate agent — not the Composer chat — and needs `CURSOR_API_KEY`.\n\n---\n\n## Quick start (one command — Retune-style)\n\nFrom your **app repo root** (Replit, Cursor terminal, or Codespaces — no paths):\n\n```bash\nnpx @ahmednawaz/crank setup   # once: MCP + skill (Retune-style, global ~/.cursor + ~/.claude)\nnpx @ahmednawaz/crank         # local: companion + dev when present\nnpx @ahmednawaz/crank start   # Replit Workflow: companion + HTTP MCP only\n```\n\nSetup auto-installs MCP config and `crank-apply-changes` skill — **no manual skill copy or MCP JSON editing** (same model as Retune). Reload MCP in your IDE once after first setup.\n\nMCP config uses **`npx -y crank mcp`** (like Retune) — no absolute paths. After setup, `crank` is added to `devDependencies` so virtual environments resolve it automatically.\n\n**Agent chat:** paste `Apply the pending Crank change` or ask the agent to run `npx crank`. The agent should call **`crank_get_environment`** first to learn which repo and URLs are active.\n\nThat automatically:\n\n1. **Detects** your app directory (`app/`, `client/`, `web/`, or repo root — same heuristics as Retune)\n2. **Inits** MCP for Cursor / VS Code / Claude + installs the skill\n3. **Starts** companion + `npm run dev` when a dev script exists\n4. **Writes** `.crank/runtime.json` with public URLs for the panel loader\n\n| Environment | Agent MCP | Panel |\n|-------------|-----------|-------|\n| **Cursor / Claude / VS Code** | `npx crank mcp` (stdio) | Vite auto-inject or bookmarklet |\n| **Replit Agent** | HTTPS `/mcp` from `crank_get_environment` | Webview + bookmarklet |\n\nStop local daemon: `npx crank stop`\n\n### UI + text dispatch (bundled)\n\nNo external sibling tool required. Crank ships:\n\n- **tool-ui CSS** — `/ui/crank-ui.css`\n- **control helpers** — `/ui/crank-ui-helpers.js` (buttons, fields, textareas)\n- **hardcoded vs dynamic/bound** — `/ui/text-source.js` (`classifyTextSource`)\n- **DOM preview** — Preview / Discard (`PREVIEW_TEXT_CHANGE`)\n- **source save** — Save source (`SAVE_TEXT_CHANGE` → bundled `companion/text-writer.js`)\n- Locked nodes show a badge + reason and cannot be edited in-panel\n\nOptional: `CRANK_ASSET_ROOT` overrides where packaged UI assets are loaded from (defaults to this install).\n\n### Panel injection (Retune-style)\n\n```bash\nnpx @ahmednawaz/crank@latest setup\nnpx @ahmednawaz/crank inject    # patches main.tsx — no manual edits\nnpx @ahmednawaz/crank start\n```\n\n`inject` installs the package and adds `import { Crank }` + `<Crank />` (Sentry/Clerk-style).\n\nReplit public URL: `window.__CRANK_URL__` or `<Crank companionUrl=\"https://3344-….replit.dev\" />` or `VITE_CRANK_URL`.\n\nUseful variants:\n\n```bash\nnpx crank init          # write configs only\nnpx crank start --daemon --no-open   # durable companion\nnpx crank --dev         # also runs npm run dev\nnpx crank --http-mcp    # force remote MCP (Replit-style)\nnpx crank doctor        # print detected environment\nnpx crank stop          # stop daemon\n```\n\n---\n\n## Manual companion-only start\n\n```bash\ncd ~/Downloads/crank\ncp .env.example .env   # if needed\nnpm install\nnode bin/crank.js start --daemon --no-open\n```\n\nOpen `http://127.0.0.1:3344`, drag the **Crank** bookmarklet to the bookmarks bar, open any page, click the bookmarklet → **Select** → **Ask Glean**.\n\nStub demo without a browser (companion must be running):\n\n```bash\nnpm run demo\n```\n\n### MCP (Cursor / Claude Desktop)\n\nCompanion must be running. Add to MCP config:\n\n```json\n{\n  \"mcpServers\": {\n    \"crank\": {\n      \"command\": \"node\",\n      \"args\": [\"~/Downloads/crank/mcp-server/index.js\"],\n      \"env\": {\n        \"CRANK_COMPANION_URL\": \"http://127.0.0.1:3344\",\n        \"CRANK_MCP_MODE\": \"stdio\"\n      }\n    }\n  }\n}\n```\n\nTools:\n\n| Tool | Purpose |\n|------|---------|\n| `get_selected_copy` | Read active selection + text nodes |\n| `propose_copy_variants` | Call Glean for 3–4 iterations |\n| `apply_copy_variant` | DOM apply + source persist (set `persist:false` for preview) |\n| `apply_custom_copy` | Apply agent-edited `nodes[]` (DOM) |\n| `crank_get_formatted_changes` | Agent-ready markdown for pending Agent-button changes (Retune-style) |\n| `crank_get_pending_changes` | Structured JSON diffs for pending changes |\n| `crank_watch_changes` | Long-poll until pending changes appear |\n| `crank_clear_changes` | Clear pending after apply |\n| `crank_status` | Whether anything is queued |\n| `get_pending_agent_prompt` | Legacy: read full queued prompt |\n| `ack_pending_agent_prompt` | Legacy: clear pending after applying |\n| `queue_agent_prompt` | Queue a variant for Cursor (same as **Agent**) |\n\n### MCP (HTTP / Replit)\n\n```bash\nCRANK_MCP_MODE=http CRANK_MCP_HTTP_PORT=3345 npm run mcp:http\n```\n\nExpose `https://…/mcp` (tunnel or hosted) and add as a **custom MCP server** in Replit Integrations. Optional auth: set `CRANK_MCP_API_KEY` and pass `X-API-Key` in Replit advanced headers.\n\n---\n\n## Glean integration\n\nUses Motive Client API against `https://motive-prod-be.glean.com`.\n\nDefault agent: **Robot Content Designer** (`a866095fd53b419ab08338e3559fb7aa`) — generates + scores UX string options.\n\nEnv vars (see `.env.example`; secrets live in `.env`, gitignored):\n\n| Variable | Role |\n|----------|------|\n| `GLEAN_BASE_URL` | Instance backend, e.g. `https://motive-prod-be.glean.com` |\n| `GLEAN_API_KEY` | Client API bearer token |\n| `GLEAN_AGENT_ID` | Agent Builder id (default = Robot Content Designer) |\n| `GLEAN_ACT_AS` | Optional; required for global tokens |\n| `GLEAN_STUB` | `true` = local stub variants; `false` = live agent |\n| `CRANK_GLEAN_OPTION_COUNT` | Max options to request/parse (default **3**; was 4, was 6) |\n| `GLEAN_USE_STREAM` | `true` = live SSE progress (same latency as `/runs/wait`) |\n| `GLEAN_AGENT_TIMEOUT_MS` | Overall cap (default 5 min) |\n\n**Latency:** Robot Content Designer typically takes **1–2 minutes** end-to-end. Most of that is inherent agent runtime (~55–90s silent phase before tokens). Stream vs wait does not materially change total time — stream only adds live progress UI. Set `GLEAN_STUB=true` for instant local dev.\n\nLive path: `POST /rest/api/v1/agents/runs/stream` (preferred) or `/runs/wait` with the agent’s form fields. Companion parses Option N / Heading / Body / CTA from the agent markdown into `variants[]` for the panel + MCP.\n\n---\n\n## Replit MCP conclusion\n\n**Replit Agent can consume MCP natively** — no browser extension is required for MCP itself.\n\nFindings (as of Dec 2025 / docs current through 2026):\n\n- Replit Agent supports the Model Context Protocol as a **client**: curated one-click servers plus **custom remote MCP servers** by HTTPS URL ([Connect via MCP](https://docs.replit.com/build/connect-via-mcp), [changelog 2025-12-12](https://docs.replit.com/updates/2025/12/12/changelog)).\n- Custom servers are added under Integrations → MCP Servers → **Add MCP server** with an HTTPS endpoint; optional custom headers (e.g. `X-API-Key`) for static tokens ([MCP list / auth](https://docs.replit.com/references/mcp/overview)).\n- Traffic is scanned by Replit’s security layer before tools run.\n- Replit needs a **network-reachable HTTPS** MCP endpoint. Local `stdio` MCP (Cursor-style) does **not** work for Replit. Host Crank MCP with `CRANK_MCP_MODE=http` behind HTTPS (or a tunnel).\n\n**What still needs a browser-side hook in Replit:**\n\n| Concern | Native MCP? | What you need |\n|---------|-------------|----------------|\n| Agent calling `get_selected_copy` / `apply_copy_variant` | Yes (remote HTTPS MCP) | Hosted `mcp-server` |\n| User selecting a `div` inside a Replit webview/preview | No | Bookmarklet (or a small content-script extension) injected into that page, talking to companion |\n| Companion selection store on laptop localhost | Not reachable from Replit cloud | Host companion + MCP together, or tunnel both |\n\n**Bottom line:** Replit does **not** need an extension for MCP. It **does** need (1) a remote HTTPS Crank MCP, and (2) something in the page (bookmarklet/extension) to capture the selection — same as local Cursor workflows.\n\n---\n\n## Repo layout\n\n```text\ncrank/\n├── bin/crank.js          # CLI: init, start --daemon, stop, status\n├── bookmarklet/          # Div picker + text extract + panel\n├── companion/            # Express + WebSocket bridge + Glean client\n├── mcp-server/           # MCP tools (stdio + HTTP)\n├── skills/               # Copy rules sent to / used by Glean\n├── scripts/demo-flow.js  # Curl-less E2E stub demo\n├── .env.example\n└── README.md\n```\n\n---\n\n## Architecture notes\n\n| Area | Approach |\n|------|----------|\n| Element picker (highlight, click, Esc) | Companion bookmarklet inspect |\n| Companion Express + WS on fixed port | `companion/server.js` |\n| Text node write-back | Bundled `companion/text-writer.js` (HTML + JS/TS literals) |\n| Glean client + skills/ | Crank-owned |\n| MCP tool surface | Crank-owned |\n| Panel UI CSS / helpers | Bundled `bookmarklet/crank-ui.css` + helpers |\n\n---\n\n## Key next steps (real Glean + product wiring)\n\n1. Drop real `GLEAN_API_KEY` / `GLEAN_AGENT_ID`; set `GLEAN_STUB=false`.\n2. Align request/response schema in `companion/glean-client.js` with the Motive Glean agent contract.\n3. Point Glean at `skills/` (or sync rules into Glean’s skill store).\n4. Confirm Apply persists via bundled text-writer when the panel maps to a known project root (`CRANK_PROJECT_ROOT`).\n5. For Replit: deploy companion + MCP HTTP behind HTTPS; document the Integrations URL + `X-API-Key`.\n6. Harden MCP HTTP to the official Streamable HTTP transport if Replit’s client requires it beyond JSON-RPC `/mcp`.\n\n---\n\n## Status\n\nInternal scaffold — runnable stubs. Not a production Motive service yet.\n","readmeFilename":"README.md"}