[{"data":1,"prerenderedAt":1327},["ShallowReactive",2],{"docs-page:\u002Fdocs\u002Fpackage-manager\u002Fsecurity-scanner":3,"docs-pages":982},{"id":4,"title":5,"body":6,"description":975,"extension":976,"meta":977,"navigation":231,"path":978,"seo":979,"stem":980,"__hash__":981},"docs\u002Fdocs\u002Fpackage-manager\u002Fsecurity-scanner.md","Security scanner",{"type":7,"value":8,"toc":963},"minimark",[9,13,52,96,103,114,126,131,148,165,184,188,199,470,475,501,515,533,537,540,644,657,661,719,723,736,746,750,759,810,816,820,875,879,896,911,915,938,942,959],[10,11,5],"h1",{"id":12},"security-scanner",[14,15,16,17,24,25,29,30,33,34,37,38,43,44,51],"p",{},"scpm ships a drop-in implementation of ",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fbun.sh\u002Fdocs\u002Fpm\u002Fsecurity-scanner-api",[22],"nofollow","Bun's Security Scanner\nAPI",". Point\n",[26,27,28],"code",{},"securityScanner"," at the same npm package you'd put in Bun's\n",[26,31,32],{},"bunfig.toml#install.security.scanner"," and scpm loads the module\nthrough a ",[26,35,36],{},"node"," bridge that adapts Bun's in-process plugin\ncontract to a subprocess. The reference scanner template at\n",[18,39,42],{"href":40,"rel":41},"https:\u002F\u002Fgithub.com\u002Foven-sh\u002Fsecurity-scanner-template",[22],"oven-sh\u002Fsecurity-scanner-template","\nand the production scanner at\n",[18,45,48],{"href":46,"rel":47},"https:\u002F\u002Fgithub.com\u002FSocketDev\u002Fbun-security-scanner",[22],[26,49,50],{},"@socketsecurity\u002Fbun-security-scanner","\nboth run unchanged.",[53,54,59],"pre",{"className":55,"code":56,"language":57,"meta":58,"style":58},"language-yaml shiki shiki-themes github-light github-dark","# scpm-workspace.yaml\nsecurityScanner: \"@acme\u002Fbun-security-scanner\"\n# or a path to a local scanner:\n# securityScanner: .\u002Fscripts\u002Fscanner.mjs\n","yaml","",[26,60,61,70,84,90],{"__ignoreMap":58},[62,63,66],"span",{"class":64,"line":65},"line",1,[62,67,69],{"class":68},"sJ8bj","# scpm-workspace.yaml\n",[62,71,73,76,80],{"class":64,"line":72},2,[62,74,28],{"class":75},"s9eBZ",[62,77,79],{"class":78},"sVt8B",": ",[62,81,83],{"class":82},"sZZnC","\"@acme\u002Fbun-security-scanner\"\n",[62,85,87],{"class":64,"line":86},3,[62,88,89],{"class":68},"# or a path to a local scanner:\n",[62,91,93],{"class":64,"line":92},4,[62,94,95],{"class":68},"# securityScanner: .\u002Fscripts\u002Fscanner.mjs\n",[14,97,98,99,102],{},"Install the scanner package as a dev dep so it lives in\n",[26,100,101],{},"node_modules\u002F"," by the time the gate runs:",[53,104,108],{"className":105,"code":106,"language":107,"meta":58,"style":58},"language-sh shiki shiki-themes github-light github-dark","scpm add -D @acme\u002Fbun-security-scanner\n","sh",[26,109,110],{"__ignoreMap":58},[62,111,112],{"class":64,"line":65},[62,113,106],{},[14,115,116,117,121,122,125],{},"The empty string (the default) disables the integration. Requires\n",[118,119,120],"strong",{},"Node 22.6+"," on ",[26,123,124],{},"PATH",".",[127,128,130],"h2",{"id":129},"when-the-scanner-runs","When the scanner runs",[14,132,133,136,137,140,141,143,144,147],{},[118,134,135],{},"Post-resolve, once per command invocation."," After the resolver\nreturns a finalized graph and before the fetch \u002F link phase starts,\nscpm extracts every resolved ",[26,138,139],{},"(name, version)"," pair — root direct\ndeps plus every transitive — and hands the full set to the scanner\nin one ",[26,142,36],{}," subprocess call. A ",[26,145,146],{},"fatal"," advisory aborts before any\ntarball downloads happen.",[14,149,150,151,154,155,158,159,161,162,164],{},"The same gate covers ",[26,152,153],{},"scpm install"," and ",[26,156,157],{},"scpm add"," (since ",[26,160,157],{}," runs the install pipeline internally). One ",[26,163,36],{}," spawn per\ncommand invocation, regardless of how many packages are in the\ngraph.",[14,166,167,168,171,172,175,176,179,180,183],{},"Scoped private packages, ",[26,169,170],{},"file:"," \u002F ",[26,173,174],{},"link:"," \u002F workspace siblings,\ngit deps, and remote tarballs are excluded from the payload —\npublic-data scanners have no advisories for those. Aliased entries\n(",[26,177,178],{},"{ \"my-alias\": \"npm:real-pkg@^4\" }",") are reported under the real\nregistry name ",[26,181,182],{},"real-pkg",", not the alias.",[127,185,187],{"id":186},"authoring-a-scanner","Authoring a scanner",[14,189,190,191,194,195,198],{},"A scanner is a JavaScript (or TypeScript) module that exports a\n",[26,192,193],{},"scanner"," object with a ",[26,196,197],{},"scan({ packages })"," function:",[53,200,204],{"className":201,"code":202,"language":203,"meta":58,"style":58},"language-ts shiki shiki-themes github-light github-dark","import type { Security } from \"bun\";\n\nexport const scanner: Security.Scanner = {\n  version: \"1\",\n  async scan({ packages }) {\n    const advisories: Security.Advisory[] = [];\n    for (const p of packages) {\n      \u002F\u002F packages[i].name    — registry name (alias-resolved)\n      \u002F\u002F packages[i].version — resolved version, e.g. \"4.17.21\"\n      if (await isMalicious(p.name, p.version)) {\n        advisories.push({\n          level: \"fatal\",\n          package: p.name,\n          description: \"Reported as malicious\",\n          url: `https:\u002F\u002Fexample.org\u002F${p.name}`,\n        });\n      }\n    }\n    return advisories;\n  },\n};\n","ts",[26,205,206,227,233,263,274,293,320,341,347,353,370,382,393,399,410,431,437,443,449,458,464],{"__ignoreMap":58},[62,207,208,212,215,218,221,224],{"class":64,"line":65},[62,209,211],{"class":210},"szBVR","import",[62,213,214],{"class":210}," type",[62,216,217],{"class":78}," { Security } ",[62,219,220],{"class":210},"from",[62,222,223],{"class":82}," \"bun\"",[62,225,226],{"class":78},";\n",[62,228,229],{"class":64,"line":72},[62,230,232],{"emptyLinePlaceholder":231},true,"\n",[62,234,235,238,241,245,248,252,254,257,260],{"class":64,"line":86},[62,236,237],{"class":210},"export",[62,239,240],{"class":210}," const",[62,242,244],{"class":243},"sj4cs"," scanner",[62,246,247],{"class":210},":",[62,249,251],{"class":250},"sScJk"," Security",[62,253,125],{"class":78},[62,255,256],{"class":250},"Scanner",[62,258,259],{"class":210}," =",[62,261,262],{"class":78}," {\n",[62,264,265,268,271],{"class":64,"line":92},[62,266,267],{"class":78},"  version: ",[62,269,270],{"class":82},"\"1\"",[62,272,273],{"class":78},",\n",[62,275,277,280,283,286,290],{"class":64,"line":276},5,[62,278,279],{"class":210},"  async",[62,281,282],{"class":250}," scan",[62,284,285],{"class":78},"({ ",[62,287,289],{"class":288},"s4XuR","packages",[62,291,292],{"class":78}," }) {\n",[62,294,296,299,302,304,306,308,311,314,317],{"class":64,"line":295},6,[62,297,298],{"class":210},"    const",[62,300,301],{"class":243}," advisories",[62,303,247],{"class":210},[62,305,251],{"class":250},[62,307,125],{"class":78},[62,309,310],{"class":250},"Advisory",[62,312,313],{"class":78},"[] ",[62,315,316],{"class":210},"=",[62,318,319],{"class":78}," [];\n",[62,321,323,326,329,332,335,338],{"class":64,"line":322},7,[62,324,325],{"class":210},"    for",[62,327,328],{"class":78}," (",[62,330,331],{"class":210},"const",[62,333,334],{"class":243}," p",[62,336,337],{"class":210}," of",[62,339,340],{"class":78}," packages) {\n",[62,342,344],{"class":64,"line":343},8,[62,345,346],{"class":68},"      \u002F\u002F packages[i].name    — registry name (alias-resolved)\n",[62,348,350],{"class":64,"line":349},9,[62,351,352],{"class":68},"      \u002F\u002F packages[i].version — resolved version, e.g. \"4.17.21\"\n",[62,354,356,359,361,364,367],{"class":64,"line":355},10,[62,357,358],{"class":210},"      if",[62,360,328],{"class":78},[62,362,363],{"class":210},"await",[62,365,366],{"class":250}," isMalicious",[62,368,369],{"class":78},"(p.name, p.version)) {\n",[62,371,373,376,379],{"class":64,"line":372},11,[62,374,375],{"class":78},"        advisories.",[62,377,378],{"class":250},"push",[62,380,381],{"class":78},"({\n",[62,383,385,388,391],{"class":64,"line":384},12,[62,386,387],{"class":78},"          level: ",[62,389,390],{"class":82},"\"fatal\"",[62,392,273],{"class":78},[62,394,396],{"class":64,"line":395},13,[62,397,398],{"class":78},"          package: p.name,\n",[62,400,402,405,408],{"class":64,"line":401},14,[62,403,404],{"class":78},"          description: ",[62,406,407],{"class":82},"\"Reported as malicious\"",[62,409,273],{"class":78},[62,411,413,416,419,421,423,426,429],{"class":64,"line":412},15,[62,414,415],{"class":78},"          url: ",[62,417,418],{"class":82},"`https:\u002F\u002Fexample.org\u002F${",[62,420,14],{"class":78},[62,422,125],{"class":82},[62,424,425],{"class":78},"name",[62,427,428],{"class":82},"}`",[62,430,273],{"class":78},[62,432,434],{"class":64,"line":433},16,[62,435,436],{"class":78},"        });\n",[62,438,440],{"class":64,"line":439},17,[62,441,442],{"class":78},"      }\n",[62,444,446],{"class":64,"line":445},18,[62,447,448],{"class":78},"    }\n",[62,450,452,455],{"class":64,"line":451},19,[62,453,454],{"class":210},"    return",[62,456,457],{"class":78}," advisories;\n",[62,459,461],{"class":64,"line":460},20,[62,462,463],{"class":78},"  },\n",[62,465,467],{"class":64,"line":466},21,[62,468,469],{"class":78},"};\n",[14,471,472,247],{},[118,473,474],{},"Levels",[476,477,478,488,498],"ul",{},[479,480,481,483,484,487],"li",{},[26,482,146],{}," — aborts the install with\n",[26,485,486],{},"ERR_SCPM_SECURITY_SCANNER_FATAL"," (exit 48).",[479,489,490,493,494,497],{},[26,491,492],{},"warn"," — emits ",[26,495,496],{},"WARN_SCPM_SECURITY_SCANNER_FINDING"," and lets\nthe install proceed.",[479,499,500],{},"Anything else — logged at debug level and otherwise ignored\n(future-proof for additional levels).",[14,502,503,506,507,510,511,514],{},[118,504,505],{},"Return shape",": Bun's docs specify the return value is\n",[26,508,509],{},"Advisory[]",". SCPM also accepts ",[26,512,513],{},"{ advisories: [...] }"," as a\nfriendly fallback for scanners that wrap their result.",[14,516,517,518,521,522,171,525,528,529,532],{},"The published ",[26,519,520],{},"@types\u002Fbun"," package ships the canonical\n",[26,523,524],{},"Bun.Security.Scanner",[26,526,527],{},"Bun.Security.Package"," \u002F\n",[26,530,531],{},"Bun.Security.Advisory"," types — install it as a dev dep when\nauthoring a TypeScript scanner.",[127,534,536],{"id":535},"bun-runtime-apis-scpm-shims","Bun runtime APIs scpm shims",[14,538,539],{},"Real published scanners use a small but specific slice of the Bun\nruntime. The bridge ships shims so they work unchanged:",[541,542,543,556],"table",{},[544,545,546],"thead",{},[547,548,549,553],"tr",{},[550,551,552],"th",{},"Bun API",[550,554,555],{},"scpm shim",[557,558,559,578,591,617,627],"tbody",{},[547,560,561,567],{},[562,563,564],"td",{},[26,565,566],{},"import Bun from 'bun'",[562,568,569,570,573,574,577],{},"Resolves to an scpm virtual module via a Node ",[26,571,572],{},"module.register()"," loader hook. ",[26,575,576],{},"globalThis.Bun"," is also populated.",[547,579,580,585],{},[562,581,582],{},[26,583,584],{},"Bun.env",[562,586,587,588,125],{},"Alias for ",[26,589,590],{},"process.env",[547,592,593,598],{},[562,594,595],{},[26,596,597],{},"Bun.file(path)",[562,599,600,601,604,605,604,608,604,611,604,614,125],{},"Returns an object with ",[26,602,603],{},".exists()",", ",[26,606,607],{},".text()",[26,609,610],{},".json()",[26,612,613],{},".arrayBuffer()",[26,615,616],{},".bytes()",[547,618,619,624],{},[562,620,621],{},[26,622,623],{},"Bun.write(path, data)",[562,625,626],{},"Writes a file (supports strings, ArrayBuffer, TypedArray, BunFile-like objects, or anything JSON-serializable).",[547,628,629,634],{},[562,630,631],{},[26,632,633],{},"Bun.semver.satisfies(version, range)",[562,635,636,637,640,641,643],{},"Delegates to the project's ",[26,638,639],{},"semver"," npm package (near-universal transitive dep). Falls back to exact-equality comparison with a one-time stderr warning if ",[26,642,639],{}," isn't resolvable.",[14,645,646,647,650,651,273,653,656],{},"That surface covers everything the oven-sh template\n(",[26,648,649],{},"Bun.semver.satisfies",") and the Socket scanner (",[26,652,584],{},[26,654,655],{},"Bun.file",") actually call.",[127,658,660],{"id":659},"differences-from-bun","Differences from Bun",[476,662,663,681,702],{},[479,664,665,666,668,669,672,673,676,677,680],{},"Requires ",[118,667,120],{}," so the bridge can pass\n",[26,670,671],{},"--experimental-strip-types"," to load ",[26,674,675],{},".ts"," scanner entrypoints\ndirectly (Socket's package, for example, ships raw TypeScript\nvia ",[26,678,679],{},"\"exports\": \".\u002Fsrc\u002Findex.ts\""," with no build step).",[479,682,683,684,604,687,273,690,693,694,697,698,701],{},"Bun-runtime APIs outside the shim — ",[26,685,686],{},"Bun.spawn",[26,688,689],{},"Bun.password",[26,691,692],{},"Bun.serve",", the web framework, the test runner — throw at\nruntime. The bridge surfaces this as\n",[26,695,696],{},"ERR_SCPM_SECURITY_SCANNER_FAILED"," and the install ",[118,699,700],{},"fails\nclosed"," (see below).",[479,703,704,705,707,708,710,711,714,715,718],{},"A ",[26,706,146],{}," advisory on ",[26,709,157],{}," exits non-zero with\n",[26,712,713],{},"package.json"," already mutated. Bun behaves the same way;\nrevert with ",[26,716,717],{},"git checkout package.json"," if you don't want to\nkeep the edit.",[127,720,722],{"id":721},"failure-semantics","Failure semantics",[14,724,725,728,729,731,732,735],{},[118,726,727],{},"Fail closed"," on any scanner failure: ",[26,730,36],{}," missing on PATH,\nscanner module unresolvable in ",[26,733,734],{},"node_modules",", non-zero exit, 30\nsecond timeout, unparseable JSON output, scanner throws. A\nconfigured scanner that can't run is treated as a refusal —\nsilently bypassing on failure would defeat the entire point of\nopting in.",[14,737,738,739,742,743,745],{},"Escape hatch: set ",[26,740,741],{},"securityScanner = \"\""," to disable the\nintegration. Operators bootstrapping a project (the scanner\npackage isn't in ",[26,744,734],{}," on first install) or recovering\nfrom a broken scanner can unset, complete the install, then\nre-enable.",[127,747,749],{"id":748},"performance","Performance",[14,751,752,753,755,756,758],{},"One ",[26,754,36],{}," subprocess per command invocation. The scanner sees the\nfull resolved graph in one batched ",[26,757,197],{}," call — no\nper-package round-trips. Cold-start cost is bounded:",[541,760,761,771],{},[544,762,763],{},[547,764,765,768],{},[550,766,767],{},"Phase",[550,769,770],{},"Approx. cost",[557,772,773,783,791,799],{},[547,774,775,780],{},[562,776,777,779],{},[26,778,36],{}," cold start",[562,781,782],{},"50–150 ms",[547,784,785,788],{},[562,786,787],{},"Bridge + shim load",[562,789,790],{},"50–200 ms",[547,792,793,796],{},[562,794,795],{},"Scanner module load",[562,797,798],{},"depends on scanner",[547,800,801,807],{},[562,802,803,806],{},[26,804,805],{},"scan()"," invocation",[562,808,809],{},"depends on scanner (Socket's hits their API for verdicts)",[14,811,812,813,815],{},"A passing ",[26,814,153],{}," against a scanner that returns no\nadvisories typically adds well under one second. Warm-cache\ninstalls that short-circuit before resolve don't run the scanner\nat all.",[127,817,819],{"id":818},"security-hardening","Security hardening",[476,821,822,844,850,864],{},[479,823,824,825,273,828,604,831,604,834,837,838,841,842,125],{},"The subprocess environment is scrubbed of ",[26,826,827],{},"SCPM_AUTH_TOKEN",[26,829,830],{},"NPM_TOKEN",[26,832,833],{},"NODE_AUTH_TOKEN",[26,835,836],{},"GITHUB_TOKEN",", and ",[26,839,840],{},"GH_TOKEN","\nbefore exec. A hostile or compromised scanner package can't\nread those out of ",[26,843,590],{},[479,845,846,849],{},[26,847,848],{},"kill_on_drop(true)"," on the spawn ensures a hung scanner is\nSIGKILLed at the 30 s timeout instead of leaking as an orphan\nprocess.",[479,851,852,853,857,858,861,862,125],{},"The scanner module is loaded with the ",[854,855,856],"em",{},"project root"," as ",[26,859,860],{},"cwd",",\nnot scpm's working directory. Module resolution from the\nscanner uses the project's ",[26,863,734],{},[479,865,866,867,870,871,874],{},"The bridge writes three short ",[26,868,869],{},".mjs"," files (the shim, the\nloader hook, the runner) to a fresh ",[26,872,873],{},"tempfile::TempDir"," per\ninvocation. The temp dir is cleaned up when the subprocess\nexits.",[127,876,878],{"id":877},"configuring-an-existing-bun-scanner","Configuring an existing Bun scanner",[14,880,881,882,885,886,889,890,892,893,895],{},"Most Bun-compatible scanners are published as npm packages with a\nsingle ",[26,883,884],{},"securityScanner = \"\u003Cpackage-name>\""," line. Some accept\nextra configuration via environment variables (Socket, for\nexample, reads ",[26,887,888],{},"SOCKET_SECURITY_API_KEY"," from ",[26,891,584],{},"). Set\nthose in the parent shell environment — scpm's bridge passes\n",[26,894,590],{}," through (minus the token scrub list above).",[53,897,899],{"className":105,"code":898,"language":107,"meta":58,"style":58},"export SOCKET_SECURITY_API_KEY=\"…\"\nscpm install   # scanner sees SOCKET_SECURITY_API_KEY via Bun.env\n",[26,900,901,906],{"__ignoreMap":58},[62,902,903],{"class":64,"line":65},[62,904,905],{},"export SOCKET_SECURITY_API_KEY=\"…\"\n",[62,907,908],{"class":64,"line":72},[62,909,910],{},"scpm install   # scanner sees SOCKET_SECURITY_API_KEY via Bun.env\n",[127,912,914],{"id":913},"related-settings","Related settings",[476,916,917,925],{},[479,918,919,924],{},[18,920,922],{"href":921},"\u002Fdocs\u002Fsettings\u002F#setting-securityscanner",[26,923,28],{}," — the\nmodule spec.",[479,926,927,933,934,937],{},[18,928,930],{"href":929},"\u002Fdocs\u002Fsettings\u002F#setting-paranoid",[26,931,932],{},"paranoid"," — does ",[118,935,936],{},"not","\ncurrently enable a default scanner. If you want a scanner\nrunning in CI, configure it explicitly.",[127,939,941],{"id":940},"related-codes","Related codes",[476,943,944,949,954],{},[479,945,946,948],{},[26,947,486],{}," (exit 48) — scanner returned\na fatal advisory.",[479,950,951,953],{},[26,952,696],{}," — scanner couldn't run\n(fail-closed contract).",[479,955,956,958],{},[26,957,496],{}," — scanner returned a\nwarn-level advisory.",[960,961,962],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":58,"searchDepth":72,"depth":72,"links":964},[965,966,967,968,969,970,971,972,973,974],{"id":129,"depth":72,"text":130},{"id":186,"depth":72,"text":187},{"id":535,"depth":72,"text":536},{"id":659,"depth":72,"text":660},{"id":721,"depth":72,"text":722},{"id":748,"depth":72,"text":749},{"id":818,"depth":72,"text":819},{"id":877,"depth":72,"text":878},{"id":913,"depth":72,"text":914},{"id":940,"depth":72,"text":941},"scpm ships a drop-in implementation of Bun's Security Scanner\nAPI. Point\nsecurityScanner at the same npm package you'd put in Bun's\nbunfig.toml#install.security.scanner and scpm loads the module\nthrough a node bridge that adapts Bun's in-process plugin\ncontract to a subprocess. The reference scanner template at\noven-sh\u002Fsecurity-scanner-template\nand the production scanner at\n@socketsecurity\u002Fbun-security-scanner\nboth run unchanged.","md",{},"\u002Fdocs\u002Fpackage-manager\u002Fsecurity-scanner",{"title":5,"description":975},"docs\u002Fpackage-manager\u002Fsecurity-scanner","zD6O7Yp21SoIiBoV19lk2b_BPilOYcxXy69yYVkt4jg",[983,986,989,991,994,997,1000,1003,1006,1009,1012,1015,1018,1021,1024,1027,1030,1033,1036,1039,1042,1045,1048,1051,1054,1057,1060,1063,1066,1069,1072,1075,1078,1081,1084,1087,1090,1093,1096,1099,1102,1105,1108,1111,1114,1117,1120,1123,1125,1128,1131,1134,1137,1140,1143,1146,1149,1152,1155,1158,1161,1164,1167,1170,1173,1176,1179,1182,1185,1188,1191,1194,1197,1200,1203,1206,1209,1212,1215,1218,1221,1224,1227,1230,1233,1236,1239,1242,1245,1248,1251,1254,1257,1260,1263,1266,1269,1272,1275,1278,1281,1284,1287,1290,1293,1296,1297,1300,1303,1306,1309,1312,1315,1318,1321,1324],{"path":984,"title":985},"\u002Fdocs\u002Fbenchmarks","Benchmarks",{"path":987,"title":988},"\u002Fdocs\u002Fbun-users","For bun users",{"path":990,"title":157},"\u002Fdocs\u002Fcli\u002Fadd",{"path":992,"title":993},"\u002Fdocs\u002Fcli\u002Fapprove-builds","scpm approve-builds",{"path":995,"title":996},"\u002Fdocs\u002Fcli\u002Faudit","scpm audit",{"path":998,"title":999},"\u002Fdocs\u002Fcli\u002Fbin","scpm bin",{"path":1001,"title":1002},"\u002Fdocs\u002Fcli\u002Fcache","scpm cache",{"path":1004,"title":1005},"\u002Fdocs\u002Fcli\u002Fcache\u002Fdelete","scpm cache delete",{"path":1007,"title":1008},"\u002Fdocs\u002Fcli\u002Fcache\u002Flist","scpm cache list",{"path":1010,"title":1011},"\u002Fdocs\u002Fcli\u002Fcache\u002Flist-registries","scpm cache list-registries",{"path":1013,"title":1014},"\u002Fdocs\u002Fcli\u002Fcache\u002Fprune","scpm cache prune",{"path":1016,"title":1017},"\u002Fdocs\u002Fcli\u002Fcache\u002Fview","scpm cache view",{"path":1019,"title":1020},"\u002Fdocs\u002Fcli\u002Fcat-file","scpm cat-file",{"path":1022,"title":1023},"\u002Fdocs\u002Fcli\u002Fcat-index","scpm cat-index",{"path":1025,"title":1026},"\u002Fdocs\u002Fcli\u002Fcheck","scpm check",{"path":1028,"title":1029},"\u002Fdocs\u002Fcli\u002Fci","scpm ci",{"path":1031,"title":1032},"\u002Fdocs\u002Fcli\u002Fclean","scpm clean",{"path":1034,"title":1035},"\u002Fdocs\u002Fcli\u002Fcompletion","scpm completion",{"path":1037,"title":1038},"\u002Fdocs\u002Fcli\u002Fconfig","scpm config",{"path":1040,"title":1041},"\u002Fdocs\u002Fcli\u002Fconfig\u002Fdelete","scpm config delete",{"path":1043,"title":1044},"\u002Fdocs\u002Fcli\u002Fconfig\u002Fexplain","scpm config explain",{"path":1046,"title":1047},"\u002Fdocs\u002Fcli\u002Fconfig\u002Ffind","scpm config find",{"path":1049,"title":1050},"\u002Fdocs\u002Fcli\u002Fconfig\u002Fget","scpm config get",{"path":1052,"title":1053},"\u002Fdocs\u002Fcli\u002Fconfig\u002Flist","scpm config list",{"path":1055,"title":1056},"\u002Fdocs\u002Fcli\u002Fconfig\u002Fset","scpm config set",{"path":1058,"title":1059},"\u002Fdocs\u002Fcli\u002Fconfig\u002Ftui","scpm config tui",{"path":1061,"title":1062},"\u002Fdocs\u002Fcli\u002Fcreate","scpm create",{"path":1064,"title":1065},"\u002Fdocs\u002Fcli\u002Fdedupe","scpm dedupe",{"path":1067,"title":1068},"\u002Fdocs\u002Fcli\u002Fdeploy","scpm deploy",{"path":1070,"title":1071},"\u002Fdocs\u002Fcli\u002Fdeprecate","scpm deprecate",{"path":1073,"title":1074},"\u002Fdocs\u002Fcli\u002Fdeprecations","scpm deprecations",{"path":1076,"title":1077},"\u002Fdocs\u002Fcli\u002Fdiag","scpm diag",{"path":1079,"title":1080},"\u002Fdocs\u002Fcli\u002Fdiag\u002Fanalyze","scpm diag analyze",{"path":1082,"title":1083},"\u002Fdocs\u002Fcli\u002Fdiag\u002Fcompare","scpm diag compare",{"path":1085,"title":1086},"\u002Fdocs\u002Fcli\u002Fdist-tag","scpm dist-tag",{"path":1088,"title":1089},"\u002Fdocs\u002Fcli\u002Fdist-tag\u002Fadd","scpm dist-tag add",{"path":1091,"title":1092},"\u002Fdocs\u002Fcli\u002Fdist-tag\u002Fls","scpm dist-tag ls",{"path":1094,"title":1095},"\u002Fdocs\u002Fcli\u002Fdist-tag\u002Frm","scpm dist-tag rm",{"path":1097,"title":1098},"\u002Fdocs\u002Fcli\u002Fdlx","scpm dlx",{"path":1100,"title":1101},"\u002Fdocs\u002Fcli\u002Fdoctor","scpm doctor",{"path":1103,"title":1104},"\u002Fdocs\u002Fcli\u002Fexec","scpm exec",{"path":1106,"title":1107},"\u002Fdocs\u002Fcli\u002Ffetch","scpm fetch",{"path":1109,"title":1110},"\u002Fdocs\u002Fcli\u002Ffind-hash","scpm find-hash",{"path":1112,"title":1113},"\u002Fdocs\u002Fcli\u002Fignored-builds","scpm ignored-builds",{"path":1115,"title":1116},"\u002Fdocs\u002Fcli\u002Fimport","scpm import",{"path":1118,"title":1119},"\u002Fdocs\u002Fcli","scpm",{"path":1121,"title":1122},"\u002Fdocs\u002Fcli\u002Finit","scpm init",{"path":1124,"title":153},"\u002Fdocs\u002Fcli\u002Finstall",{"path":1126,"title":1127},"\u002Fdocs\u002Fcli\u002Flicenses","scpm licenses",{"path":1129,"title":1130},"\u002Fdocs\u002Fcli\u002Flink","scpm link",{"path":1132,"title":1133},"\u002Fdocs\u002Fcli\u002Flist","scpm list",{"path":1135,"title":1136},"\u002Fdocs\u002Fcli\u002Flogin","scpm login",{"path":1138,"title":1139},"\u002Fdocs\u002Fcli\u002Flogout","scpm logout",{"path":1141,"title":1142},"\u002Fdocs\u002Fcli\u002Foutdated","scpm outdated",{"path":1144,"title":1145},"\u002Fdocs\u002Fcli\u002Fpack","scpm pack",{"path":1147,"title":1148},"\u002Fdocs\u002Fcli\u002Fpatch","scpm patch",{"path":1150,"title":1151},"\u002Fdocs\u002Fcli\u002Fpatch-commit","scpm patch-commit",{"path":1153,"title":1154},"\u002Fdocs\u002Fcli\u002Fpatch-remove","scpm patch-remove",{"path":1156,"title":1157},"\u002Fdocs\u002Fcli\u002Fpeers","scpm peers",{"path":1159,"title":1160},"\u002Fdocs\u002Fcli\u002Fpeers\u002Fcheck","scpm peers check",{"path":1162,"title":1163},"\u002Fdocs\u002Fcli\u002Fprune","scpm prune",{"path":1165,"title":1166},"\u002Fdocs\u002Fcli\u002Fpublish","scpm publish",{"path":1168,"title":1169},"\u002Fdocs\u002Fcli\u002Fpurge","scpm purge",{"path":1171,"title":1172},"\u002Fdocs\u002Fcli\u002Fquery","scpm query",{"path":1174,"title":1175},"\u002Fdocs\u002Fcli\u002Frebuild","scpm rebuild",{"path":1177,"title":1178},"\u002Fdocs\u002Fcli\u002Frecursive","scpm recursive",{"path":1180,"title":1181},"\u002Fdocs\u002Fcli\u002Fremove","scpm remove",{"path":1183,"title":1184},"\u002Fdocs\u002Fcli\u002Frestart","scpm restart",{"path":1186,"title":1187},"\u002Fdocs\u002Fcli\u002Froot","scpm root",{"path":1189,"title":1190},"\u002Fdocs\u002Fcli\u002Frun","scpm run",{"path":1192,"title":1193},"\u002Fdocs\u002Fcli\u002Fsbom","scpm sbom",{"path":1195,"title":1196},"\u002Fdocs\u002Fcli\u002Fsponsors","scpm sponsors",{"path":1198,"title":1199},"\u002Fdocs\u002Fcli\u002Fstage","scpm stage",{"path":1201,"title":1202},"\u002Fdocs\u002Fcli\u002Fstart","scpm start",{"path":1204,"title":1205},"\u002Fdocs\u002Fcli\u002Fstop","scpm stop",{"path":1207,"title":1208},"\u002Fdocs\u002Fcli\u002Fstore","scpm store",{"path":1210,"title":1211},"\u002Fdocs\u002Fcli\u002Fstore\u002Fadd","scpm store add",{"path":1213,"title":1214},"\u002Fdocs\u002Fcli\u002Fstore\u002Fpath","scpm store path",{"path":1216,"title":1217},"\u002Fdocs\u002Fcli\u002Fstore\u002Fprune","scpm store prune",{"path":1219,"title":1220},"\u002Fdocs\u002Fcli\u002Fstore\u002Fstatus","scpm store status",{"path":1222,"title":1223},"\u002Fdocs\u002Fcli\u002Ftest","scpm test",{"path":1225,"title":1226},"\u002Fdocs\u002Fcli\u002Fundeprecate","scpm undeprecate",{"path":1228,"title":1229},"\u002Fdocs\u002Fcli\u002Funlink","scpm unlink",{"path":1231,"title":1232},"\u002Fdocs\u002Fcli\u002Funpublish","scpm unpublish",{"path":1234,"title":1235},"\u002Fdocs\u002Fcli\u002Fupdate","scpm update",{"path":1237,"title":1238},"\u002Fdocs\u002Fcli\u002Fversion","scpm version",{"path":1240,"title":1241},"\u002Fdocs\u002Fcli\u002Fview","scpm view",{"path":1243,"title":1244},"\u002Fdocs\u002Fcli\u002Fwhy","scpm why",{"path":1246,"title":1247},"\u002Fdocs\u002Ferror-codes","Error and warning codes",{"path":1249,"title":1250},"\u002Fdocs\u002Fgetting-started","Getting Started",{"path":1252,"title":1253},"\u002Fdocs\u002Fguide","Guide",{"path":1255,"title":1256},"\u002Fdocs","SCPM Documentation",{"path":1258,"title":1259},"\u002Fdocs\u002Finstallation","Installation",{"path":1261,"title":1262},"\u002Fdocs\u002Fnpm-users","For npm users",{"path":1264,"title":1265},"\u002Fdocs\u002Fpackage-manager\u002Fconfiguration","Configuration",{"path":1267,"title":1268},"\u002Fdocs\u002Fpackage-manager\u002Fdependencies","Manage dependencies",{"path":1270,"title":1271},"\u002Fdocs\u002Fpackage-manager\u002Fglobal-virtual-store","Global virtual store",{"path":1273,"title":1274},"\u002Fdocs\u002Fpackage-manager\u002Finstall","Install dependencies",{"path":1276,"title":1277},"\u002Fdocs\u002Fpackage-manager\u002Fjailed-builds","Jailed dependency builds",{"path":1279,"title":1280},"\u002Fdocs\u002Fpackage-manager\u002Flifecycle-scripts","Lifecycle scripts",{"path":1282,"title":1283},"\u002Fdocs\u002Fpackage-manager\u002Flockfiles","Lockfiles",{"path":1285,"title":1286},"\u002Fdocs\u002Fpackage-manager\u002Fnode-modules","node_modules layout",{"path":1288,"title":1289},"\u002Fdocs\u002Fpackage-manager\u002Fpublishing","Publishing",{"path":1291,"title":1292},"\u002Fdocs\u002Fpackage-manager\u002Fregistry-auth","Registry and auth",{"path":1294,"title":1295},"\u002Fdocs\u002Fpackage-manager\u002Fscripts","Run scripts and binaries",{"path":978,"title":5},{"path":1298,"title":1299},"\u002Fdocs\u002Fpackage-manager\u002Fworkspaces","Workspaces",{"path":1301,"title":1302},"\u002Fdocs\u002Fpnpm-users","For pnpm users",{"path":1304,"title":1305},"\u002Fdocs\u002Fsecurity","Security",{"path":1307,"title":1308},"\u002Fdocs\u002Fsettings\u002Fcli","CLI Settings",{"path":1310,"title":1311},"\u002Fdocs\u002Fsettings\u002Fenv","Environment Settings",{"path":1313,"title":1314},"\u002Fdocs\u002Fsettings","Settings",{"path":1316,"title":1317},"\u002Fdocs\u002Fsettings\u002Fnpmrc",".npmrc Settings",{"path":1319,"title":1320},"\u002Fdocs\u002Fsettings\u002Fworkspace-yaml","Workspace YAML Settings",{"path":1322,"title":1323},"\u002Fdocs\u002Ftroubleshooting","Troubleshooting",{"path":1325,"title":1326},"\u002Fdocs\u002Fyarn-users","For yarn users",1780584396927]