{"_id":"@context-qb/cli","_rev":"16-eb15d576e99e76291db8eebc3ad5fc8e","name":"@context-qb/cli","dist-tags":{"latest":"2.5.0"},"versions":{"1.0.0":{"name":"@context-qb/cli","version":"1.0.0","_id":"@context-qb/cli@1.0.0","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"3e9ccedb45d847c2c5b449f08ded79e716740c81","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-1.0.0.tgz","fileCount":59,"integrity":"sha512-nywQNjJ10MstFKsFAZ73kfGWlcLoVgq1kHDz59di6nh794ma0ocdsehEHBKvLoHqHIzh7GTq07TF7CFmHKT6zw==","signatures":[{"sig":"MEYCIQDv5/iAW6houRRr0OEL9KiuviHGt4xEgxDibE4aSb5kEwIhAP4C+Yx1v4fLHAUQGHlagXxWrtS/5CDsaZooBdbqSUP9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":229860},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"fa8387f683b2a854b587f8fa239cbbf3bf03312c","scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"deprecated":"Older than v2.3.0 — your project will not be counted in cooperative aggregates (project_id required from 2.3.0; ADR-0033). Run `npm install -D @context-qb/cli@latest` to upgrade.","_npmVersion":"11.4.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.0.0_1780106670870_0.8477104946919338","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@context-qb/cli","version":"1.0.1","_id":"@context-qb/cli@1.0.1","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"2ef5c2511a0512233bf97436d556af1746f61472","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-1.0.1.tgz","fileCount":59,"integrity":"sha512-7xLqB+EENHgaNTsqTqzTi24mDfiZ4i67m6vBkoPSaXVG8d7/lha1qOYlvXfVwMAXgu8X9jaQGwSNB4Php5KWrg==","signatures":[{"sig":"MEQCIDX4nUs/fdmNhXJXay8Gcpk8LVQ8plmhg3GARoAg++u+AiAop61FFgS8ywbjPgTXWpeTwacTl4zdXAZ25LdSrqTStA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":230193},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"fa8387f683b2a854b587f8fa239cbbf3bf03312c","scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"deprecated":"Older than v2.3.0 — your project will not be counted in cooperative aggregates (project_id required from 2.3.0; ADR-0033). Run `npm install -D @context-qb/cli@latest` to upgrade.","_npmVersion":"11.4.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.0.1_1780107215548_0.3010317365623587","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@context-qb/cli","version":"2.0.0","_id":"@context-qb/cli@2.0.0","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"7ba2e4e5719c66fb86015d6379a3eb6dfa89d410","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-2.0.0.tgz","fileCount":95,"integrity":"sha512-/cFFVfGeeUd8q7qq7KnxA0d+h7e9z9VWMVNrvH/HzcF7RMXPvk9Fc97T7TvD1THf9W4Tmb1MZ+nsCkYcjhSCqQ==","signatures":[{"sig":"MEUCIQDRJ1hcDTnP3ybW9f25cGiQ+Q4weZddXKgxcrd7RN7cvQIgM13sR8ZYxg1TkazM8ztMMLQlivxIJEH1uiWlsy/qqAc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":276795},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"bbf301778a804ffe0b3b26b76f095ea5e10d5564","scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"deprecated":"Older than v2.3.0 — your project will not be counted in cooperative aggregates (project_id required from 2.3.0; ADR-0033). Run `npm install -D @context-qb/cli@latest` to upgrade.","_npmVersion":"11.4.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","smol-toml":"^1.6.1","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_2.0.0_1780266796093_0.5975553610887314","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@context-qb/cli","version":"2.0.1","keywords":["context.qb","contextqb","drift-detector","ai-agent","agent-context","boot-manifest","monorepo","cli"],"author":{"url":"https://industrialsemiotics.com","name":"Industrial Semiotics"},"license":"MIT","_id":"@context-qb/cli@2.0.1","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"homepage":"https://contextqb.com/check","bugs":{"url":"https://github.com/ContextQB/contextqb/issues"},"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"ca1dced07d511e332e4382a86c8dbbee12d26023","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-2.0.1.tgz","fileCount":95,"integrity":"sha512-RTQsUc2TBuzQg3cpTqkmqtyVrHfPCwnF2LfuuasN1rOluFN/dxEKkzbhl1UirZ4rN+5APEB5ZZCr1wHDPZDsZw==","signatures":[{"sig":"MEYCIQDl/iRtwIOlR0UPvw8wUJVtNCv/3AztkcfcaroAxiWWsgIhAPGi/p7UyMcRpns3/MLqotU2K0ZkGvMqWyRv/8KR4/yd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":279928},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"9616c467d1c8e1a361e7a2fa97aeb2eeda935ccd","scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"deprecated":"Older than v2.3.0 — your project will not be counted in cooperative aggregates (project_id required from 2.3.0; ADR-0033). Run `npm install -D @context-qb/cli@latest` to upgrade.","repository":{"url":"git+https://github.com/ContextQB/contextqb.git","type":"git"},"_npmVersion":"11.4.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes. An Industrial Semiotics project.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","smol-toml":"^1.6.1","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_2.0.1_1780279896398_0.9780768276812879","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@context-qb/cli","version":"2.0.2","keywords":["context.qb","contextqb","drift-detector","ai-agent","agent-context","boot-manifest","monorepo","cli"],"author":{"url":"https://industrialsemiotics.com","name":"Industrial Semiotics"},"license":"MIT","_id":"@context-qb/cli@2.0.2","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"homepage":"https://contextqb.com/check","bugs":{"url":"https://github.com/ContextQB/contextqb/issues"},"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"6b5b45342f2560fa77918c37bdfac2aa9571609b","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-2.0.2.tgz","fileCount":95,"integrity":"sha512-HWo/X8VYbczQM6exNkzV0QQeMn1pqpu/Q5ujb0xCzFIUyotmUySLF0gIdOVhUknRsLSL1o5VyZErVWbY0nYxEA==","signatures":[{"sig":"MEQCIAQoYZvmWTyHIpYm4focTeyoEkolef9FzdBUP7VbbhMSAiAveJEsDJcUMxPMVc/4owmGVoskO4Mr8uWpzLWjx6cyCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":228618},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"6b42a00c740f8790313c56597ccf77ef67d418c8","scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"deprecated":"Older than v2.3.0 — your project will not be counted in cooperative aggregates (project_id required from 2.3.0; ADR-0033). Run `npm install -D @context-qb/cli@latest` to upgrade.","repository":{"url":"git+https://github.com/ContextQB/contextqb.git","type":"git"},"_npmVersion":"11.4.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes. An Industrial Semiotics project.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","smol-toml":"^1.6.1","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_2.0.2_1780280797250_0.8386093938857835","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@context-qb/cli","version":"2.0.3","keywords":["context.qb","contextqb","drift-detector","ai-agent","agent-context","boot-manifest","monorepo","cli"],"author":{"url":"https://industrialsemiotics.com","name":"Industrial Semiotics"},"license":"MIT","_id":"@context-qb/cli@2.0.3","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"homepage":"https://contextqb.com/check","bugs":{"url":"https://github.com/ContextQB/contextqb/issues"},"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"35085cc76f5baa0f67ba2df840ae29bd64ab2278","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-2.0.3.tgz","fileCount":95,"integrity":"sha512-kuNMhpyFndHUxad0DTaKMO+t4/4izYv+6hob8ga8KdMQlznfLtK55jUvOiIFFuJwDxsOU2tTyCMK4/ideOpBjA==","signatures":[{"sig":"MEYCIQCMfxvMiBw+JFtnS+r4NK5+/raG0QSFlDcIE50YsfzPVAIhAIDP/g1XD6zeyMqlOialE/6Y63/fu0XLUpt9asiRgNcQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":225642},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"e77d930e68e9dad31b078f85e17e606af9732653","scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"deprecated":"Older than v2.3.0 — your project will not be counted in cooperative aggregates (project_id required from 2.3.0; ADR-0033). Run `npm install -D @context-qb/cli@latest` to upgrade.","repository":{"url":"git+https://github.com/ContextQB/contextqb.git","type":"git"},"_npmVersion":"11.4.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes. An Industrial Semiotics project.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","smol-toml":"^1.6.1","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_2.0.3_1780281478500_0.5926872164118127","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@context-qb/cli","version":"2.1.0","keywords":["context.qb","contextqb","drift-detector","ai-agent","agent-context","boot-manifest","monorepo","cli"],"author":{"url":"https://industrialsemiotics.com","name":"Industrial Semiotics"},"license":"MIT","_id":"@context-qb/cli@2.1.0","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"homepage":"https://contextqb.com/check","bugs":{"url":"https://github.com/ContextQB/contextqb/issues"},"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"dfe60660604b55659671c3fe3d7834dd7dafb8f8","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-2.1.0.tgz","fileCount":99,"integrity":"sha512-1hkPvDphaSo5tmSUpizULJSot1UU226YLPqlBCnPNMPhWaeZjrT8kIZ9rfRA3JhO/yj1IsFgx2ADaJC2/MKPtw==","signatures":[{"sig":"MEUCIFI2kaUfWpmkDqKpGuJajh+H2VJyxUb+LAJ/Q4tTt5DTAiEAnYcLhqYuSls3PV0MTQZBtfs+CPVFaKvghgUUUnhrqB8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":233712},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"6207ed59d2e5de7ad77b7c3db8d8bca3d68455ce","scripts":{"build":"tsc -p tsconfig.build.json","prebuild":"node scripts/generate-version.mjs","typecheck":"tsc --noEmit","prepublishOnly":"pnpm run build && pnpm run check:publish-leaks","check:publish-leaks":"node scripts/check-publish-leaks.mjs"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"deprecated":"Older than v2.3.0 — your project will not be counted in cooperative aggregates (project_id required from 2.3.0; ADR-0033). Run `npm install -D @context-qb/cli@latest` to upgrade.","repository":{"url":"git+https://github.com/ContextQB/contextqb.git","type":"git"},"_npmVersion":"11.4.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes. An Industrial Semiotics project.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","smol-toml":"^1.6.1","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_2.1.0_1780288167387_0.8850900690135077","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@context-qb/cli","version":"2.2.0","keywords":["context.qb","contextqb","drift-detector","ai-agent","agent-context","boot-manifest","monorepo","cli"],"author":{"url":"https://industrialsemiotics.com","name":"Industrial Semiotics"},"license":"MIT","_id":"@context-qb/cli@2.2.0","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"homepage":"https://contextqb.com/check","bugs":{"url":"https://github.com/ContextQB/contextqb/issues"},"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"c67e396071157fe4441420b99ed446b4301b7d77","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-2.2.0.tgz","fileCount":104,"integrity":"sha512-oEc8ZIDSBkql084XYs1hlyEyqwLy42OTGfXmxK069K4eBEQrmUOyUyktRbagr818v+XU6sYXqGG4ml4o6AbiDg==","signatures":[{"sig":"MEUCIEHcqZnvZ92XAi8k5WwvTAMOAjr+KRJkzkaNcqHhuLH/AiEAtyOzSO+xmMF6g1+P/cHUB4A0iJEdFpoc7Y1QO7Dgr2k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":240676},"main":"./dist/index.js","type":"module","_from":"file:context-qb-cli-2.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"build":"tsc -p tsconfig.build.json","prebuild":"node scripts/generate-version.mjs","typecheck":"tsc --noEmit","check:publish-leaks":"node scripts/check-publish-leaks.mjs"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"_resolved":"/tmp/3558bede4f0d43fc6b6a34f484427636/context-qb-cli-2.2.0.tgz","_integrity":"sha512-oEc8ZIDSBkql084XYs1hlyEyqwLy42OTGfXmxK069K4eBEQrmUOyUyktRbagr818v+XU6sYXqGG4ml4o6AbiDg==","deprecated":"Older than v2.3.0 — your project will not be counted in cooperative aggregates (project_id required from 2.3.0; ADR-0033). Run `npm install -D @context-qb/cli@latest` to upgrade.","repository":{"url":"git+https://github.com/ContextQB/contextqb.git","type":"git"},"_npmVersion":"10.8.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes. An Industrial Semiotics project.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","smol-toml":"^1.6.1","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_2.2.0_1780434824558_0.10527428866361488","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@context-qb/cli","version":"2.3.0","keywords":["context.qb","contextqb","drift-detector","ai-agent","agent-context","boot-manifest","monorepo","cli"],"author":{"url":"https://industrialsemiotics.com","name":"Industrial Semiotics"},"license":"MIT","_id":"@context-qb/cli@2.3.0","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"homepage":"https://contextqb.com/check","bugs":{"url":"https://github.com/ContextQB/contextqb/issues"},"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"066dead917fc8c59063d42ae76ae1b4b77626ce9","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-2.3.0.tgz","fileCount":104,"integrity":"sha512-KwEkHxf00Qsz+txLR4T1Tzt5seXauyaPaWAGFs8K37J3jqe5f8CvQLhAvK0Sk0A/IlHcKfRha9lvNYO/lkhB3Q==","signatures":[{"sig":"MEUCIH9ugile7Askz3PT06wUwEdNv1xwixM8jAO3d8Sv7uAgAiEAgQCWBDtwixfUeYv2rU/PcbpHjqF+yRkIf+Xfm+adUgc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":254072},"main":"./dist/index.js","type":"module","_from":"file:context-qb-cli-2.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"build":"tsc -p tsconfig.build.json","prebuild":"node scripts/generate-version.mjs","typecheck":"tsc --noEmit","check:publish-leaks":"node scripts/check-publish-leaks.mjs"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"_resolved":"/tmp/c02aa3ee99c1988f0b460e77483d7517/context-qb-cli-2.3.0.tgz","_integrity":"sha512-KwEkHxf00Qsz+txLR4T1Tzt5seXauyaPaWAGFs8K37J3jqe5f8CvQLhAvK0Sk0A/IlHcKfRha9lvNYO/lkhB3Q==","deprecated":"Older than v2.4.0 — you will not see upgrade notices on contextqb runs (ADR-0034, INV-CLI-UPD-1). Run `npm install -D @context-qb/cli@latest` to upgrade.","repository":{"url":"git+https://github.com/ContextQB/contextqb.git","type":"git"},"_npmVersion":"10.8.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes. An Industrial Semiotics project.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","smol-toml":"^1.6.1","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_2.3.0_1780539587182_0.1193048132859551","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@context-qb/cli","version":"2.4.0","keywords":["context.qb","contextqb","drift-detector","ai-agent","agent-context","boot-manifest","monorepo","cli"],"author":{"url":"https://industrialsemiotics.com","name":"Industrial Semiotics"},"license":"MIT","_id":"@context-qb/cli@2.4.0","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"homepage":"https://contextqb.com/check","bugs":{"url":"https://github.com/ContextQB/contextqb/issues"},"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"e47f9954996d398186c11df05b8351cd84718aa8","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-2.4.0.tgz","fileCount":112,"integrity":"sha512-qL9fKsd8exHwallZR30aHqEY5Ex/7x6iF8P11Lc2UIAGTmD3StahOHuwk4J5r7DfBhgzv0Cq6c8SnxF+WoZVew==","signatures":[{"sig":"MEUCIH/3RpitGbgn/znbxr356zhqopCFZO3m6sTRFZjhZZyGAiEAnjMjQ1jn4SLe+M9wZlsyVd3aFyGdO0OebCiOAQP1oj0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":298470},"main":"./dist/index.js","type":"module","_from":"file:context-qb-cli-2.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"build":"tsc -p tsconfig.build.json","prebuild":"node scripts/generate-version.mjs","typecheck":"tsc --noEmit","check:publish-leaks":"node scripts/check-publish-leaks.mjs"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"_resolved":"/private/var/folders/_z/zpbt80693754w5gt72kdp2rr0000gn/T/43079702a0047d0ca9704535deba0b51/context-qb-cli-2.4.0.tgz","_integrity":"sha512-qL9fKsd8exHwallZR30aHqEY5Ex/7x6iF8P11Lc2UIAGTmD3StahOHuwk4J5r7DfBhgzv0Cq6c8SnxF+WoZVew==","repository":{"url":"git+https://github.com/ContextQB/contextqb.git","type":"git"},"_npmVersion":"11.4.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes. An Industrial Semiotics project.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","smol-toml":"^1.6.1","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_2.4.0_1780634526937_0.456777180876363","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"@context-qb/cli","version":"2.4.1","keywords":["context.qb","contextqb","drift-detector","ai-agent","agent-context","boot-manifest","monorepo","cli"],"author":{"url":"https://industrialsemiotics.com","name":"Industrial Semiotics"},"license":"MIT","_id":"@context-qb/cli@2.4.1","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"homepage":"https://contextqb.com/check","bugs":{"url":"https://github.com/ContextQB/contextqb/issues"},"bin":{"contextqb":"dist/cli.js"},"dist":{"shasum":"d85941ca4a035b698fa1f46c9b55cdf848a545c7","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-2.4.1.tgz","fileCount":112,"integrity":"sha512-Q1GGINwACS87ltuYNxtGFHV/j12QumFe1QdQQG/dUrTVPCU+jgAdkGYfWTQGTaO4ge9QAU4KN+/et8EBaazRIA==","signatures":[{"sig":"MEQCIBbuGG0rPKq8oLtfO5AftEbK/0fw3cANP6mAe734LSmhAiBKotFMMgbzr8cq8KigSXVjPi2m0wJDoEVVCUZRo0v71A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":304626},"main":"./dist/index.js","type":"module","_from":"file:context-qb-cli-2.4.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"build":"tsc -p tsconfig.build.json","prebuild":"node scripts/generate-version.mjs","typecheck":"tsc --noEmit","check:publish-leaks":"node scripts/check-publish-leaks.mjs"},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"_resolved":"/tmp/5a523328edc1b6cd14cd8f5546698f8b/context-qb-cli-2.4.1.tgz","_integrity":"sha512-Q1GGINwACS87ltuYNxtGFHV/j12QumFe1QdQQG/dUrTVPCU+jgAdkGYfWTQGTaO4ge9QAU4KN+/et8EBaazRIA==","repository":{"url":"git+https://github.com/ContextQB/contextqb.git","type":"git"},"_npmVersion":"10.8.2","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes. An Industrial Semiotics project.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"yaml":"^2.6.1","env-paths":"^4.0.0","smol-toml":"^1.6.1","tinyglobby":"^0.2.10","jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_2.4.1_1780727529535_0.6156803127445414","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"@context-qb/cli","version":"2.5.0","description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes. An Industrial Semiotics project.","type":"module","author":{"name":"Industrial Semiotics","url":"https://industrialsemiotics.com"},"license":"MIT","homepage":"https://contextqb.com/check","repository":{"type":"git","url":"git+https://github.com/ContextQB/contextqb.git"},"bugs":{"url":"https://github.com/ContextQB/contextqb/issues"},"keywords":["context.qb","contextqb","drift-detector","ai-agent","agent-context","boot-manifest","monorepo","cli"],"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"bin":{"contextqb":"dist/cli.js"},"engines":{"node":">=20.0.0"},"scripts":{"prebuild":"node scripts/generate-version.mjs","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","check:publish-leaks":"node scripts/check-publish-leaks.mjs","prepublishOnly":"node scripts/inject-integrity-secret.mjs"},"dependencies":{"env-paths":"^4.0.0","jsonc-parser":"^3.3.1","smol-toml":"^1.6.1","tinyglobby":"^0.2.10","yaml":"^2.6.1"},"devDependencies":{"@types/node":"^22.10.5","typescript":"^5.7.3"},"publishConfig":{"access":"public"},"_id":"@context-qb/cli@2.5.0","gitHead":"3ae8790bc3ebdd67f5799b33f8b8e348812f8fe6","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-bXhVgt6uMJNz+J+HGMjnWCNU+XWnBe33603XCzvnBeWVyPfLbskKCDZG94Ve3jEKjhUEzhKZosSY2sIKWzt/FQ==","shasum":"2e2b23319d4f8d604f41bb804dc4f0c68c04f2c7","tarball":"https://registry.npmjs.org/@context-qb/cli/-/cli-2.5.0.tgz","fileCount":115,"unpackedSize":319534,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCBJAQCfnt7qIYrsFItSTNY9OGgBKK/y90lAj2KX6dBigIgSBh2uRsTOjnjqyXKh6vRwlYI2r3pa/m+ooJbaf9+u48="}]},"_npmUser":{"name":"contextqb","email":"info@contextqb.com"},"directories":{},"maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cli_2.5.0_1780871913294_0.859570400633278"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-30T02:04:30.722Z","modified":"2026-06-07T22:38:33.572Z","1.0.0":"2026-05-30T02:04:31.091Z","1.0.1":"2026-05-30T02:13:35.699Z","2.0.0":"2026-05-31T22:33:16.235Z","2.0.1":"2026-06-01T02:11:36.544Z","2.0.2":"2026-06-01T02:26:37.381Z","2.0.3":"2026-06-01T02:37:58.705Z","2.1.0":"2026-06-01T04:29:27.533Z","2.2.0":"2026-06-02T21:13:44.738Z","2.3.0":"2026-06-04T02:19:47.320Z","2.4.0":"2026-06-05T04:42:07.104Z","2.4.1":"2026-06-06T06:32:09.717Z","2.5.0":"2026-06-07T22:38:33.427Z"},"bugs":{"url":"https://github.com/ContextQB/contextqb/issues"},"author":{"name":"Industrial Semiotics","url":"https://industrialsemiotics.com"},"license":"MIT","homepage":"https://contextqb.com/check","keywords":["context.qb","contextqb","drift-detector","ai-agent","agent-context","boot-manifest","monorepo","cli"],"repository":{"type":"git","url":"git+https://github.com/ContextQB/contextqb.git"},"description":"context.qb drift detector CLI — checks that context.qb.yaml matches the actual repo it describes. An Industrial Semiotics project.","maintainers":[{"name":"contextqb","email":"info@contextqb.com"}],"readme":"# @context-qb/cli\n\nCLI tooling for the [`context.qb` format](https://github.com/ContextQB/contextqb/blob/main/format/SPEC.md). Currently provides one command — `check-qb`, the drift detector — with more on the way per the [format ROADMAP](https://github.com/ContextQB/contextqb/blob/main/format/ROADMAP.md).\n\n## What's here\n\n```\npackages/qb/cli/\n├── package.json\n├── tsconfig.json\n├── README.md            # this file\n├── CHANGELOG.md         # version history (Keep a Changelog format)\n└── src/\n    ├── types.ts         # DriftFinding, DetectorContext, AdrStatus, etc.\n    ├── loader.ts        # loadContext, lineOf (reads paths.decisions: if set)\n    ├── adapters.ts      # thin re-export of three dispatchers\n    ├── detectors.ts     # detectTreeDrift, detectRoutesDrift, detectDecisionsDrift\n    ├── cli.ts           # parseArgs, main, isEntryPoint guard\n    ├── index.ts         # public surface re-exports\n    └── adapters/\n        ├── workspaces/\n        │   ├── pnpm.ts      # pnpm-workspace.yaml reader\n        │   ├── npm.ts       # package.json#workspaces (npm + yarn classic + yarn berry)\n        │   └── index.ts     # dispatcher: pnpm wins, npm fallback\n        ├── routes/\n        │   ├── wrangler.ts  # Cloudflare Workers (wrangler.jsonc)\n        │   ├── vercel.ts    # Vercel (vercel.json)\n        │   ├── netlify.ts   # Netlify (netlify.toml)\n        │   ├── fly.ts       # Fly.io (fly.toml)\n        │   └── index.ts     # dispatcher: aggregates all four\n        └── decisions/\n            └── index.ts     # configurable path via paths.decisions:\n```\n\n## The drift detector — `check-qb`\n\n`check-qb` reads `context.qb.yaml` at the repo root and compares three of its sections against authoritative sources of truth:\n\n| Section in the qb file | Source of truth                                                                                                | What drift looks like                                                                                                            |\n| ---------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |\n| `tree:`                | pnpm (`pnpm-workspace.yaml`) **or** npm/yarn (`package.json#workspaces`) — pnpm wins when both exist           | A new workspace exists without a `tree:` entry, or a `tree:` key has no matching directory                                       |\n| `routes:`              | Cloudflare (`wrangler.jsonc`), Vercel (`vercel.json`), Netlify (`netlify.toml`), Fly (`fly.toml`) — aggregated | A config declares a route the qb file doesn't list, or vice-versa (with §5.2.1 exemptions for externally-managed routes)         |\n| `decisions:`           | ADRs at `docs/architecture/decisions/` **or** the path set in `paths.decisions:`                               | A new ADR exists without a `decisions:` entry, or the qb file's parenthesised status disagrees with the ADR's `**Status:**` line |\n\n<a id=\"adapter-matrix\"></a>\n\n### Adapter matrix\n\nv2.0.0 ships adapters for the following sources of truth. If your setup isn't listed, the detector skips that section gracefully (no false positives).\n\n| Section      | Config / file                                           | Package manager / platform      | Notes                                                                                      |\n| ------------ | ------------------------------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------ |\n| `tree:`      | `pnpm-workspace.yaml`                                   | pnpm                            | Glob patterns evaluated against `**/package.json`                                          |\n| `tree:`      | `package.json#workspaces`                               | npm / yarn classic / yarn berry | Falls back when no pnpm-workspace file; supports both array and object (`packages:`) forms |\n| `routes:`    | `apps/*/wrangler.jsonc`                                 | Cloudflare Workers              | Reads `routes[]` array                                                                     |\n| `routes:`    | `apps/*/vercel.json`                                    | Vercel                          | Reads `routes[].src` patterns                                                              |\n| `routes:`    | `apps/*/netlify.toml`                                   | Netlify                         | Reads `[[redirects]]` table array                                                          |\n| `routes:`    | `apps/*/fly.toml`                                       | Fly.io                          | Reads `[[services.ports]]` or `[http_service]`                                             |\n| `decisions:` | `docs/architecture/decisions/*.md` (default)            | —                               | Matches `NNNN-*.md` naming convention                                                      |\n| `decisions:` | Custom path via `paths.decisions:` in `context.qb.yaml` | —                               | Overrides the default; useful for repos with non-standard ADR locations                    |\n\nFindings are emitted lint-style:\n\n```\ncontext.qb.yaml:32  error    tree-missing-entry         workspace \"apps/billing\" exists but is not declared in tree:\ncontext.qb.yaml:71  error    decisions-status-drift     decisions[\"0010\"] qb says \"accepted\" but ADR file says \"superseded\"\ndocs/architecture/decisions/0099-bad.md  warning  internal-adr-missing-status  0099-bad.md is missing a parseable `**Status:**` line; ADR omitted from decisions comparison\n\n[check-qb] 3 findings: 2 errors, 1 warning, 0 info\n```\n\nOn a clean repo: `[check-qb] no drift detected.` and exit 0.\n\nFindings are sorted by `qbLine` ascending (undefined last), then `code` alphabetical. Same sort in both human and JSON modes — diffing the two outputs is straightforward.\n\n### Exit codes\n\n| Code | Meaning                                                           |\n| ---- | ----------------------------------------------------------------- |\n| 0    | No drift, OR only `info`-severity findings (wildcard routes etc.) |\n| 1    | At least one `error` or `warning` finding                         |\n| 2    | Malformed or missing qb file (loader-level abort)                 |\n\n### `--json` mode\n\n```bash\npnpm check:qb --json\n```\n\nEmits `{ findings: DriftFinding[], summary: { total, errors, warnings, info } }` as a single line of compact JSON on stdout. Parseable by `jq`. Stable shape across v1.x. Useful for CI gates, IDE integrations, and pipelines.\n\nExample:\n\n```bash\npnpm check:qb --json | jq '.summary.errors'\n```\n\n## Installation\n\n```bash\n# Install as a dev dependency\npnpm add -D @context-qb/cli\n# or with npm\nnpm install --save-dev @context-qb/cli\n```\n\nThe package provides a `contextqb` binary that runs the drift detector.\n\n## Playbooks\n\nTwo operator-facing playbooks walk through the detector end-to-end:\n\n- [Set Up Drift Detection on Day One](https://github.com/ContextQB/contextqb/blob/main/content/playbooks/set-up-drift-detection.md) — for new projects authoring their first `context.qb.yaml`.\n- [Retrofit Drift Detection on an Existing Repo](https://github.com/ContextQB/contextqb/blob/main/content/playbooks/retrofit-drift-detection.md) — for projects with accumulated state that predates the discipline.\n\n## Usage\n\n```bash\n# Run the drift detector\npnpm contextqb                             # detect drift against ./context.qb.yaml\npnpm contextqb --file path/to/other.yaml   # detect drift in a different repo\npnpm contextqb --json                      # machine-readable output for CI / IDE / jq pipelines\npnpm contextqb --help                      # usage summary\n```\n\nOr add a script to your `package.json`:\n\n```json\n{\n  \"scripts\": {\n    \"check:qb\": \"contextqb\"\n  }\n}\n```\n\n**Note on `--file`:** when you pass `--file <path>`, the file's parent directory becomes the implicit repo root for adapter reads (`pnpm-workspace.yaml`, `apps/*/wrangler.jsonc`, `docs/architecture/decisions/*.md`). This lets you point at a fully self-contained fixture or another repository without contaminating the comparison with the current repo's sources of truth.\n\n### Internal dogfooding\n\nThis repo (`contextqb`) consumes its own published `@context-qb/cli` from npm — the root `package.json` lists it as a `devDependency` and `pnpm check:qb` invokes the npm-installed binary, not the local source. This ensures the same code path is exercised in development as consumers will hit in production.\n\n## Library surface\n\nIf you want to drive the detector programmatically (e.g. from a test harness or a custom workflow), the public surface is the module's exports:\n\n```ts\nimport {\n  loadContext,\n  lineOf,\n  detectTreeDrift,\n  detectRoutesDrift,\n  detectDecisionsDrift,\n  type DriftFinding,\n  type DetectorContext,\n} from \"@context-qb/cli\";\n\nconst ctx = await loadContext(repoRoot);\nconst findings = [...detectTreeDrift(ctx), ...detectRoutesDrift(ctx), ...detectDecisionsDrift(ctx)];\n```\n\n`loadContext` is import-safe — pulling it in does not trigger the CLI's `main()` (see the `isEntryPoint` guard in `cli.ts`).\n\n## Status\n\n| Version | What                                                                                             | Status |\n| ------- | ------------------------------------------------------------------------------------------------ | ------ |\n| 1.0.0   | Initial drift detector (pnpm + Cloudflare + ADR default-path)                                    | ✓      |\n| 1.0.1   | Published to npm; dogfooded in this repo                                                         | ✓      |\n| 2.0.0   | Multi-format adapter expansion (npm/yarn, Vercel/Netlify/Fly, `paths.decisions:`)                | ✓      |\n| 2.0.x   | Security hardening — npm metadata, INV-PUB-1 stripping of private path leaks                     | ✓      |\n| 2.1.0   | Telemetry completeness — `event_kind`, `subcommand`, `adapter_coverage`, schema v2 (ADR-0028 PR) | ✓      |\n| 2.2.0   | Telemetry integrity model — signed requests, HMAC-SHA256 (ADR-0028, INV-INT-1)                   | ✓      |\n| 2.3.0   | `project_id` support — per-project counting in cooperative aggregates (ADR-0032 / 0033)          | ✓      |\n| 2.4.0   | Always-on upgrade notice + `contextqb upgrade` subcommand (ADR-0034, INV-CLI-UPD-1)              | ✓      |\n| 2.4.1   | Documentation refresh (Status table, env-vars, first-run prompt clarity)                         | ✓      |\n| 2.5.0   | `project-id --accept` flag + pending-suggestion guard rails (cli-upgrade-feedback-followup FB.2) | ✓      |\n\nSee the [full changelog](https://github.com/ContextQB/contextqb/blob/main/cli/CHANGELOG.md) for release notes.\n\n## Design notes\n\n- **Adapters never emit findings.** They surface per-file errors as `console.warn` to stderr. Promoting those to real `DriftFinding`s lands in Task 9 alongside JSON output.\n- **Detectors are pure** `(ctx) => DriftFinding[]`. They never read the filesystem directly; the loader builds `ctx.pathExists` as a bounded existence-check helper.\n- **DNS hostnames are case-insensitive** (RFC 4343). The routes detector lowercases on both sides of the comparison so a capitalised qb hostname matches a lowercase wrangler entry.\n- **The `index:` synthetic key** in `decisions:` is filtered out before comparison so it never fires `decisions-stale-entry` for lack of a `0XXX-index.md` ADR file.\n- **No build step required during development.** `tsx` runs the TypeScript sources directly. The `typecheck` script keeps the workspace covered by `pnpm typecheck`. A build step + `dist/` output can be added later when we want to publish to npm.\n\n## All Subcommands\n\nThe CLI provides five subcommands. `check` is the default if no subcommand is specified.\n\n```\nUsage: contextqb [subcommand] [options]\n\nSubcommands:\n  check (default)     Drift detector for context.qb.yaml\n  membership <cmd>    Manage your membership (register|revoke|status|project-id)\n  mcp setup           Generate MCP client config snippets\n  insights <topic>    Query community insights (stack|structure|mistakes|deploy)\n  upgrade             Print the install command for upgrading to the latest CLI version\n\nOptions:\n  --file <path>         Use the qb file at <path>\n  --json                Emit machine-readable JSON output\n  --no-telemetry        Skip telemetry for this run\n  --telemetry-preview   Print telemetry payload without sending\n  --telemetry-debug     Show errors when telemetry fails\n  --help                Show this message and exit\n```\n\n### `contextqb check` (default)\n\nDrift detector — documented in detail above.\n\n### `contextqb membership`\n\nMembership management for the data cooperative (see [the privacy & telemetry page](https://contextqb.com/privacy/telemetry) for details).\n\n```bash\ncontextqb membership register      # Explicitly register (rare — auto-provision is the normal path)\ncontextqb membership revoke        # Revoke membership and delete all server-side data (sticky opt-out)\ncontextqb membership status        # Show current membership info\ncontextqb membership project-id    # Show the current project_id\ncontextqb membership project-id --accept      # Write the most recently suggested UUID\ncontextqb membership project-id --regenerate  # Generate and write a fresh UUID\n```\n\n**Project ID workflow:** When you first run `contextqb check` on a project without a `project_id`, the CLI suggests a UUID and caches it locally. You can either copy it manually or run `--accept` to write it automatically. If you run `--regenerate` while a suggestion is pending, the CLI warns you and requires `--force-fresh` to proceed. Both `--accept` and `--regenerate` use `yaml.Document.set`, which preserves all comments and key ordering in `context.qb.yaml`.\n\n**Sticky opt-out (INV-6):** When you revoke, the local credentials file is rewritten to `{ opted_out: true }`. Subsequent CLI runs will not re-provision a token. To re-enable, delete the credentials file and run any `contextqb` command.\n\n### `contextqb mcp setup`\n\nGenerate a ready-to-paste MCP client config snippet with your membership token interpolated.\n\n```bash\ncontextqb mcp setup                 # Default: emits both cursor and claude blocks as JSON\ncontextqb mcp setup --client cursor # Cursor-specific snippet only\ncontextqb mcp setup --client claude # Claude Desktop snippet only\ncontextqb mcp setup --client json   # Both snippets in a single JSON object (same as default)\n```\n\n### `contextqb insights`\n\nQuery community-wide insights derived from anonymized telemetry.\n\n```bash\ncontextqb insights stack              # Defaults to --dim1 lang\ncontextqb insights stack --dim1 mono\ncontextqb insights structure          # Defaults to --dim1 tree_entries\ncontextqb insights mistakes           # Defaults to --dim1 validation_status\ncontextqb insights deploy\ncontextqb insights stack --json       # Machine-readable output\n```\n\n### `contextqb upgrade`\n\nPrint the upgrade command for the version of the CLI that's currently installed. Instructional only — does not run any installer itself.\n\n```bash\ncontextqb upgrade            # Prints the right install command for your install method\ncontextqb upgrade --json     # Machine-readable output\n```\n\nThe subcommand detects how the CLI was installed (npx, `pnpm dlx`, npm-global, pnpm-global, homebrew, local dev dependency) and prints the corresponding command. If the CLI is older than the latest published version, the upgrade notice (printed automatically on every `check` / `membership` / `mcp` / `insights` run) tells you to run `contextqb upgrade` for the install command.\n\nTopics and default dimensions:\n\n| Topic       | Dimensions                            | Default dim1        |\n| ----------- | ------------------------------------- | ------------------- |\n| `stack`     | `lang`, `mono`                        | `lang`              |\n| `structure` | `tree_entries`, `routes`, `decisions` | `tree_entries`      |\n| `mistakes`  | `validation_status`                   | `validation_status` |\n| `deploy`    | `platform`                            | (none)              |\n\n## Environment Variables\n\nCI environments are auto-detected by default — the CLI skips auto-provisioning when it sees `GITHUB_ACTIONS`, `GITLAB_CI`, `CIRCLECI`, and similar signals. See the [privacy page](https://contextqb.com/privacy/telemetry) for the full list of probed env vars.\n\n| Variable                         | Description                                                                                                                                                                                                                                                                                                                                                  |\n| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `CONTEXTQB_NO_PROVISION=true`    | Manual opt-out: skip auto-provisioning of membership. Useful on dev machines where you want no telemetry at all.                                                                                                                                                                                                                                             |\n| `CONTEXTQB_FORCE_PROVISION=true` | Override CI auto-detect: force provisioning even when a CI environment is detected. Useful for long-lived self-hosted runners you want counted as cooperative members.                                                                                                                                                                                       |\n| `CONTEXTQB_HOME=<path>`          | Override the credentials directory (default resolved via [`env-paths`](https://www.npmjs.com/package/env-paths) v4 — see paths below).                                                                                                                                                                                                                       |\n| `CONTEXTQB_UPDATE_CHECK=npm`     | **Telemetry-opt-out users only.** Re-enables the upgrade notice by polling `https://registry.npmjs.org/@context-qb/cli/latest` at most once every 24 hours. The cache is local and is never transmitted. Without telemetry, the server-piggybacked `cli_version_latest` signal does not arrive, so this is the fallback path. Opt-in only — not the default. |\n\n### Credentials file location\n\nThe CLI uses `env-paths` v4 with project name `contextqb`. Defaults per OS:\n\n| OS      | Path                                                      |\n| ------- | --------------------------------------------------------- |\n| macOS   | `~/Library/Preferences/contextqb-nodejs/credentials.json` |\n| Linux   | `~/.config/contextqb-nodejs/credentials.json`             |\n| Windows | `%APPDATA%\\contextqb-nodejs\\Config\\credentials.json`      |\n\nThe `-nodejs` suffix is added by `env-paths` to avoid clashing with native applications. When `CONTEXTQB_HOME` is set, the file inside that directory is still named `credentials.json`.\n\n## Token Rotation\n\nv1 does not provide an in-place token rotation endpoint. To rotate a token:\n\n1. Run `contextqb membership revoke` (deletes server-side data, writes sticky opt-out locally)\n2. Delete the credentials file (path varies by OS — see the table above)\n3. Run any `contextqb` command — a fresh membership is auto-provisioned\n\nSee [the apps/mcp/README on GitHub](https://github.com/ContextQB/contextqb/blob/main/apps/mcp/README.md) for server-side documentation.\n\n## About\n\nContextQB is a methodology and tooling project for building software with AI agents — principles, playbooks, audits, prompts, and the `context.qb` format that gives agents a stable, machine-validated map of your repo. Made by the technologists at [Industrial Semiotics](https://industrialsemiotics.com). Learn more at [contextqb.com](https://contextqb.com).\n\n## License\n\nMIT.\n","readmeFilename":"README.md"}