{"_id":"@ruvnet/ruview","_rev":"12-e133a799c03063730a7d4e0d27cf6a32","name":"@ruvnet/ruview","dist-tags":{"latest":"0.9.3"},"versions":{"0.1.0":{"name":"@ruvnet/ruview","version":"0.1.0","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.1.0","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview":"bin/cli.js"},"dist":{"shasum":"97099e5d7a41553928c12c5bbc36c42e194faa5c","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.1.0.tgz","fileCount":21,"integrity":"sha512-sawzc+kqfN0jsWiXbQvZ2+D4FZ29TAMJZI7VSj1QrUa02e+YSTaxIBeL9fKN7/CwH3i/jti7zFn+OzVOn56T1Q==","signatures":[{"sig":"MEYCIQCUHXrYN0rGSylvwetQCIYK2r/WyaiIfV1oGZfeBwnc5gIhAMbzKYPqxITha1R/7pjVjAeJU56UXNt3vrfMlljLH34M","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49503},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./guardrails":"./src/guardrails.js"},"gitHead":"32b1bc35af5cc0a52fe4413221e6aa680e115120","scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"11.10.0","description":"RuView WiFi-sensing operator agent harness — onboard, calibrate, train, and verify camera-free WiFi-CSI sensing, with the project's MEASURED-vs-CLAIMED honesty guardrail enforced. Minted via metaharness (ADR-182).","directories":{},"_nodeVersion":"24.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@metaharness/kernel":"^0.1.0","@metaharness/host-claude-code":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ruview_0.1.0_1781731295019_0.5499810377945882","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@ruvnet/ruview","version":"0.2.0","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.2.0","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview":"bin/cli.js"},"dist":{"shasum":"d658d3288793ec70f51431acb1fe06617e949610","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.2.0.tgz","fileCount":21,"integrity":"sha512-bd/52yilWhx2ujkkD68oAKKPYoiH/NxUUIK3Z1wa97Er/C4unJlVJ/2Zp/GyTBSj2TJ6tPzN1P6V6c55hBscvQ==","signatures":[{"sig":"MEQCIFX+Y5BHwnWNv0nbLFHNT3AXoT/emlW1TzvIE/Jjl8ZtAiBFLMIFYpRzofMXUeI7P8ZMlFmdeSbB7XkrT13u9XC4gg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57567},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./guardrails":"./src/guardrails.js"},"scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs","sync-skills":"node ./scripts/sync-skills.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"10.9.8","description":"RuView WiFi-sensing operator agent harness — onboard, calibrate, train, and verify camera-free WiFi-CSI sensing, with the project's MEASURED-vs-CLAIMED honesty guardrail enforced. Minted via metaharness (ADR-182).","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ruview_0.2.0_1783001088526_0.5018985899247044","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@ruvnet/ruview","version":"0.3.0","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.3.0","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview":"bin/cli.js"},"dist":{"shasum":"28b8ea2232bf346894d12133ff68d5370bc0f40c","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.3.0.tgz","fileCount":42,"integrity":"sha512-GJQ9XeIx3OIAYAqhM1DHjY0YPf8ygVB81UckSjVFLeAKm1ABe9HBoLJXMKDCPBILfqjrqE1xD7d4XCuOKGtE5Q==","signatures":[{"sig":"MEQCIFncfFY8YH3L1DpOBUg1a8Ile4T+OLm7eBVbr0vERkE1AiB/UFpZ034LThARLjeDiNFqwwfd7gqqoQOcjlTIhq8k6g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ruvnet%2fruview@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":102700},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./brain":"./src/brain.js","./hosts":"./src/hosts/index.js","./guardrails":"./src/guardrails.js"},"gitHead":"2b7853b18f3eae44febfc64b430b7d1c51f986e8","scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs && node ./scripts/update-manifest.mjs --quiet && node ./scripts/verify-manifest.mjs --quiet","sync-skills":"node ./scripts/sync-skills.mjs","brain:verify":"node ./bin/cli.js brain verify","flywheel:plan":"node ./flywheel/run.mjs --dry-run","test:security":"node --test test/hosts.test.mjs test/brain.test.mjs test/policy.test.mjs","prepublishOnly":"npm test && node ./scripts/verify-manifest.mjs","flywheel:verify":"node ./flywheel/replay.mjs --self-test","manifest:update":"node ./scripts/update-manifest.mjs","manifest:verify":"node ./scripts/verify-manifest.mjs"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"10.8.2","description":"RuView WiFi-sensing operator agent harness — onboard, calibrate, train, and verify camera-free WiFi-CSI sensing, with the project's MEASURED-vs-CLAIMED honesty guardrail enforced. Minted via metaharness (ADR-182).","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"metaharness":"0.4.1","@metaharness/darwin":"0.8.0","@metaharness/flywheel":"0.1.7"},"_npmOperationalInternal":{"tmp":"tmp/ruview_0.3.0_1785297556363_0.7909456267354364","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@ruvnet/ruview","version":"0.3.1","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.3.1","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview":"bin/cli.js"},"dist":{"shasum":"e26db10a1eae7150df7c3e1749c52525fc566f4e","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.3.1.tgz","fileCount":43,"integrity":"sha512-Xxo86iV02xs8kJe3BU5osEwZZegsm/X+XvR7lByefSghabFCwoEpFP4NpQN6HyPMXuG4ydwoT81LQQMHNnSBOg==","signatures":[{"sig":"MEUCIQCT/AUDhbQoTBi91D4gjtdNj3A3y4HV/zAwy57u742gqQIgBHhUHIzmkSV7fLsEVzZk17oOdMILtoSUn1kemxPurGU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ruvnet%2fruview@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":125300},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./brain":"./src/brain.js","./hosts":"./src/hosts/index.js","./guidance":"./src/guidance.js","./guardrails":"./src/guardrails.js"},"gitHead":"a34bfc246e0642745c7142efd8655a84836c7e72","scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs && node ./scripts/update-manifest.mjs --quiet && node ./scripts/verify-manifest.mjs --quiet","sync-skills":"node ./scripts/sync-skills.mjs","brain:verify":"node ./bin/cli.js brain verify","flywheel:plan":"node ./flywheel/run.mjs --dry-run","test:security":"node --test test/hosts.test.mjs test/brain.test.mjs test/policy.test.mjs","prepublishOnly":"npm test && node ./scripts/verify-manifest.mjs","flywheel:verify":"node ./flywheel/replay.mjs --self-test","manifest:update":"node ./scripts/update-manifest.mjs","manifest:verify":"node ./scripts/verify-manifest.mjs"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"10.8.2","description":"RuView WiFi-sensing operator agent harness — onboard, calibrate, train, and verify camera-free WiFi-CSI sensing, with the project's MEASURED-vs-CLAIMED honesty guardrail enforced. Minted via metaharness (ADR-182).","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"metaharness":"0.4.1","@metaharness/darwin":"0.8.0","@metaharness/flywheel":"0.1.7"},"_npmOperationalInternal":{"tmp":"tmp/ruview_0.3.1_1785303256279_0.8340748336727415","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@ruvnet/ruview","version":"0.4.0","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence","cognitum-spaces","oauth"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.4.0","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview":"bin/cli.js"},"dist":{"shasum":"983827edde98788a6dedef4a51cc349cff24c9bf","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.4.0.tgz","fileCount":46,"integrity":"sha512-+3QeRlenw6rOchnJBe4g/OZ0/ut07YBqanBhgx65VmvOfry9hffNS5Ctp7rfNc08qutjtzI115xK8cwMgeUrDQ==","signatures":[{"sig":"MEYCIQD54SJkhKSNsx0C7sx2A3RihKxd4cWXtrPTTPeD+p23zgIhANA61SZAyTtabRRIDg+8uVaQc4hAKFGO1qUHovATGRME","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ruvnet%2fruview@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":142589},"type":"module","_from":"file:/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.4.0.tgz","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./brain":"./src/brain.js","./hosts":"./src/hosts/index.js","./guidance":"./src/guidance.js","./guardrails":"./src/guardrails.js"},"scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs && node ./scripts/update-manifest.mjs --quiet && node ./scripts/verify-manifest.mjs --quiet","sync-skills":"node ./scripts/sync-skills.mjs","brain:verify":"node ./bin/cli.js brain verify","flywheel:plan":"node ./flywheel/run.mjs --dry-run","test:security":"node --test test/hosts.test.mjs test/brain.test.mjs test/policy.test.mjs test/spaces.test.mjs","prepublishOnly":"npm test && node ./scripts/verify-manifest.mjs","flywheel:verify":"node ./flywheel/replay.mjs --self-test","manifest:update":"node ./scripts/update-manifest.mjs","manifest:verify":"node ./scripts/verify-manifest.mjs"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"_resolved":"/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.4.0.tgz","_integrity":"sha512-+3QeRlenw6rOchnJBe4g/OZ0/ut07YBqanBhgx65VmvOfry9hffNS5Ctp7rfNc08qutjtzI115xK8cwMgeUrDQ==","repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"11.17.0","description":"RuView WiFi-sensing operator harness — onboard, calibrate, verify, enforce evidence guardrails, and read Cognitum Spaces through explicitly granted OAuth.","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"metaharness":"0.4.1","@metaharness/darwin":"0.8.0","@metaharness/flywheel":"0.1.7"},"_npmOperationalInternal":{"tmp":"tmp/ruview_0.4.0_1787110521552_0.976080201202842","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@ruvnet/ruview","version":"0.5.0","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence","cognitum-spaces","oauth"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.5.0","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview":"bin/cli.js"},"dist":{"shasum":"22b39c323f86786658149b9a5bb342259893da1d","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.5.0.tgz","fileCount":46,"integrity":"sha512-Vw/bZ+ZMkRS//x5lDGjQaj97LKLvmzWV1gAMAPUnPIxeqvwI0Q+9Mrvz/BnBTyD0auhks5JKc0qApsg/KZ7REg==","signatures":[{"sig":"MEYCIQC58o8InxOpSGHwUmUb+3TWl6VACsq1Sx+awRvisJh1WAIhAM6zTeIT8hDosd9ilQuJl8eOr6ZUopFpbYfHL+bWJMbu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ruvnet%2fruview@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":149626},"type":"module","_from":"file:/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.5.0.tgz","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./brain":"./src/brain.js","./hosts":"./src/hosts/index.js","./guidance":"./src/guidance.js","./guardrails":"./src/guardrails.js"},"scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs && node ./scripts/update-manifest.mjs --quiet && node ./scripts/verify-manifest.mjs --quiet","sync-skills":"node ./scripts/sync-skills.mjs","brain:verify":"node ./bin/cli.js brain verify","flywheel:plan":"node ./flywheel/run.mjs --dry-run","test:security":"node --test test/hosts.test.mjs test/brain.test.mjs test/policy.test.mjs test/spaces.test.mjs","prepublishOnly":"npm test && node ./scripts/verify-manifest.mjs","flywheel:verify":"node ./flywheel/replay.mjs --self-test","manifest:update":"node ./scripts/update-manifest.mjs","manifest:verify":"node ./scripts/verify-manifest.mjs"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"_resolved":"/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.5.0.tgz","_integrity":"sha512-Vw/bZ+ZMkRS//x5lDGjQaj97LKLvmzWV1gAMAPUnPIxeqvwI0Q+9Mrvz/BnBTyD0auhks5JKc0qApsg/KZ7REg==","repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"11.17.0","description":"RuView WiFi-sensing operator harness — onboard, calibrate, verify, enforce evidence guardrails, and read Cognitum Spaces through explicitly granted OAuth.","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"metaharness":"0.4.1","@metaharness/darwin":"0.8.0","@metaharness/flywheel":"0.1.7"},"_npmOperationalInternal":{"tmp":"tmp/ruview_0.5.0_1787163347163_0.9217323720694313","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@ruvnet/ruview","version":"0.5.1","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence","cognitum-spaces","oauth"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.5.1","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview":"bin/cli.js"},"dist":{"shasum":"7aa6324c0459576365abf45685444ea3975241df","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.5.1.tgz","fileCount":46,"integrity":"sha512-nqI58KtR5Pm2LgFN3PPxHgOtCDl6W3oI6Ul1w4eI7ukYibsSWmZlhXOP8TvxDFZlnISfJfXuUydESEttIkR+xQ==","signatures":[{"sig":"MEYCIQDwVMtGUFCZh+jabLBzFXd1nfdhEqVAqts8Pvg3U1bvmgIhANvjKMDtVhqYtjzCoeXKy48aflEskwp3pi7q0NVw9zmZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ruvnet%2fruview@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":149656},"type":"module","_from":"file:/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.5.1.tgz","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./brain":"./src/brain.js","./hosts":"./src/hosts/index.js","./guidance":"./src/guidance.js","./guardrails":"./src/guardrails.js"},"scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs && node ./scripts/update-manifest.mjs --quiet && node ./scripts/verify-manifest.mjs --quiet","sync-skills":"node ./scripts/sync-skills.mjs","brain:verify":"node ./bin/cli.js brain verify","flywheel:plan":"node ./flywheel/run.mjs --dry-run","test:security":"node --test test/hosts.test.mjs test/brain.test.mjs test/policy.test.mjs test/spaces.test.mjs","prepublishOnly":"npm test && node ./scripts/verify-manifest.mjs","flywheel:verify":"node ./flywheel/replay.mjs --self-test","manifest:update":"node ./scripts/update-manifest.mjs","manifest:verify":"node ./scripts/verify-manifest.mjs"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"_resolved":"/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.5.1.tgz","_integrity":"sha512-nqI58KtR5Pm2LgFN3PPxHgOtCDl6W3oI6Ul1w4eI7ukYibsSWmZlhXOP8TvxDFZlnISfJfXuUydESEttIkR+xQ==","repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"11.17.0","description":"RuView WiFi-sensing operator harness — onboard, calibrate, verify, enforce evidence guardrails, and read Cognitum Spaces through explicitly granted OAuth.","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"metaharness":"0.4.1","@metaharness/darwin":"0.8.0","@metaharness/flywheel":"0.1.7"},"_npmOperationalInternal":{"tmp":"tmp/ruview_0.5.1_1787165606000_0.20077138037597453","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@ruvnet/ruview","version":"0.8.0","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence","cognitum-spaces","oauth","firmware-flashing","esptool","sdk","model-training","mmwave","lidar","rplidar","mr60bha2","ld2410","ssh"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.8.0","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview-harness":"bin/cli.js"},"dist":{"shasum":"f8b72cdb3a89d08b44620d31b6236a7e9bbc0e21","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.8.0.tgz","fileCount":66,"integrity":"sha512-RtvQ5vkGarOSUAh9Ne7yJTxcuWyw/PxJZoyhTuM+WnRPa85U5NoTwmdof6jIsOKq5rBSG6K96+/upLh/MbiUdg==","signatures":[{"sig":"MEYCIQDO+jgm8K8UF2aXhvoKGRJn+XukbpK6W2skD5zOcPDcvQIhAMj1tVCVLyuFxfFIJRmIu8NlLio33b1QLQBZsJTeoxfo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD6DF83CJpHqpksdgAqG4X3L1sFM3Ehrf+L3O2rLb5IiwIgALy+sNQm0tgodaaan7st8P0XrS3aDKerQbTUHmT4PhY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":359805},"type":"module","_from":"file:ruvnet-ruview-0.8.0.tgz","types":"./src/sdk.d.ts","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./ui":"./src/ui/console-widget.js","./cli":"./src/cli.js","./mcp":"./src/mcp-server.js","./sdk":{"types":"./src/sdk.d.ts","default":"./src/sdk.js"},"./brain":"./src/brain.js","./hosts":"./src/hosts/index.js","./cli-ui":"./src/cli-ui.js","./doctor":"./src/doctor.js","./kernel":"./src/kernel.js","./remote":"./src/remote.js","./devices":"./src/devices/registry.js","./esphome":"./src/devices/esphome.js","./firmware":"./src/firmware.js","./guidance":"./src/guidance.js","./mcp-http":"./src/mcp-http.js","./training":"./src/training.js","./guardrails":"./src/guardrails.js"},"scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs && node ./scripts/update-manifest.mjs --quiet && node ./scripts/verify-manifest.mjs --quiet","sync-skills":"node ./scripts/sync-skills.mjs","brain:verify":"node ./bin/cli.js brain verify","flywheel:plan":"node ./flywheel/run.mjs --dry-run","test:security":"node --test test/hosts.test.mjs test/brain.test.mjs test/policy.test.mjs test/spaces.test.mjs test/kernel.test.mjs test/firmware.test.mjs test/training.test.mjs test/devices.test.mjs test/csi-nodes.test.mjs test/remote.test.mjs test/mcp-apps.test.mjs test/cli-ui.test.mjs test/esphome.test.mjs","prepublishOnly":"npm test && node ./scripts/verify-manifest.mjs","flywheel:verify":"node ./flywheel/replay.mjs --self-test","manifest:update":"node ./scripts/update-manifest.mjs","manifest:verify":"node ./scripts/verify-manifest.mjs","test:e2e:devices":"node --test test/e2e/devices.e2e.mjs"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"_resolved":"C:\\Users\\ruv\\AppData\\Local\\Temp\\claude\\C--Users-ruv-Projects-wifi-densepose\\71544988-5fb4-404b-b2db-f92a81db17ca\\scratchpad\\tarballs\\ruvnet-ruview-0.8.0.tgz","_integrity":"sha512-RtvQ5vkGarOSUAh9Ne7yJTxcuWyw/PxJZoyhTuM+WnRPa85U5NoTwmdof6jIsOKq5rBSG6K96+/upLh/MbiUdg==","repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"11.10.0","description":"RuView WiFi-sensing operator harness — CLI, MCP server, and SDK for host device access (ESP32 CSI nodes, 60/24 GHz mmWave, LiDAR), SSH remote hosts, diagnostics, verified ESP32 flashing, evidence-gated training, calibration, and Cognitum Spaces.","directories":{},"_nodeVersion":"24.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"metaharness":"0.4.1","@metaharness/darwin":"0.8.0","@metaharness/flywheel":"0.1.7"},"peerDependencies":{"@ruvnet/ruview-kernel":">=0.1.0"},"peerDependenciesMeta":{"@ruvnet/ruview-kernel":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ruview_0.8.0_1790886828317_0.30576454074058823","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@ruvnet/ruview","version":"0.9.0","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence","cognitum-spaces","oauth","firmware-flashing","esptool","sdk","model-training","mmwave","lidar","rplidar","mr60bha2","ld2410","ssh"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.9.0","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview-harness":"bin/cli.js"},"dist":{"shasum":"c22ed003345aa22af36c5511a64bd81d665ed94f","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.9.0.tgz","fileCount":69,"integrity":"sha512-CLktSPWV55sS61P3ouupfSCYlyVqgoZ63hDjVcwXgtmWzC5KYdN44siP6CbJ0LQaXXNgAOsYczFSO7wIyLvpyA==","signatures":[{"sig":"MEYCIQC5gwjf27+ddnFGnNNCLWxAn2ackPBJiuVgjkCNHvz9owIhANKPveDxnqh2kMYHk0AWcrEmUtYLWWRSJUGJXO1JKqCd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCx/QQmJGSwigMU1wBBPocWVjAcyqug5WbEtLs7SGid0QIgAv9jss3OmPj+YSdxD30TCVIs6PO73xVR0aOn35VpEBI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":374761},"type":"module","_from":"file:ruvnet-ruview-0.9.0.tgz","types":"./src/sdk.d.ts","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./ui":"./src/ui/console-widget.js","./cli":"./src/cli.js","./mcp":"./src/mcp-server.js","./sdk":{"types":"./src/sdk.d.ts","default":"./src/sdk.js"},"./brain":"./src/brain.js","./hosts":"./src/hosts/index.js","./cli-ui":"./src/cli-ui.js","./doctor":"./src/doctor.js","./kernel":"./src/kernel.js","./remote":"./src/remote.js","./devices":"./src/devices/registry.js","./esphome":"./src/devices/esphome.js","./firmware":"./src/firmware.js","./guidance":"./src/guidance.js","./mcp-http":"./src/mcp-http.js","./training":"./src/training.js","./guardrails":"./src/guardrails.js"},"scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs && node ./scripts/update-manifest.mjs --quiet && node ./scripts/verify-manifest.mjs --quiet","sync-skills":"node ./scripts/sync-skills.mjs","brain:verify":"node ./bin/cli.js brain verify","flywheel:plan":"node ./flywheel/run.mjs --dry-run","test:security":"node --test test/hosts.test.mjs test/brain.test.mjs test/policy.test.mjs test/spaces.test.mjs test/kernel.test.mjs test/firmware.test.mjs test/training.test.mjs test/devices.test.mjs test/csi-nodes.test.mjs test/remote.test.mjs test/mcp-apps.test.mjs test/cli-ui.test.mjs test/esphome.test.mjs","prepublishOnly":"npm test && node ./scripts/verify-manifest.mjs","flywheel:verify":"node ./flywheel/replay.mjs --self-test","manifest:update":"node ./scripts/update-manifest.mjs","manifest:verify":"node ./scripts/verify-manifest.mjs","test:e2e:devices":"node --test test/e2e/devices.e2e.mjs"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"_resolved":"C:\\Users\\ruv\\AppData\\Local\\Temp\\claude\\C--Users-ruv-Projects-wifi-densepose\\71544988-5fb4-404b-b2db-f92a81db17ca\\scratchpad\\modsmoke\\ruvnet-ruview-0.9.0.tgz","_integrity":"sha512-CLktSPWV55sS61P3ouupfSCYlyVqgoZ63hDjVcwXgtmWzC5KYdN44siP6CbJ0LQaXXNgAOsYczFSO7wIyLvpyA==","repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"11.10.0","description":"RuView WiFi-sensing operator harness — CLI, MCP server, and SDK for host device access (ESP32 CSI nodes, 60/24 GHz mmWave, LiDAR), SSH remote hosts, diagnostics, verified ESP32 flashing, evidence-gated training, calibration, and Cognitum Spaces.","directories":{},"_nodeVersion":"24.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"metaharness":"0.4.1","@metaharness/darwin":"0.8.0","@metaharness/flywheel":"0.1.7"},"peerDependencies":{"@ruvnet/ruview-kernel":">=0.1.0"},"peerDependenciesMeta":{"@ruvnet/ruview-kernel":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ruview_0.9.0_1790889862980_0.9638724001584105","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@ruvnet/ruview","version":"0.9.1","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence","cognitum-spaces","oauth","firmware-flashing","esptool","sdk","model-training","mmwave","lidar","rplidar","mr60bha2","ld2410","ssh"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.9.1","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview-harness":"bin/cli.js"},"dist":{"shasum":"cdc4b3747b183bf2031c289c2a6c8a3fbe5e9943","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.9.1.tgz","fileCount":73,"integrity":"sha512-uq2ifd31UPhob7NnHt0st9cUWaSvi+ZAcSCalX7+VCQnV12CCnMseYq3e1GtgQ/DKPwDFtXYRC4KseHkIXVsiQ==","signatures":[{"sig":"MEYCIQDi3oOPx6bjzldrx/tob/EI+2SwHRFVbxpQjddFp1tt9QIhAJ0Rpl4X8BkwrYz5oJx0s93uF2RctVHbwjilu66/3XK+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDbq3YM58LVXj+X8Gh/JBMepT3oPOF3HTuI+3B4Xi0WAQIhAIDxJEi+OVta/jA0l4le2IfiRzWNB0uT+stF/hEdSN12","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ruvnet%2fruview@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":415305},"type":"module","_from":"file:/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.9.1.tgz","types":"./src/sdk.d.ts","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./ui":"./src/ui/console-widget.js","./cli":"./src/cli.js","./mcp":"./src/mcp-server.js","./sdk":{"types":"./src/sdk.d.ts","default":"./src/sdk.js"},"./brain":"./src/brain.js","./hosts":"./src/hosts/index.js","./cli-ui":"./src/cli-ui.js","./doctor":"./src/doctor.js","./kernel":"./src/kernel.js","./remote":"./src/remote.js","./devices":"./src/devices/registry.js","./esphome":"./src/devices/esphome.js","./firmware":"./src/firmware.js","./guidance":"./src/guidance.js","./mcp-http":"./src/mcp-http.js","./training":"./src/training.js","./guardrails":"./src/guardrails.js"},"scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs && node ./scripts/update-manifest.mjs --quiet && node ./scripts/verify-manifest.mjs --quiet","sync-skills":"node ./scripts/sync-skills.mjs","brain:verify":"node ./bin/cli.js brain verify","flywheel:plan":"node ./flywheel/run.mjs --dry-run","test:security":"node --test test/hosts.test.mjs test/brain.test.mjs test/policy.test.mjs test/spaces.test.mjs test/kernel.test.mjs test/firmware.test.mjs test/training.test.mjs test/devices.test.mjs test/csi-nodes.test.mjs test/remote.test.mjs test/mcp-apps.test.mjs test/cli-ui.test.mjs test/esphome.test.mjs","prepublishOnly":"npm test && node ./scripts/verify-manifest.mjs","flywheel:verify":"node ./flywheel/replay.mjs --self-test","manifest:update":"node ./scripts/update-manifest.mjs","manifest:verify":"node ./scripts/verify-manifest.mjs","test:e2e:devices":"node --test test/e2e/devices.e2e.mjs"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"_resolved":"/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.9.1.tgz","_integrity":"sha512-uq2ifd31UPhob7NnHt0st9cUWaSvi+ZAcSCalX7+VCQnV12CCnMseYq3e1GtgQ/DKPwDFtXYRC4KseHkIXVsiQ==","repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"11.19.0","description":"RuView WiFi-sensing operator harness — CLI, MCP server, and SDK for host device access (ESP32 CSI nodes, 60/24 GHz mmWave, LiDAR), SSH remote hosts, diagnostics, verified ESP32 flashing, evidence-gated training, calibration, and Cognitum Spaces.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"metaharness":"0.4.1","@metaharness/darwin":"0.8.0","@metaharness/flywheel":"0.1.7"},"peerDependencies":{"@ruvnet/ruview-kernel":">=0.1.0"},"peerDependenciesMeta":{"@ruvnet/ruview-kernel":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ruview_0.9.1_1790902561846_0.5026270383277667","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@ruvnet/ruview","version":"0.9.2","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence","cognitum-spaces","oauth","firmware-flashing","esptool","sdk","model-training","mmwave","lidar","rplidar","mr60bha2","ld2410","ssh"],"author":{"name":"ruvnet"},"license":"MIT","_id":"@ruvnet/ruview@0.9.2","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/RuView#readme","bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"bin":{"ruview-harness":"bin/cli.js"},"dist":{"shasum":"d66846761f19f2e7035a3c4e19e25110dd0af88f","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.9.2.tgz","fileCount":73,"integrity":"sha512-C6FaVKNnfaej4CCI/enZ3v5g9pzU0inPDkUGxOIXI0RF16aYCKtJUDaLUT/DRuJzQmpkawY4/lg8R6NtfPSWQQ==","signatures":[{"sig":"MEUCIQDESRKk/dVroiSezT0ffG+MndrOiO8iSsKDsFwnVTGRSQIgVipIGUeit5WcXYbiywQPHHyEmgZGb6h3I70DXui2J1U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBvZ82jIUwPnlkJC1P0wTCILlbC6JvqkXydh/zM0bD9KAiEAnrz86p3yFiQIxzZ8Q+cLxVpomVuhGoagFdaLEVuJozU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ruvnet%2fruview@0.9.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":422816},"type":"module","_from":"file:/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.9.2.tgz","types":"./src/sdk.d.ts","engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./ui":"./src/ui/console-widget.js","./cli":"./src/cli.js","./mcp":"./src/mcp-server.js","./sdk":{"types":"./src/sdk.d.ts","default":"./src/sdk.js"},"./brain":"./src/brain.js","./hosts":"./src/hosts/index.js","./cli-ui":"./src/cli-ui.js","./doctor":"./src/doctor.js","./kernel":"./src/kernel.js","./remote":"./src/remote.js","./devices":"./src/devices/registry.js","./esphome":"./src/devices/esphome.js","./firmware":"./src/firmware.js","./guidance":"./src/guidance.js","./mcp-http":"./src/mcp-http.js","./training":"./src/training.js","./guardrails":"./src/guardrails.js"},"scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs && node ./scripts/update-manifest.mjs --quiet && node ./scripts/verify-manifest.mjs --quiet","sync-skills":"node ./scripts/sync-skills.mjs","brain:verify":"node ./bin/cli.js brain verify","flywheel:plan":"node ./flywheel/run.mjs --dry-run","test:security":"node --test test/hosts.test.mjs test/brain.test.mjs test/policy.test.mjs test/spaces.test.mjs test/kernel.test.mjs test/firmware.test.mjs test/training.test.mjs test/devices.test.mjs test/csi-nodes.test.mjs test/remote.test.mjs test/mcp-apps.test.mjs test/cli-ui.test.mjs test/esphome.test.mjs","prepublishOnly":"npm test && node ./scripts/verify-manifest.mjs","flywheel:verify":"node ./flywheel/replay.mjs --self-test","manifest:update":"node ./scripts/update-manifest.mjs","manifest:verify":"node ./scripts/verify-manifest.mjs","test:e2e:devices":"node --test test/e2e/devices.e2e.mjs"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"_resolved":"/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.9.2.tgz","_integrity":"sha512-C6FaVKNnfaej4CCI/enZ3v5g9pzU0inPDkUGxOIXI0RF16aYCKtJUDaLUT/DRuJzQmpkawY4/lg8R6NtfPSWQQ==","repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"11.19.0","description":"RuView WiFi-sensing operator harness — CLI, MCP server, and SDK for host device access (ESP32 CSI nodes, 60/24 GHz mmWave, LiDAR), SSH remote hosts, diagnostics, verified ESP32 flashing, evidence-gated training, calibration, and Cognitum Spaces.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"metaharness":"0.4.1","@metaharness/darwin":"0.8.0","@metaharness/flywheel":"0.1.7"},"peerDependencies":{"@ruvnet/ruview-kernel":">=0.1.0"},"peerDependenciesMeta":{"@ruvnet/ruview-kernel":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ruview_0.9.2_1791824340608_0.6370145941543097","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"_id":"@ruvnet/ruview@0.9.3","bin":{"ruview-harness":"bin/cli.js"},"bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"dist":{"shasum":"5cd29922aa51d2ff97790cd18315f27ade9945bd","tarball":"https://registry.npmjs.org/@ruvnet/ruview/-/ruview-0.9.3.tgz","fileCount":73,"integrity":"sha512-2O+Mh36orJhBajnX2n3ZsXD/XnIimy15a6DpM8AXMn+pPnfnjqjYkwmPwXhkOzyEy1iDKL/J1Hgp5ARzyfUdfA==","signatures":[{"sig":"MEUCIQDHOwYLYDeCx+uQtRDs/ArX0XLBXXb4UdHymIgfiHPJ/wIgfhTNJ4FrsERi7GiuWhQSBawK+fBDwaTIl0DoLvJIERE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDMwD6liLcWCDGW7Bc6O8Ci6RzhkzXteRPwFyNZVZhc3wIhAKoxEmhff2HO8Rtkvjp+2+Fi2ifOfx2EmwFwFdozSJtZ"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ruvnet%2fruview@0.9.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":426328},"name":"@ruvnet/ruview","type":"module","_from":"file:/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.9.3.tgz","types":"./src/sdk.d.ts","author":{"name":"ruvnet"},"engines":{"node":">=20.0.0"},"exports":{".":"./src/tools.js","./ui":"./src/ui/console-widget.js","./cli":"./src/cli.js","./mcp":"./src/mcp-server.js","./sdk":{"types":"./src/sdk.d.ts","default":"./src/sdk.js"},"./brain":"./src/brain.js","./hosts":"./src/hosts/index.js","./cli-ui":"./src/cli-ui.js","./doctor":"./src/doctor.js","./kernel":"./src/kernel.js","./remote":"./src/remote.js","./devices":"./src/devices/registry.js","./esphome":"./src/devices/esphome.js","./firmware":"./src/firmware.js","./guidance":"./src/guidance.js","./mcp-http":"./src/mcp-http.js","./training":"./src/training.js","./guardrails":"./src/guardrails.js"},"license":"MIT","scripts":{"mcp":"node ./bin/cli.js mcp start","test":"node --test --test-concurrency=2 test/*.test.mjs","doctor":"node ./bin/cli.js doctor","prepack":"node ./scripts/sync-skills.mjs && node ./scripts/update-manifest.mjs --quiet && node ./scripts/verify-manifest.mjs --quiet","sync-skills":"node ./scripts/sync-skills.mjs","brain:verify":"node ./bin/cli.js brain verify","flywheel:plan":"node ./flywheel/run.mjs --dry-run","test:security":"node --test test/hosts.test.mjs test/brain.test.mjs test/policy.test.mjs test/spaces.test.mjs test/kernel.test.mjs test/firmware.test.mjs test/training.test.mjs test/devices.test.mjs test/csi-nodes.test.mjs test/remote.test.mjs test/mcp-apps.test.mjs test/cli-ui.test.mjs test/esphome.test.mjs","prepublishOnly":"npm test && node ./scripts/verify-manifest.mjs","flywheel:verify":"node ./flywheel/replay.mjs --self-test","manifest:update":"node ./scripts/update-manifest.mjs","manifest:verify":"node ./scripts/verify-manifest.mjs","test:e2e:devices":"node --test test/e2e/devices.e2e.mjs"},"version":"0.9.3","_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"homepage":"https://github.com/ruvnet/RuView#readme","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence","cognitum-spaces","oauth","firmware-flashing","esptool","sdk","model-training","mmwave","lidar","rplidar","mr60bha2","ld2410","ssh"],"_resolved":"/home/runner/work/RuView/RuView/harness/ruview/ruvnet-ruview-0.9.3.tgz","_integrity":"sha512-2O+Mh36orJhBajnX2n3ZsXD/XnIimy15a6DpM8AXMn+pPnfnjqjYkwmPwXhkOzyEy1iDKL/J1Hgp5ARzyfUdfA==","repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"_npmVersion":"11.19.1","description":"RuView WiFi-sensing operator harness — CLI, MCP server, and SDK for host device access (ESP32 CSI nodes, 60/24 GHz mmWave, LiDAR), SSH remote hosts, diagnostics, verified ESP32 flashing, evidence-gated training, calibration, and Cognitum Spaces.","directories":{},"maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"_nodeVersion":"24.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"metaharness":"0.4.1","@metaharness/darwin":"0.8.0","@metaharness/flywheel":"0.1.7"},"peerDependencies":{"@ruvnet/ruview-kernel":"^0.1.0"},"peerDependenciesMeta":{"@ruvnet/ruview-kernel":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ruview_0.9.3_1793980871998_0.16884327330356286"}}},"time":{"created":"2026-06-17T21:21:34.803Z","modified":"2026-11-06T16:01:12.692Z","0.1.0":"2026-06-17T21:21:35.155Z","0.2.0":"2026-07-02T14:04:48.676Z","0.3.0":"2026-07-29T03:59:16.564Z","0.3.1":"2026-07-29T05:34:16.426Z","0.4.0":"2026-08-19T03:35:21.736Z","0.5.0":"2026-08-19T18:15:47.318Z","0.5.1":"2026-08-19T18:53:26.140Z","0.8.0":"2026-10-01T20:33:48.483Z","0.9.0":"2026-10-01T21:24:23.119Z","0.9.1":"2026-10-02T00:56:02.021Z","0.9.2":"2026-10-12T16:59:00.711Z","0.9.3":"2026-11-06T16:01:12.160Z"},"bugs":{"url":"https://github.com/ruvnet/RuView/issues"},"author":{"name":"ruvnet"},"license":"MIT","homepage":"https://github.com/ruvnet/RuView#readme","keywords":["wifi-sensing","wifi-densepose","ruview","csi","channel-state-information","pose-estimation","presence-detection","esp32","agent-harness","metaharness","mcp","mcp-server","claude-code","ambient-intelligence","cognitum-spaces","oauth","firmware-flashing","esptool","sdk","model-training","mmwave","lidar","rplidar","mr60bha2","ld2410","ssh"],"repository":{"url":"git+https://github.com/ruvnet/RuView.git","type":"git","directory":"harness/ruview"},"description":"RuView WiFi-sensing operator harness — CLI, MCP server, and SDK for host device access (ESP32 CSI nodes, 60/24 GHz mmWave, LiDAR), SSH remote hosts, diagnostics, verified ESP32 flashing, evidence-gated training, calibration, and Cognitum Spaces.","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"readme":"# `npx @ruvnet/ruview` — RuView WiFi-sensing operator harness\n\nAn AI agent harness that knows how to operate **RuView** (WiFi-DensePose): onboard a\nnewcomer, provision an ESP32 CSI node, calibrate a room, train pose models, and —\ncrucially — **refuse to overstate accuracy**. Minted from the RuView monorepo via\n[`metaharness`](https://www.npmjs.com/package/metaharness) and hardened per **ADR-182**.\n\nWiFi sensing infers *coarse* pose/presence/breathing from Channel State Information.\nIt is **not a camera**. Every accuracy number this harness emits must be MEASURED\nagainst a baseline — that rule is enforced in code (`ruview_claim_check`).\n\n## Quick start\n\nThe source candidate adds `--variant c5` for ESP32-C5 bundles. It verifies\nchecksums and the attached chip before writing, and uses C5's `0x2000`\nbootloader address rather than S3/C6's `0x0`. C5 writes require esptool >=5.3\nfor corrected security-layout handling; use an isolated active Python environment.\nThe [C5 record](../../docs/validation/2026-10-28-esp32-c5-candidate.md) contains\nbounded real-board boot and CSI evidence, including AP-dependent cadence limits.\nCapture a real boot and sustained CSI run for each installation. Both flash\nvalidation and the SDK monitor reject watchdog/flash-busy evidence even if\ninitial CSI callbacks were present. C5 skips unconfigured mmWave probing to\navoid assigning the S3 sensor pins onto C5's flash/PSRAM bus.\n\n```bash\nnpx @ruvnet/ruview                       # onboard — pick a setup path\nnpx @ruvnet/ruview claim-check --file REPORT.md   # the honesty guardrail (non-zero exit on untagged claims)\nnpx @ruvnet/ruview verify                # run the deterministic proof (VERDICT: PASS)\nnpx @ruvnet/ruview doctor                # structured diagnostics with fixes (ADR-372)\nnpx @ruvnet/ruview ports                 # find the ESP32 serial port\nnpx @ruvnet/ruview flash --port COM7 --bundle ./esp32-csi-node-s3-8mb   # plan only\nnpx @ruvnet/ruview train-plan --mode pose-smoke\nnpx @ruvnet/ruview train-gate --file eval-report.json\nnpx @ruvnet/ruview devices               # ESP32 / mmWave / LiDAR on this machine\nnpx @ruvnet/ruview hosts run --host lab-pi --tool ruview_devices_scan\nnpx @ruvnet/ruview guidance --topic homecore --query \"Wasmtime plugins\"\nnpx @ruvnet/ruview spaces --resource spaces\nnpx @ruvnet/ruview spaces --resource events --limit 25\nnpx @ruvnet/ruview --help\n```\n\nThe operator tools are pure Node and the published package has no runtime\ndependencies (ADR-263 O3). MetaHarness, Darwin and Flywheel are exact-pinned\ndevelopment dependencies used only for scoring, evolution proposals and\nreplay verification.\n\n## Tools (`ruview_*`)\n\nExposed both as CLI verbs and as an MCP server (`npx @ruvnet/ruview mcp start`):\n\n| Tool | What it does |\n|------|--------------|\n| `ruview_onboard` | Pick docker-demo / repo-build / live-esp32; print the next command |\n| `ruview_claim_check` | Lint text for untagged / overstated accuracy claims (guardrail) |\n| `ruview_verify` | Run `verify.py` deterministic proof → VERDICT |\n| `ruview_node_monitor` | Assert CSI is flowing on an ESP32 (read-only) |\n| `ruview_calibrate` | ADR-151 room pipeline (baseline→enroll→train-room→room-watch) |\n| `ruview_node_flash` | Cross-platform esptool flash with checksum + chip preflight and boot-log evidence (mutating, guarded) |\n| `ruview_firmware_plan` | Verify a firmware bundle and return the exact esptool command (read-only) |\n| `ruview_firmware_ports` | Enumerate serial ports via pyserial (read-only) |\n| `ruview_doctor` | Structured diagnostics: runtime, integrity, hosts, repo, Rust, Python/esptool, bundles, serial, kernel |\n| `ruview_train` | Run pose-smoke / pose / room training from the checkout (writes checkpoints, guarded) |\n| `ruview_train_plan` | Resolve a training command without running it (read-only) |\n| `ruview_train_gate` | Mean-pose-baseline + leakage gate that returns the only publishable claim wording |\n| `ruview_devices_scan` / `ruview_esp32_capture` / `ruview_mmwave_read` / `ruview_lidar_read` | Host device access: USB discovery, ESP32 UDP stream, 60/24 GHz mmWave, RPLIDAR/iPhone LiDAR (`device-access` grant) |\n| `ruview_host_list` / `ruview_host_run` | SSH remote hosts, read-only tools only (`remote-host` grant) |\n| `ruview_guidance` | Source-cited code map, capability maturity, validation commands, and limitations |\n| `ruview_spaces_list` | OAuth-only paging for sites/buildings/floors/spaces/zones/entities/events/alerts (guarded over MCP) |\n| `ruview_memory_search` | Search the reviewed, source-cited contributor brain |\n| `ruview_kernel_selftest` | SYNTHETIC self-test of the optional `@ruvnet/ruview-kernel` WASM/napi-rs compute package (ADR-368) |\n\nEvery tool is **fail-closed**: missing repo / python / binary / port → an honest\nnegative, never a fabricated success.\n\n### MCP authority model\n\nRead-only tools need no grant. Over MCP, `ruview_calibrate` and `ruview_train`\nneed the `workspace-write` grant plus `confirm: true`; `ruview_node_flash`\nneeds `hardware-write` plus `confirm: true`; `ruview_spaces_list` needs\n`credential-use`. The plan tools (`ruview_firmware_plan`, `ruview_train_plan`)\ncannot take `confirm`, so a read-only client can review exactly what would run.\nThe MCP doctor cannot probe a board or contact a network host; those are\nCLI/SDK options (`--probe`, `--url`).\n\n## Device and host access (ADR-373, ADR-374)\n\nRun these on the machine the hardware is plugged into. A cloud agent cannot\nreach your USB ports; use a local session or an SSH host.\n\n```bash\nnpx @ruvnet/ruview devices                                   # classify USB serial devices by VID:PID\nnpx @ruvnet/ruview esp32 --seconds 10                         # ESP32 / Realtek RAC1 node UDP stream (default :5005)\nnpx @ruvnet/ruview esp32 --seconds 45 --analyze               # ...and run live CSI through @ruvnet/ruview-kernel\nnpx @ruvnet/ruview monitor --port COM10 --baud 1500000        # serial console without resetting the node\nnpx @ruvnet/ruview mmwave --port /dev/ttyUSB0                 # MR60BHA2 60 GHz / LD2410 24 GHz, auto-detected\nnpx @ruvnet/ruview lidar --source rplidar --port /dev/ttyUSB1 # RPLIDAR scan summary\nRUVIEW_LIDAR_TOKEN=… npx @ruvnet/ruview lidar --source iphone --url ws://HOST:8787/ws/lidar\n```\n\n| Tool | Access | MCP grant |\n|---|---|---|\n| `ruview_devices_scan` | pyserial port list + VID:PID roles (opens no port) | `device-access` |\n| `ruview_esp32_capture` | receive-only UDP; CSI/vitals/feature packets per node, loss, RSSI | `device-access` |\n| `ruview_mmwave_read` | serial; firmware-identical MR60BHA2/LD2410 parsers | `device-access` |\n| `ruview_lidar_read` | RPLIDAR SCAN over serial, or iPhone relay WebSocket (stats only) | `device-access` |\n| `ruview_host_list` | configured SSH hosts | none |\n| `ruview_host_run` | one read-only tool on an SSH host | `remote-host` + the tool's grant |\n\nRemote hosts live in `~/.config/ruview/hosts.json` (mode 0600) and are added\nonly from the CLI:\n\n```bash\nnpx @ruvnet/ruview hosts add --name lab-pi --ssh ruv@lab-pi.local\nssh ruv@lab-pi.local true      # pin the host key once; BatchMode + StrictHostKeyChecking are enforced\nnpx @ruvnet/ruview hosts run --host lab-pi --tool ruview_esp32_capture --args-json '{\"seconds\":10}'\n```\n\nThe remote side runs `npx -y @ruvnet/ruview@<this version> call <tool>\n--read-only`. Every argument is validated against the tool schema on both\nends and single-quoted for the remote shell. Flash, train, calibrate,\ncredentialed reads, and host hopping are never forwarded.\n\n## Firmware flashing (ADR-370)\n\nWorks on Windows, macOS, and Linux through `python -m esptool` (`pip install\nesptool pyserial`). The bundle directory is an extracted release flash bundle,\n`firmware/esp32-csi-node/release_bins/<variant>`, or an ESP-IDF `build/`.\n\n```bash\nnpx @ruvnet/ruview ports\nnpx @ruvnet/ruview flash-plan --port /dev/ttyUSB0 --bundle ./bundle --variant s3-8mb\nnpx @ruvnet/ruview flash --port /dev/ttyUSB0 --bundle ./bundle --variant s3-8mb --confirm\n```\n\nBefore writing, every image is checked against `SHA256SUMS(.txt)` (a mismatch\nis always refused), and `esptool chip_id` must report the chip the variant\ntargets. After writing, a 15 s serial capture is summarized. The result sets\n`hardwareValidated: true` only when that log shows CSI callbacks without a\npanic. A successful write alone is not hardware validation. WiFi provisioning\nstays with `provision.py` (see the `provision-node` skill) so credentials never\npass through the harness.\n\n## Training (ADR-371)\n\n```bash\nnpx @ruvnet/ruview train-plan --mode pose-smoke        # review the command\nnpx @ruvnet/ruview train --mode pose-smoke --confirm   # SYNTHETIC smoke run (needs libtorch)\nnpx @ruvnet/ruview train --mode pose --data-dir data/mmfi --confirm\nnpx @ruvnet/ruview train --mode room --enrollment enrollment.json --confirm\nnpx @ruvnet/ruview train-gate --file eval-report.json  # PASS/FAIL + publishable wording\n```\n\nPose training builds `wifi-densepose-train` with `tch-backend`. It needs\nlibtorch: tch 0.24 expects torch 2.11.0, via `LIBTORCH` or\n`LIBTORCH_USE_PYTORCH=1`. Checkpoints and trainer logs go under\n`v2/target/ruview-train/<mode>` unless `--checkpoint-dir` names another path\ninside the checkout. The gate refuses any score that has no mean-pose baseline,\nuses a random-frame split, shares subjects across a grouped-subject split,\noverlaps in time, or fails to beat the baseline.\n\n## Debugging doctor (ADR-372)\n\n```bash\nnpx @ruvnet/ruview doctor                          # all groups, human output\nnpx @ruvnet/ruview doctor --json --group python,serial,firmware\nnpx @ruvnet/ruview doctor --port COM7 --probe      # esptool chip_id (resets the board, writes nothing)\nnpx @ruvnet/ruview doctor --url http://localhost:3000   # sensing-server /health\n```\n\nEach check is `pass`, `warn`, `fail`, or `skip`, and every non-passing check\ncarries a `fix:`. The exit code is non-zero only for failures.\n\n## SDK (ADR-369)\n\n```js\nimport { createRuView } from '@ruvnet/ruview/sdk';   // typed: src/sdk.d.ts\n\nconst ruview = createRuView();                  // { strict: true } throws RuViewError on ok:false\nconst report = await ruview.doctor({ groups: ['python', 'serial'] });\nconst plan = await ruview.firmware.plan({ port: 'COM7', bundle: './bundle', variant: 'c6' });\nconst flashed = await ruview.firmware.flash({ port: 'COM7', bundle: './bundle', variant: 'c6', confirm: true });\nconst gate = await ruview.training.gate({ model_score: 0.595, baseline_score: 0.501, split: 'chronological',\n  train_end: '2026-03-01', test_start: '2026-03-02', n_test: 800, reproducer: 'python eval.py' });\nconst kernel = await ruview.kernel.load();      // optional @ruvnet/ruview-kernel\nconst radar = await ruview.devices.mmwave({ port: '/dev/ttyUSB0', model: 'auto' });\nconst nodes = await ruview.devices.esp32({ seconds: 10 });\nconst remote = await ruview.hosts.run('lab-pi', 'ruview_lidar_read', { source: 'rplidar', port: '/dev/ttyUSB1' });\n```\n\nThe SDK calls the same policy-checked registry as the CLI and MCP server.\nMutating calls still need `confirm: true`.\n\n### Cognitum Spaces OAuth\n\nActivate the additional read scope through the Rust CLI, then use the same\nvalidated client through the metaharness:\n\n```bash\nwifi-densepose login --spaces\nwifi-densepose whoami\nnpx @ruvnet/ruview spaces\nnpx @ruvnet/ruview spaces --resource sites --limit 50\nnpx @ruvnet/ruview spaces --resource events --cursor '<opaque-next-cursor>'\n```\n\nThe metaharness never accepts a bearer token or API key and removes\n`COGNITUM_SPACES_API` from the child environment, so this surface cannot\nsilently fall back to the compatibility API-key path. The API origin is fixed\nto `https://api.cognitum.one`, and the credentialed adapter requires an\ninstalled `wifi-densepose` binary rather than running Cargo build scripts from\nan auto-detected checkout. It returns only the bounded P2/P3 semantic\nprojection. `--resource` selects one of `sites`, `buildings`, `floors`,\n`spaces`, `zones`, `entities`, `events`, or `alerts`; `--limit` is 1–100 and\n`--cursor` is the opaque value from the prior page. An empty list is a valid\nauthenticated result, not sensing-quality evidence. An expired session may\nrotate the stored refresh credential before the read completes.\n\nMCP use is denied unless the server operator starts it with\n`RUVIEW_MCP_GRANTS=credential-use`. Set `RUVIEW_CREDENTIALS_PATH` in the MCP\nserver environment when a non-default store is needed; MCP calls cannot choose\nan arbitrary credential file or URL. `spaces:read` grants no write, pairing,\ncommand, policy-approval, spending, or actuator authority. See the bundled\n`cognitum-spaces` skill for the full playbook.\n\n### Codebase guidance\n\n`ruview_guidance` is the read-only starting point for unfamiliar work. Filter\nby `architecture`, `sensing`, `hardware`, `training`, `homecore`,\n`integrations`, `deployment`, `community`, or `testing`, and optionally add a\nfree-text query:\n\n```bash\nnpx @ruvnet/ruview guidance --topic sensing --query \"UDP CSI ingestion\"\nnpx @ruvnet/ruview guidance --topic homecore --query \"restore migration voice\"\n```\n\nEach result separates implementation maturity from evidence, cites current\nrepository paths, names focused validation commands, and states known\nlimitations. In a RuView checkout, cited paths are checked before the result\npasses. Outside a checkout, the tool labels them as a reviewed packaged\ncatalog. Related shared-brain records are bounded, reviewed, and treated only\nas evidence.\n\n## Skills\n\nHost-neutral playbooks in `skills/` (`onboard`, `provision-node`, `calibrate-room`,\n`train-pose`, `verify`, `cognitum-spaces`). `npx @ruvnet/ruview skill <name>`\nprints one.\n\n## Use as a Claude Code MCP server\n\nThe bundled `.claude/settings.json` registers the `ruview` MCP server\n(`npx -y @ruvnet/ruview mcp start`). Drop this package's `.claude/` into a repo, or run\n`npx @ruvnet/ruview install --host claude-code`.\n\n## Claude Code mod: live sensing pane (ADR-377)\n\nThis package ships **`ruview-live`**, a Claude Code mod: a plugin whose behaviour is a function-hooks module. `/ruview` opens a pane beside the transcript, refreshed on a timer, with:\n- your CSI nodes (ESP32, Realtek): rate, loss, RSSI and CSI shape;\n- an optional ESPHome radar kit: presence, distance, and device-reported heart/breathing;\n- alerts, such as a board that sends heartbeats but no CSI.\n\nIt also keeps a one-line status: `RuView · 2 nodes · radar present · 1 alert`.\n\n**Showcase views (ADR-378).** The pane has three views, switched with keys `1`, `2` and `3`. The two live views are drawn in terminal cells (24-bit colour) and animated in place:\n\n| Key | View | What you see |\n|---|---|---|\n| `1` | Overview | the cards above |\n| `2` | CSI waterfall | per-subcarrier amplitude over time (`esp32 --spectrum`), replayed at the frames' arrival rate and labelled **MEASURED** or **SYNTHETIC** from the packets' own flag; `n` cycles nodes |\n| `3` | Radar | a 120° range fan with a sonar ping out to the measured distance; heart and breathing charts, and a ♥ and breathing gauge that pulse at the device-reported rates (a metronome, not a waveform) |\n\nThe radar kit reports range, not bearing, so the arc covers every bearing at that range. Desktop and IDE surfaces show the overview, and a note in the live views.\n\n```bash\nnpx @ruvnet/ruview mod                    # where the mod is in this install, and how to load it\nclaude --plugin-dir \"<path printed above>\"   # try it for one session\n# or from the RuView marketplace:\n#   /plugin marketplace add ruvnet/RuView\n#   /plugin install ruview-live@ruview\n```\n\nIn Claude Code:\n\n| Command | What it does |\n|---|---|\n| `/ruview` | Open or close the pane |\n| `/ruview refresh` | Run one capture now; the result goes in the status line |\n| `/ruview off` | Close the pane |\n| `/ruview waterfall`, `/ruview radar` | Open the pane on that view |\n\n**Settings** (`claude plugin configure ruview-live`):\n- `udpPort` (default 5005);\n- `radarHost`, an ESPHome kit on your private network;\n- `refreshSeconds` (default 15, minimum 5);\n- `liveRefreshSeconds` for the waterfall and radar views (default 4, range 2–60);\n- `captureSeconds` (default 3).\n\n**How it reads:**\n- The mod only runs this package's CLI, for read-only `esp32` and `mmwave --source esphome` captures, with `--json`, so the pane shows exactly what those tools return.\n- It never flashes, provisions or writes to a device.\n- Like every mod, it runs inside Claude Code with Claude Code's access, so install it only from a source you trust.\n\nMods are early access in Claude Code. If `/ruview` is missing, start Claude Code with `CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1`.\n\n## ChatGPT and MCP Apps (ADR-375)\n\n`ruview_esp32_capture`, `ruview_devices_scan` and `ruview_doctor` render in a\nself-contained console widget (`ui://ruview/console-v1.html`) in ChatGPT and\nother MCP Apps hosts, with a Refresh button that re-runs the tool. Results also\ncarry `structuredContent`.\n\n```bash\n# MCP over HTTP: loopback, token-authenticated, read tools only\nexport RUVIEW_MCP_TOKEN=\"$(node -e \"console.log(require('crypto').randomBytes(24).toString('base64url'))\")\"\nRUVIEW_MCP_GRANTS=device-access npx @ruvnet/ruview mcp start --http --port 8790\n```\n\nClients that can send headers use `Authorization: Bearer <token>` on\n`http://127.0.0.1:8790/mcp`. ChatGPT connectors cannot, so expose the port over\nHTTPS (a tunnel or reverse proxy) and add `https://<host>/mcp/<token>` as the\nconnector URL. Write grants (`hardware-write`, `workspace-write`) are never\nhonoured over HTTP: flashing and calibration stay on the CLI and stdio. Malformed request targets return HTTP 400\nwith `invalid_request_target`; the transport continues serving subsequent requests.\n\nIn a terminal, commands print a formatted view; pipes and `--json` print JSON.\n`ruview esp32 --watch` redraws live capture windows with per-node trends.\n\n## Hosts\n\nClaude Code and Codex are implemented directly and tested with the local,\nnon-interactive CLIs:\n\n```bash\nnpx @ruvnet/ruview agent run --host claude-code --repo . --prompt \"Map the sensing-server startup path\"\nnpx @ruvnet/ruview agent run --host codex --repo . --prompt \"Find the nearest tests for HomeCore restore state\"\n```\n\nPrompts travel over stdin, never through a shell. Both adapters are read-only by\ndefault (`claude -p --safe-mode` in plan mode; `codex exec` in its read-only\nsandbox with user config and exec rules ignored), use a scrubbed environment,\nbound output/time, redact secrets, and require a trusted RuView checkout.\nWorkspace writes require both `--allow-write` and `--confirm`; dangerous bypass\nflags are never emitted.\n\n## Shared contributor brain\n\nThe committed `brain/corpus/core.jsonl` is a small, reviewable source of\nrepository facts. Every record has a source citation, evidence tier, tags, and\nreview state:\n\n```bash\nnpx @ruvnet/ruview brain search --query \"darwin community memory\"\nnpx @ruvnet/ruview brain verify --repo .\nnpx @ruvnet/ruview brain propose --id finding-id --title \"Finding\" \\\n  --content \"Source-bound observation\" --sourcePath README.md --sourceLine 1 \\\n  --tags onboarding,docs --contributor github-user\n```\n\nProposals are unreviewed JSONL for a normal pull request. Local vector indexes,\nprivate overlays, raw agent transcripts, CSI/person data, and credentials are\nnever part of the shared corpus. Retrieved text is quoted evidence, not an\ninstruction or authority grant.\n\n## Ruflo + Darwin/Flywheel\n\nDevelopment tooling is exact-pinned in `devDependencies`: `metaharness@0.4.1`,\n`@metaharness/darwin@0.8.0`, and `@metaharness/flywheel@0.1.7`. Ruflo remains an\noptional contributor coordinator rather than cold-start weight for the\ndependency-free published MCP server:\n\n```bash\nclaude mcp add --scope project ruflo -- npx -y ruflo@3.32.26 mcp start\ncodex mcp add ruflo -- npx -y ruflo@3.32.26 mcp start\n```\n\n`npm run flywheel:plan` is read-only. Darwin execution is human-triggered with\n`node flywheel/run.mjs --confirm`; it writes only an untrusted\n`.metaharness/` proposal archive. The protected gate requires frozen-anchor\nretention, holdout lift, security and legacy-test success, verified provenance,\nand human approval. No contributor run can directly replace or publish the\nchampion.\n\n## License\n\nMIT © ruvnet\n","readmeFilename":"README.md"}