All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
5.26.1 - 2026-05-01
crypto(new export) —hash(algorithm, data, encoding)one-shot helper that prefers Node's nativecrypto.hash(added v21.7.0 / v20.12.0; ~30% faster thancreateHash().update().digest()on small inputs) with a streaming fallback.getNativeHashexposed as@internalfor testspromisesfromAsync<T>(source)— drains an async iterable into an array, per TC39 Array.fromAsync. Backed by the newArrayFromAsyncprimordial (Node 22+) with afor await+ push fallbackprimordialsArrayFromAsync— ES2024 primordial. Unbound, matchingArrayFromglobsglob/globSyncroute throughnode:fs.glob/node:fs.globSync(Node 22+) when caller options reduce tocwd+ignore(mapped toexclude); fall back to fast-glob for the wider option surface. Output paths are normalized to forward slashes on Windows to match fast-glob's contracteffects/shimmer— pure-functional shimmer engineeffects/shimmer-terminal— terminal (ANSI) renderer for the engineeffects/shimmer-keyframes— SVG keyframe batcher for the enginereleases/github-types,github-assets,github-auth,github-api,github-downloads,github-archives— six focused submodules replacing the singlereleases/githubexport
http-requestretry/backoff sites usesetTimeoutfromnode:timers/promisesinstead of hand-rollednew Promise(r => setTimeout(r, ms))dlx/cache,dlx/integrity,dlx/binary— 4 one-shot hash sites switched to the newcrypto.hash()helperpackage.json— pinpublishConfig: {access: "public", provenance: true}so attestation is a property of the package, not a property of the workflow's--provenanceCLI flag. Survives any direct-publish path that bypassesprovenance.yml.access: "public"also load-bears for first-publish of@scopedpackages on a fresh npm registry session.promise-queue.runNext— replace thePromiseResolve().then().catch().finally()chain with an async IIFE + try/catch/finally. Same semantics (deferstask.fn()by one microtask so synchronous throws become rejections), more explicit about the success/error/cleanup flow.packages/isolation.resolveRealPath— replacerealpath().catch(fallback)with try/await/catch. Same fall-back-on-ENOENT behavior, clearer that the catch is intentional.- BREAKING:
spinnerShimmerInfoshape —{ direction, speed, frame }(was:currentDir,mode,speed,step). User-facingShimmerConfigis unchanged getLatestRelease/getReleaseAssetUrlreturnundefined(was:null) when no result is found, and no longer log on success/retry — errors throw, success returns
- BREAKING:
effects/text-shimmer,effects/ultra,effects/typessubpath exports. Migrate toeffects/shimmer(+effects/shimmer-terminal);RAINBOW_GRADIENTnow lives inthemes/utils - BREAKING:
themesbarrel export. Import fromthemes/themes,themes/context,themes/utils, orthemes/types - BREAKING:
releases/githubsubpath export. Migrate to the focused submodules (see Added) getLatestRelease({ quiet })/getReleaseAssetUrl({ quiet })— the helpers no longer log
globsgetGlobMatcher— narrow thepath.matchesGlobfast-path that an earlier draft introduced.path.matchesGlobdoesn't honor the picomatch defaults (dot: true,nocase: true) that callers expect, so taking the fast-path under those defaults silently changed observable behavior — including breaking the case-insensitive default everywhere a single-pattern matcher was used. The fast-path now activates only when the caller has explicitly opted out of both defaults (nocase: falseANDdot: false), signaling "I want strict, case-sensitive, no-dotfile-match" — exactly whatpath.matchesGlobprovidesglobsglob/globSync— normalize results to forward slashes viapaths/normalize.normalizePathregardless of which backend (node:fs.globorfast-glob) was used. Restores fast-glob's forward-slash contract on Windows, wherenode:fs.globreturns native-OS separatorsglobsglob/globSync/globStreamLicenses— strip a trailing/fromignorepatterns before passing them to fast-glob. The gitignore convention of writing directory entries asdist/was silently dropped at the deep-filter level (fast-glob walked the entire subtree before discarding results), which on a largedist/could push memory past the limit. fast-glob v3.3.3 and the unreleased v4 both have the bug; tracked at mrmlnc/fast-glob#437. Same workaround as SocketDev/socket-cli#1288.releases/github-apigetLatestReleaseandgetReleaseAssetUrltransparently fall back to GraphQL when GitHub REST returns 200 + empty body (search-degraded incident shape)githubresolveRefToShaandfetchGhsaDetailsget the same GraphQL fallback for the same incident shape- All fallbacks only fire on the empty-body signature; real 404s, rate-limits, and 5xx still propagate
5.26.0 - 2026-04-27
githubGitHubEmptyBodyError— exported error class for GitHub's "search degraded" 200 OK + empty body incident shapenothrowoption ongetLatestReleaseandgetReleaseAssetUrl— returnundefinedinstead of throwing when both REST and GraphQL backends are degraded
getLatestRelease/getReleaseAssetUrlreturnundefined(was:null) when no result is found, and no longer log on success/retry — errors throw, success returnsfetchGhsaDetailsGraphQL fallback normalizes severity to lowercase to match REST shape
getLatestRelease({ quiet })/getReleaseAssetUrl({ quiet })— no longer accepted (the helpers don't log anymore)
releases/githubgetLatestReleaseandgetReleaseAssetUrlfall back to GraphQL on the empty-body incident shapegithubresolveRefToShaandfetchGhsaDetailsget the same GraphQL fallback- All fallbacks fire only on
GitHubEmptyBodyError; real 404s / rate-limits / 5xx still propagate
5.25.1 - 2026-04-27
primordialsStringPrototypeReplace/StringPrototypeReplaceAll—replaceValueaccepts the callback form, matchingString.prototype.replace
5.25.0 - 2026-04-26
primordials— public module exposing ~100 safe references to built-in constructors, static methods, and prototype methods captured at load time. Static methods keep their name (ObjectKeys,JSONParse); prototype methods are uncurried (StringPrototypeSlice(str, 0, 3)); constructors use aCtorsuffix (MapCtor,ErrorCtor)
5.24.0 - 2026-04-22
env/socket-cli-shadow— deleted (unused)
packPackage()/extractPackage()work for non-registry specs (local dir/tarball, remote tarball, git)EditablePackageJson.prepare()no longer throwsgit.find is not a functionpackPackage(<dir>)runsprepack/postpackscripts instead of throwing
5.23.0 - 2026-04-22
errorsisError(value)— spec-compliant ES2025Error.isError, cross-realm safeerrorserrorMessage(value)— readable message from any caught value (Error, primitive, object, nullish) with cause-chain supporterrorserrorStack(value)— cause-aware stack orundefinederrorsisErrnoException(value)— narrows toNodeJS.ErrnoException, cross-realm safeerrorsre-exportsUNKNOWN_ERROR
- pony-cause
messageWithCauses/stackWithCauses/findCauseByReference/getErrorCauseuseisErrorinternally — cross-realm Errors are recognized (previously returned'')
5.22.0 - 2026-04-21
releases/socket-btmgetPlatformArch()/getBinaryAssetName()— aligned with pnpm pack-app's<os>-<arch>[-<libc>]format. Windows OS segment is nowwin32(waswin)
5.21.0 - 2026-04-20
schema/validate— non-throwing Zod/TypeBox validator returning{ ok, value } | { ok, errors }schema/parse— throwing variant for fail-fast trust boundariesschema/types—Schema<T>,ValidateResult<T>,ValidationIssue,AnySchema,Infer<S>promiseswithResolvers()— spec-compliantPromise.withResolvers; uses native when available
regexpsescapeRegExp()— now spec-compliant with TC39RegExp.escape. Output shape changed: many characters now escape to\xHH(e.g.'a'→'\x61'); compiled regex behavior is preservedmemoizationMemoizeOptions<Args>— dropped unused second type parameterpackages/specsgetRepoUrlDetails()— acceptsgit+https:///git+ssh://GitHub URLs; rejects lookalike hosts. scp-stylegit@github.com:…returns{ user: '', project: '' }urlurlSearchParamAsBoolean()— accepts the same truthy vocabulary asenvAsBoolean(1/true/yes/on); empty string falls through todefaultValue
validation/*subpath retired — exports re-homed:validateSchema/parseSchema→schema/validate/schema/parse;safeJsonParse→json/parse; types →schema/typesandjson/typesmemoizationmemoizeDebounced— usememoize/memoizeAsyncwith attlinstead
versionsmaxVersion()/minVersion()— return latest/earliest prerelease for all-prerelease inputsfsfindUp()/findUpSync()— traverse up to and including the filesystem rootwordscapitalize()— safe for non-BMP characters (emoji, astral-plane scripts)wordsdetermineArticle()— case-insensitive vowel matcharchivesextractZip/extractTar/extractTarGz— missing-archive errors uniformly surface asENOENTpromise-queue— bounded queue rejects newest submission when full, preserving in-flight workcacache/cache-with-ttl— wildcard key deletion anchors both ends of the patternprocess-lock— sub-secondstaleMsvalues honored at full precision; TOCTOU window on acquisition closedsuppress-warningswithSuppressedWarnings()— no longer wipes concurrent suppressions on exitdlxLRU caches capped (binary path, package.json path); negative package.json lookups expire after 10s- Glob cache keys for array-valued options are order-insensitive
memoizationcache-hit bookkeeping is now O(1) (was O(n))cacachewildcardclear()no longer recompiles the match regex per entry
5.20.1 - 2026-04-19
ipc— stub-file writes hardened against symlink/TOCTOU attacks (O_EXCL | O_NOFOLLOW, ownership + mode validation)cache-with-ttlgetOrFetch()— closes concurrent-caller race that fired the fetcher twicecache-with-ttl— in-memory memo layer capped via LRU (memoMaxSize, default 1000)memoizationmemoizeAsync()— refreshes entry timestamp on resolve so slow fetches aren't immediately classified as expiredtables—displayWidthmeasures rendered terminal cells viastringWidth(CJK / emoji / combining marks align correctly)paths/packages—resolvePackageJsonDirname/resolvePackageJsonPathno longer mis-identify files like/foo/my-package.json
5.20.0 - 2026-04-19
validation/validate-schema— universal Zod-style schema validator withvalidateSchema(tagged result) andparseSchema(throwing). No runtimezoddep
Deprecated in 5.21.0: moved to
schema/*.
promise-queue— sync throws inside a queued task convert to proper rejections (no longer escape as uncaught)stdio/progressformatTime()— clamps negative milliseconds (no negative ETAs)dlx/lockfile— scratch-directory cleanup no longer clobbers the real exceptiondlx/packageparsePackageSpec— bare trailing@(e.g."pkg@") normalizes toversion: undefined
5.19.1 - 2026-04-19
- Restored
stdio/prompts,stdio/progress, andstdio/clear— accidentally removed in 5.19.0
5.19.0 - 2026-04-19
dlx/integrity— hash verification utilities (normalizeHash,computeHashes,verifyHashwith constant-time compare,DlxHashMismatchError)dlx/arborist— hardened@npmcli/arboristwrappers (safeIdealTree,safeReify,writeSafeNpmrc). Locks down audit/fund/scripts/etc. Supportsbefore?: Datefor release-age enforcementdlx/lockfilegeneratePackagePin()— returns{ name, version, hash, packageJson, lockfile }. DefaultminReleaseDays: 7refuses versions published in the last weekDlxPackageOptions.hash,.lockfile,DlxBinaryOptions.hash— integrity + lockfile options on dlx entry points
pacoteshim exposestarball,manifest,packumentalongsideextract
dist/external/npm-pack.js30% smaller;dist/external/zod.js51% smaller (unused code paths stubbed)
5.18.2 - 2026-04-14
plugins/directory +./plugins/babel-plugin-inline-require-calls— unused
5.18.1 - 2026-04-14
dist/external/npm-packdeduplicated viapnpm overrides— 22 duplicate packages removed, ~130 KB smaller
5.18.0 - 2026-04-14
dlx— Socket Firewall API check before package downloads. Resolves the dependency tree and blocks on critical/high alerts
http-requestdefaultUser-Agentis nowsocketsecurity-lib/{version}(wassocket-registry/1.0)
5.17.0 - 2026-04-14
pathsisUnixPath()— detects MSYS/Git Bash drive-letter notation (/c/...)
pathsnormalizePath()converts MSYS drive letters on Windows (/c/path→C:/path)pathsfromUnixPath()produces native Windows paths with backslashes (/c/path→C:\path)
5.16.0 - 2026-04-14
pathsfromUnixPath()— convert MSYS/Git Bash paths back to native Windows format (#168)
dlxisInSocketDlxnormalizes the dlx directory path on Windows
5.15.0 - 2026-04-06
http-requeststreamoption — resolves immediately after headers arrive, leaving the body unconsumed for pipinghttp-request—headers,ok,status,statusTextfields onHttpDownloadResult
5.14.0 - 2026-04-06
http-request:HttpResponseError— thrown on non-2xx whenthrowOnErroris setthrowOnErroroption — non-2xx responses throw instead of resolving withok: falseonRetrycallback — customize retry per attempt- Streaming body support —
bodyacceptsReadablestreams (incl.form-data) parseRetryAfterHeader()— RFC 7231 §7.1.3 parsersanitizeHeaders()— redact sensitive headers for logging
http-requestHttpRequestOptions.bodywidened toBuffer | Readable | string;onResponseerrors no longer leave promises pending
5.13.0 - 2026-04-05
http-requestreadIncomingResponse()— reads and buffers a Node.js response into anHttpResponse(#143)http-requestIncomingResponse/IncomingRequesttype aliases — disambiguateIncomingMessagedirection
HttpResponse.rawResponsetype narrowed fromIncomingMessagetoIncomingResponse
5.12.0 - 2026-04-04
http-requestlifecycle hooks (onRequest/onResponse) onHttpRequestOptions— fire per-attempt; retries and redirects each trigger separate calls (#133)http-requestmaxResponseSizeoption — reject responses exceeding a byte limit (works through redirects,httpJson,httpText)http-requestHttpResponse.rawResponse— underlyingIncomingMessagehttp-requestenrichErrorMessage()exported
- Error messages now include HTTP method and URL
HttpResponse.headerstype changed toIncomingHttpHeaders
5.11.4 - 2026-03-28
- Lazy-load heavy external sub-bundles across 7 modules (#119) —
sorts,versions,archives,globs,fs,spawn,strings. Lightweight imports no longer load heavy externals at init
5.11.3 - 2026-03-26
releases— in-memory TTL cache for GitHub API responses; guard against missing assets in release response (#112)process-lock— Windows path separator handling for lock directory creation (#112)
5.11.2 - 2026-03-24
http-request— custom CA certificate support (caoption onhttpRequest,httpJson,httpText,httpDownload,fetchChecksums). EnablesSSL_CERT_FILEsupport whenNODE_EXTRA_CA_CERTSis unavailable at process startup
5.11.1 - 2026-03-24
dlx/binary—sha256option ondlxBinary(),downloadBinary(),downloadBinaryFile(). Verification happens during download (fails early on mismatch). Complements the existingintegrity(SRI sha512) option
5.11.0 - 2026-03-23
http-requestparseChecksums(text)— parse GNU / BSD / single-space checksum file formats; CRLF and LF line endings; null-prototype maphttp-requestfetchChecksums(url, options?)— fetch and parse checksums from URL; supportsheadersandtimeouthttp-requesthttpDownloadsha256option — verifies before atomic rename (file not saved on mismatch); accepts uppercase hashes
5.10.0 - 2026-03-14
- BREAKING:
releases/socket-btmdownloadSocketBtmRelease()— tool name moved to required first parameter; config object now optional second parameter. Automatic/${toolName}/${platformArch}directory nesting removed (callers now control the full path).- Before:
downloadSocketBtmRelease({ tool: 'lief', downloadDir: 'build' }) - After:
downloadSocketBtmRelease('lief', { downloadDir: 'build' })
- Before:
5.9.1 - 2026-03-14
fssafeDelete()andsafeDeleteSync()now properly implement retry logic. PreviouslymaxRetrieswas incorrectly passed asconcurrencytodel. Both now use exponential backoff (backoffFactor: 2);maxRetriesandretryDelayinRemoveOptionswork as documented
5.9.0 - 2026-03-14
- BREAKING:
releases/socket-btmgetPlatformArch()normalizes Windows towin(waswin32) — returnswin-x64,win-arm64. Throws on unknown platforms. (Reverted in 5.22.0 back towin32)
5.8.2 - 2026-03-13
http-request— downloads write to{destPath}.downloadtemp file then atomically rename. Prevents partial/corrupted files from CI caching causing extraction failures
5.8.1 - 2026-03-11
- Comprehensive caching for expensive PATH/realpath/git/package.json lookups across
bin,spawn,git,paths, andprocess-lock. All caches validate entries viaexistsSync()and evict stale ones
5.8.0 - 2026-03-10
archives— secure archive extraction for ZIP / TAR / TAR.GZ / TGZ. ConfigurablemaxFileSize(100MB) andmaxTotalSize(1GB). Path-traversal protection, symlink blocking, strip option. Exports:detectArchiveFormat,extractArchive,extractTar,extractTarGz,extractZipreleases/githubdownloadAndExtractArchive()— generic archive download and extract; auto-detects format
- 14 external bundle packages deduplicated via pnpm overrides + patches
5.7.0 - 2026-02-12
envisInEnv(key)—truewhenever the key exists, regardless of value (empty string,"false","0"all count)dlxhelpers exposed:downloadBinaryFile,ensurePackageInstalled,getBinaryCacheMetadataPath,isBinaryCacheValid,makePackageBinsExecutable,parsePackageSpec,resolveBinaryPath,writeBinaryCacheMetadatareleasescreateAssetMatcher()— matcher fn for glob / prefix-suffix / RegExp asset patterns
envgetCI()now usesisInEnv('CI')—truewhenever the key exists, matching standard CI-detection convention
github— try/catch aroundJSON.parse()in API responses; error messages include the response URLdlx/binary— clock-skew protection (future timestamps treated as expired); atomic metadata write-then-rename; TOCTOU re-check of binary existence after metadata readdlx/cache— future-timestamped entries treated as expired during cleanupdlx/package— scoped-package parsing usesatIndex === 0(wasstartsWith('@')); fixes@scope/pkginstallation failurescache-with-ttl— clock-skew detection (far-futureexpiresAt> 2x TTL treated as expired)packages/specs— only strips.gitwhen URL actually ends with it (no more mid-URL truncation)releases/github— TOCTOU on binary download verification (re-checks after reading version file)provenanceworkflow — corrected package name@socketregistry/lib→@socketsecurity/lib
5.6.0 - 2026-02-08
http-requesthttpJson()/httpText()automatically setAcceptandContent-Typeheaders (when body present); user headers override
- BREAKING:
http-requesthttpGetJson()→httpJson()andhttpGetText()→httpText(). Functions now acceptmethod(defaults to'GET'), supporting all HTTP verbs
http-request— empty-string body no longer triggersContent-Type
5.5.3 - 2026-01-20
- Patched
execa@2.1.0forsignal-exitv4 compatibility (named export)
5.5.2 - 2026-01-20
dlx/packageusesgetSocketCacacheDir()(wasgetPacoteCachePath()) for Arborist cache config — removes dependency on pacote cache-path extraction
5.5.1 - 2026-01-12
- dotenvx compatibility with pre-commit hooks
- Empty releases being returned by latest-release lookup
5.5.0 - 2026-01-12
dlx/detect—detectDlxExecutableType,detectExecutableType,detectLocalExecutableType,isJsFilePath,isNativeBinary,isNodePackage. Distinguishes Node packages from native binaries in DLX cache and on local filesystem
releases/github— sort releases bypublished_atto reliably find latest (was relying on creation order)
5.4.1 - 2026-01-10
- Removed
debugmodule stub to bundle the real package — stub was missingenable()/disable()
5.4.0 - 2026-01-07
releases/github—getReleaseAssetUrl(),downloadReleaseAsset(),getLatestRelease()accept glob patterns (wildcards, brace expansion, RegExp) via picomatchreleases/socket-btmdownloadSocketBtmRelease()—assetparameter accepts glob patterns
5.3.0 - 2026-01-07
releases/socket-btmexports:detectLibc,getBinaryAssetName,getBinaryName,getPlatformArchreleases/githubexportsgetAuthHeaders()— checksGH_TOKEN/GITHUB_TOKEN
5.2.1 - 2026-01-06
releases—downloadGitHubRelease()uses syncchmodSync()to prevent "Text file busy" race in CI
5.2.0 - 2026-01-06
releases/github—downloadGitHubRelease()for any GitHub reporeleases/socket-btm—downloadSocketBtmRelease()wrapper. Version caching via.versionfiles; cross-platform with auto platform/arch detection; Linux musl/glibc support; macOS quarantine attribute auto-removal; generic asset downloads (WASM, models)
5.1.4 - 2025-12-30
- Removed unnecessary
http2module dependency from@sigstore/sign@4.1.0via pnpm override + patch — eliminates loadingnode:http2for HTTP/1.1-only operations
5.1.3 - 2025-12-29
http-requesthttpDownload()follows 3xx redirects. NewfollowRedirects(defaulttrue) andmaxRedirects(default5) options. Resolves "Request quota exhausted" when downloading GitHub release assets
5.1.2 - 2025-12-28
paths—getSocketDlxDir()now usesgetPathValue()caching consistent with the other Socket-dir helpers. Adds test override viasetPath('socket-dlx-dir', ...)
5.1.1 - 2025-12-28
pathsSOCKET_HOMEenv var support — customize Socket base directory. Priority:SOCKET_DLX_DIR>SOCKET_HOME/_dlx>~/.socket/_dlx
pathsgetUserHomeDir()falls back toos.tmpdir()when home dir is unavailable. Priority:HOME>USERPROFILE>os.homedir()>os.tmpdir()
5.1.0 - 2025-12-17
typesPURL_Type— addedALPM(Arch Linux) andVSCODE(VS Code extensions)
5.0.2 - 2025-12-15
signal-exitsignals()auto-initializes its internal state
5.0.1 - 2025-12-11
http-requesthttpDownload()automatic progress logging —loggeroption for a Logger instance,progressIntervaloption (default10%).onProgresscallback takes precedence overlogger
5.0.0 - 2025-12-04
json/editEditableJson— base class for generic JSON file manipulation with formatting preservationjson/format— JSON formatting utilitiesjson/parse—isJsonPrimitive,jsonParse(with error handling)json/types— JSON type definitionsdlx/cachegenerateCacheKey()— DLX package cache keysdlx/dir—clearDlx,clearDlxSync,dlxDirExists,dlxDirExistsAsync,ensureDlxDir,ensureDlxDirSyncdlx/packages—isDlxPackageInstalled,listDlxPackages,removeDlxPackage(+ async/sync variants)dlx/paths—getDlxPackageDir,getDlxInstalledPackageDir,getDlxPackageJsonPath,getDlxPackageNodeModulesDir,isInSocketDlx
- BREAKING: Module path reorganization:
json/editable→json/editpackages/editable→packages/editmaintained-node-versions,package-default-node-range,package-default-socket-categories,lifecycle-script-names→ moved underconstants/dlx→ split intodlx/cache,dlx/dir,dlx/packages,dlx/pathsdlx-binary→dlx/binary;dlx-manifest→dlx/manifest;dlx-package→dlx/package
4.4.0 - 2025-11-25
fsnormalizeEncoding()— case-insensitive encoding normalization with aliases (binary→latin1,ucs-2→utf16le); defaults toutf8
fssafeReadFile/safeReadFileSync— corrected type overloads (encoding: null→Buffer; no encoding →string)suppress-warningswithSuppressedWarnings()— properly restores state, only removing warnings the function added
4.3.0 - 2025-11-20
globsglob()/globSync()— wrapper functions for fast-glob with normalized options
4.1.0 - 2025-11-17
constants/node—getNodeMinorVersion(),getNodePatchVersion()
constants/nodegetNodeHardenFlags()—--experimental-permissionguarded for Node 20-23;--permissionfor Node 24+;--force-node-api-uncaught-exceptions-policyfor Node 22+. Removed--experimental-policy
4.0.1 - 2025-11-17
- Replaced
#-path imports with relative paths
4.0.0 - 2025-11-15
- BREAKING:
pathsreorganized into dedicatedpaths/*submodules - Lazy
require()calls converted to ES6 static imports for better tree-shaking
3.5.0 - 2025-11-14
argv/quote—posixQuote(arg)(single-quote for bash/sh/zsh) andwin32Quote(arg)(double-quote for cmd.exe). Use when invokingspawn()withshell: true
3.4.0 - 2025-11-14
Spinnerskip(text)/skipAndStop(text)— display skip messages with cyan ↻ symbolLoggerskip(message)andLOG_SYMBOLS.skip
3.3.11 - 2025-11-14
prompts— "inquirerPrompt is not a function" when inquirer modules expose multiple exports (select, search)
3.3.10 - 2025-11-14
string-width@8.1.0andwrap-ansi@9.0.2overrides forstrip-ansi@7.1.2compatibility
3.3.9 - 2025-11-14
strip-ansi@7.1.2override foransi-regex@6.2.2compatibility
3.3.8 - 2025-11-14
spinner— clear remaining artifacts afterwithSpinnerstops (rogue spinner characters)
3.3.7 - 2025-11-13
- Explicit
.jsextensions on externalrequire()calls for modern bundler compat
3.3.6 - 2025-11-13
- pnpm overrides consolidate
@npmcli/arborist@9.1.6,@npmcli/run-script@10.0.0,semver@7.7.2,ansi-regex@6.2.2,lru-cache@11.2.2to single versions
3.3.5 - 2025-11-13
- Patches to prevent
node-gypbundling issues
3.3.4 - 2025-11-13
node-gypmarked external innpm-packbundle
3.3.3 - 2025-11-13
node-gypstring broken to prevent bundler ESM/CJS interop issues
3.3.2 - 2025-11-13
dlxinstalls package dependencies after download- npm package bundle sizes reduced ~3 MB
3.3.1 - 2025-11-11
SOCKET_DOCS_CONTACT_URLconstantcheckboxprompt support
3.3.0 - 2025-11-07
Spinnerreason(text)/reasonAndStop(text)— display working/thinking outputLoggerreason(message)andLOG_SYMBOLS.reason
3.2.8 - 2025-11-05
- CommonJS export script edge cases (stray semicolons after comment placeholders; incorrect
module.exports.default→module.module.exports)
3.2.7 - 2025-11-05
- External dependency minification disabled to preserve exports (was breaking
semver.parse(),semver.major()) - CommonJS export interop for TypeScript
export defaultno longer needs.defaultaccessor
3.2.6 - 2025-11-05
loggerandstdio/prompts— manual ANSI escape sequences for RGB colors (yoctocolors-cjs has norgb()method)
3.2.5 - 2025-11-05
- Path alias resolution in build pipeline —
#lib/*/#constants/*aliases resolve to relative paths in compiled CommonJS
3.2.4 - 2025-11-04
Loggertime()— start a named timer; returnsstop()that logs completion with formatted duration
- Star spinner frames — added trailing space for consistent spacing
3.2.2 - 2025-11-03
dlxmakePackageBinsExecutable()— chmod 0o755 on all package binaries (no-op on Windows)dlxfindBinaryPath()adopts npm's resolution strategy (vendoredgetBinFromManifestfrom libnpmexec)
- Bundle size reduced ~1.3 MB total — vendored
getBinFromManifest(1.1 MB savings) + minimized exports forfast-sort,fast-glob,del,streaming-iterables
3.2.1 - 2025-11-02
Logger/Spinner— callgetDefaultLogger()/getDefaultSpinner()once at module scope to prevent duplicate spinner indicators
3.2.0 - 2025-11-02
dlx— unified manifest for packages and binaries
3.1.3 - 2025-11-02
@socketregistry/packageurl-jsupdated to 1.3.5
3.1.2 - 2025-11-02
SpinnersetShimmer— handle undefined properties via defaults- External deps now go through the wrapper pattern (
require('../external/which'), etc.) — maintains zero-deps policy
3.1.1 - 2025-11-02
cache-with-ttl—cacache.putwrapped in try/catch so persistent-cache write failures don't break in-memory reads
3.1.0 - 2025-11-01
fssafeMkdir/safeMkdirSyncdefault torecursive: true
3.0.6 - 2025-11-01
- Build validation — guard against
link:protocol dependencies inpackage.json(validate-no-link-deps.mjsruns duringpnpm run check)
@socketregistry/packageurl-jsupdated to 1.3.3
3.0.5 - 2025-11-01
- Critical: prompts API restored — non-functional stub from v3.0.0 replaced with working implementation.
@socketsecurity/lib/stdio/promptsexportspassword,search,Separator,createSeparator().Choice.name(was erroneouslylabel)
- Prompts adopt the active theme (
colors.prompt,textDim,primary,error,success);createInquirerTheme()exported - Theme parameter support —
Logger, prompts, and text effects accepttheme: 'socket' | 'sunset' | 'terracotta' | 'lush' | 'ultra'(or a Theme object)
- BREAKING:
src/index.tsdeleted; main index"."/"./index"exports gone. Import specific modules:@socketsecurity/lib/loggerinstead of@socketsecurity/lib
3.0.4 - 2025-11-01
- Sunset theme — azure blue → warm orange/purple gradient (Coana branding)
bricktheme renamed toterracotta
3.0.3 - 2025-11-01
- Critical: Node.js ESM/CJS interop — disabled esbuild minification (was breaking ESM named-import detection from CJS dist). ESM imports now work reliably
3.0.2 - 2025-11-01
- Critical: Node.js ESM named imports from CommonJS —
module.exportsplaced before variable defs caused "Cannot access before initialization". Build now uses@babel/parser+magic-stringto position exports at end of file
3.0.1 - 2025-11-01
- Convenience re-exports of
getDefaultLogger,Logger,LOG_SYMBOLS,getDefaultSpinner,Spinnerfrom main index for v2→v3 migration
- Critical: Spinner internal calls to removed
loggerexport — usegetDefaultLogger()(5 call sites)
3.0.0 - 2025-11-01
- Theme system — 5 built-in themes (
socket,sunset,terracotta,lush,ultra);setTheme,getTheme,withTheme,withThemeSync,createTheme,extendTheme,resolveColor,onThemeChange linkslink()— themed terminal hyperlinks- Logger and spinner inherit theme colors
- Spinner methods:
enableShimmer,disableShimmer,setShimmer,updateShimmer dlxcross-platform binary resolution (.cmd,.bat,.ps1on Windows)
- Theme context uses
AsyncLocalStorageinstead of manual stack - BREAKING: Promise retry options renamed —
factor→backoffFactor,minTimeout→baseDelayMs,maxTimeout→maxDelayMs
- BREAKING:
pushTheme()/popTheme()— usewithTheme()/withThemeSync() - BREAKING:
logger/spinnerexports — usegetDefaultLogger()/getDefaultSpinner() - BREAKING:
download-lock.ts— useprocess-lock.ts - Promise option aliases:
factor,minTimeout,maxTimeout
2.10.3 - 2025-10-31
@socketregistry/packageurl-jsupdated to 1.3.1 (resolves unintended external dep)- JSDoc
@exampleimport paths corrected after v1.0.0 rename (@socketsecurity/registry→@socketsecurity/lib)
2.10.2 - 2025-10-31
- Package spec parsing uses official
npm-package-arglibrary for full npm spec support (versions, ranges, tags, git URLs); falls back to simple parsing if it fails
- Critical:
parsePackageSpecno longer strips the@prefix from scoped+versioned specs (e.g.,@coana-tech/cli@~14.12.51)
2.10.1 - 2025-10-31
- Process lock — recursive mkdir for parent dirs
- Removed buggy
getNodeDebugFlags()(returned flags without required argument values)
2.10.0 - 2025-10-30
- Unified
.dlx-metadata.jsonschema —DlxMetadatainterface exported. Fields:version,cache_key,timestamp,checksum,checksum_algorithm,platform,arch,size,source({ type, url }); reservedextrafor impl-specific data
dlxwriteBinaryCacheMetadata()adopts the unified schema (cache_key= SHA-512 prefix,size,checksum_algorithm,source.type/source.url)
2.9.1 - 2025-10-30
dlxPackagesmart binary detection — uses single-binary packages directly regardless of name. OptionalbinaryNamefor explicit selection on multi-binary packages
- Binary resolution for scoped packages where package name ≠ binary name (e.g.,
@socketsecurity/cliexposesbin: { socket: '...' })
2.9.0 - 2025-10-30
constants/socketURL constants —SOCKET_WEBSITE_URL,SOCKET_CONTACT_URL,SOCKET_DASHBOARD_URL,SOCKET_API_TOKENS_URL,SOCKET_PRICING_URL,SOCKET_STATUS_URL,SOCKET_DOCS_URL
- Error messages across the library — actionable resolution steps for fs, dlx, process-lock, downloads
- All locking consolidated on
process-lock(atomic mkdir-based; 5s stale timeout aligned with npm npx)
2.8.4 - 2025-10-30
dlxdownloadBinary(cache without execution) andexecuteBinary(run cached binary). InternaldownloadBinaryrenamed todownloadBinaryFileto avoid the naming conflict
2.8.3 - 2025-10-30
LoggerdefersObject.getOwnPropertySymbols(console),kGroupIndentationWidth, andObject.entries(console)until first use — safe to import in Node.js internal bootstrap contexts
2.8.2 - 2025-10-29
LoggerdefersConsolecreation until first use — eliminates early-bootstrap errors when imported before stdout is ready
2.8.1 - 2025-10-29
dlx—generateCacheKeyextracted to shared module. Exported for downstream consumers (e.g. socket-cli)
2.8.0 - 2025-10-29
dlxcache keys — SHA-512 truncated to 16 chars (was SHA-256 / 64 chars), matching npm/npx. Better WindowsMAX_PATHcompatibility. Supports PURL specs (npm:prettier@3.0.0,pypi:requests@2.31.0)
2.7.0 - 2025-10-28
dlxcache locking —~/.socket/_dlx/<hash>/.lock(npm-npx-styleconcurrency.lock). Prevents concurrent installations from corrupting the same package cache. 5s stale timeout, 2s periodic touch
2.6.0 - 2025-10-28
process-lockaligned with npm npx — 5s stale timeout (was 10s), 2s periodic touch, second-level mtime comparison (avoids APFS float precision),unref()timers, automatic cleanup on exit
2.5.0 - 2025-10-28
process-lockProcessLockManager— cross-platform inter-process sync via filesystem locks. Atomicmkdir()acquisition; stale-lock detection (10s default); exponential backoff with jitter; exit-handler cleanup. APIs:acquire,release,withLock(recommended)
spinner.succeed()renamed tospinner.success()
2.4.0 - 2025-10-28
downloadWithLock()defaultstaleTimeout300s → 10s (aligns with npm npx)dlxBinary.downloadBinary()usesdownloadWithLock()to prevent corruption from concurrent binary downloads
2.3.0 - 2025-10-28
binwhich()/whichSync()— cross-platform binary lookup respectingPATH
2.2.1 - 2025-10-28
Loggerwrite()bypasses Console formatting (group indentation, etc.) — now writes directly to the raw stdout reference captured at construction
2.2.0 - 2025-10-28
Loggerstep()— cyan arrow→prefix (or>in ASCII fallback). NewLOG_SYMBOLS.step
2.1.0 - 2025-10-28
- Package manager detection —
detectPackageManager(),getPackageManagerInfo(),getPackageManagerUserAgent() isInSocketDlx()— check if a path is under~/.socket/_dlx/downloadPackage()/executePackage()— separate download and execution
2.0.0 - 2025-10-27
- BREAKING: Environment variable system refactor — 60+ individual
env/<NAME>.tsfiles consolidated into grouped getter modules:env/github,env/socket,env/socket-cli,env/npm,env/locale,env/windows,env/xdg,env/temp-dir,env/test- All env constants converted to functions:
import { GITHUB_TOKEN } from '#env/github-token'→import { getGithubToken } from '#env/github'
env/rewireandpaths/rewire— AsyncLocalStorage-based env/path overrides for testing.withEnv({...}, async () => {})for isolated context, orsetEnv/resetEnvforbeforeEach/afterEachgetCacache()exported
1.3.6 - 2025-10-26
debugfunctions no longer tree-shaken as no-ops — removed incorrect/*@__NO_SIDE_EFFECTS__*/annotations ondebug,debugDir,debugLog(+*Nsvariants)
1.3.5 - 2025-10-26
envcreateEnvProxy()— Windows-compatible case-insensitive env var access (PATH,Path,pathall work). Priority: overrides > exact match > case-insensitive fallbackenvfindCaseInsensitiveEnvKey()— case-insensitive key search with length fast-path
spawnpreserves Windowsprocess.envProxy behavior (usesprocess.envdirectly when no custom env merges, keeping Windows case-insensitive access)
1.3.4 - 2025-10-26
constants/node—supportsNodeDisableSigusr1Flag(),getNodeDisableSigusr1Flags(). Returns['--disable-sigusr1']on Node 22.14+/23.7+/24.8+, falls back to['--no-inspect']on Node 18+
1.3.3 - 2025-10-24
objectsdefineGetter,defineLazyGetter,defineLazyGetters— removed incorrect/*@__NO_SIDE_EFFECTS__*/annotations (these mutate objects). Lazy getters were returningundefinedafter esbuild tree-shaking
1.3.2 - 2025-10-24
- Continued fixing of broken external dependency bundling
1.3.1 - 2025-10-24
@inquirermodules (input,password,search) properly bundled intodist/external/— fixes build failures in downstream socket-cli
- Added tests to prevent rogue external stubs in
dist/external/- Detects stub re-export patterns that indicate incomplete bundling
- Verifies all @inquirer modules are properly bundled (> 1KB)
- Catches bundling regressions early in CI pipeline
1.3.0 - 2025-10-23
fsvalidateFiles()— returns{ validPaths, invalidPaths }. Filters unreadable files before processing (Yarn Berry PnP, pnpm symlinks)
1.2.0 - 2025-10-23
dlx-package— install and execute npm packages directly. Content-addressed cache (SHA256). Auto-force for version ranges (^,~,>,<). Resolves binaries frompackage.jsonbin
- Unified DLX storage under
~/.socket/_dlx/(binary downloads + npm packages share content-addressed parent)
- Broken relative import paths in
packages/isolation.ts/packages/provenance.ts
- Shimmer text effects respect CI detection (disabled in CI to avoid ANSI escapes in logs)
stdio/mask—filterOutput(filter output chunks before display) andoverrideExitCode(customize exit codes from captured output)- Comprehensive JSDoc across the library for IntelliSense (
@param,@returns,@example,@default)
- Custom retry delays from
onRetrycallback
- External dep paths in root-level dist files (
../external/→./external/)
- External dep import paths in
packages/andstdio/modules (../../external/→../external/)
packages/normalizemodule resolution (../../constants/socket→../constants/socket)
- Relative imports in compiled CommonJS — root-level dist files use
./external/...
parseArgsconsolidated intoargv/parse
Historical Entries: The entries below are from when this package was named @socketsecurity/registry. This package was renamed to @socketsecurity/lib starting with version 1.0.0.
These entries cover versions 1.0.0 → 1.5.3 of the previous package name (@socketsecurity/registry, Sep 2025 – Oct 2025). The version-number line restarted at 1.0.0 when the package was renamed to @socketsecurity/lib, so the current 1.x and 5.x lines do not continue from these old versions. Listed here for archival reference only.
- 1.5.x (Oct 2025) —
isolatePackagefor isolated package test environments; v8 coverage utilities;dependencies/indexbarrel removed - 1.4.x (Oct 2025) — Performance monitoring + memoization utilities; table formatting (
formatTable,formatSimpleTable); spinner progress;isDir,safeStatsasync fs helpers - 1.3.x (Sep–Oct 2025) — Initial constants restructure, build configuration, package exports
For full details, see git history under the @socketsecurity/registry package name.