PkgRadar

Package evidence

@codemastersolutions/[email protected]

Install-time lifecycle script: postinstall="node ./scripts/postinstall-shim.js"

Trust signals

Why this verdict

PkgRadar discounts a release’s score when public reputation argues against novel malware. The verdict above already reflects these — the panel just explains what was applied.

Publisher
GitHub ActionsTrusted automation · −70% score

Effective trust discount applied: 70% (max across signals — discounts don’t stack). New install-lifecycle deltas vs the previous release would clear the discount.

Recommended action

Block this update

Static evidence trips multiple high-signal indicators. Quarantine the release until the publisher validates the change or you can rule out the indicators below.

Block this release in CIcurl · GitHub Actions

Fail the build when this package version is added or upgraded. Replace $PKGRADAR_TOKEN with a Pro / Team API key from your dashboard.

curl -fsS https://pkgradar.com/gate/npm \
  -H "Authorization: Bearer $PKGRADAR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"specs":["@codemastersolutions/[email protected]"],"fail_on":"high"}'

GitHub Actions step:

- name: PkgRadar gate
  run: |
    curl -fsS https://pkgradar.com/gate/npm \
      -H "Authorization: Bearer ${{ secrets.PKGRADAR_TOKEN }}" \
      -H "Content-Type: application/json" \
      -d '{"specs":["@codemastersolutions/[email protected]"],"fail_on":"high"}'
Artifact bytes68,046
Previous version0.0.51
Published2026-05-24T14:47:09.303Z
SHA-256da2f0da29a820d1645f43d54a3b4dd6fedc5a7c3f5e25b1f5d5ded2d453777cd

Why flagged

What the scanner saw

Install-time lifecycle script: postinstall="node ./scripts/postinstall-shim.js"

Not observed: package install, lifecycle script execution, or sandbox execution. PkgRadar only inspects on-disk artifacts.

Availability ledger

available

high
Last checked
highRisk
81Score
0.0.52Version
Status history (1 event)
  1. newavailable · risk high · score 81 · status changed

Related candidates

Linked campaigns and clusters

Repeated static TTPstale

Install-time lifecycle script — postinstall="node ./scripts/postinstall-shim.js"

3 members · evidence strength 80
Repeated static TTPstale

Install Lifecycle Remote Or Exec — postinstall="node ./scripts/postinstall-shim.js"

3 members · evidence strength 80

Evidence

Static findings

9 static · 0 from release diff · showing high-signal first.

SeverityKindPathDetailPoints
highInstall-time lifecycle scriptpackage.jsonpostinstall="node ./scripts/postinstall-shim.js"30
highInstall Lifecycle Remote Or Execpackage.jsonpostinstall="node ./scripts/postinstall-shim.js"30
Show all 9 findings (low-signal and informational)
SeverityKindPathDetailPoints
highInstall-time lifecycle scriptpackage.jsonpostinstall="node ./scripts/postinstall-shim.js"30
highInstall Lifecycle Remote Or Execpackage.jsonpostinstall="node ./scripts/postinstall-shim.js"30
lowObfuscationpackage/dist/cjs/cli/colors.jsmatched "\\x1b"3
lowObfuscationpackage/dist/esm/cli/colors.jsmatched "\\x1b"3
lowObfuscationpackage/dist/cjs/cli/commands/commit.jsmatched "\\x00"3
lowObfuscationpackage/dist/esm/cli/commands/commit.jsmatched "\\x00"3
lowObfuscationpackage/dist/esm/cli/index.jsmatched "\\x00"3
lowObfuscationpackage/dist/cjs/cli/commands/select.jsmatched "\\x1b"3
lowObfuscationpackage/dist/esm/cli/commands/select.jsmatched "\\x1b"3

Manifest

Package metadata

Scripts33
  • buildpnpm run build:esm && pnpm run build:cjs && node scripts/postbuild-cjs.js
  • build:cjstsc -p tsconfig.cjs.json
  • build:esmtsc -p tsconfig.esm.json
  • cleanrm -rf dist
  • comments:stripnode scripts/strip-comments.js && pnpm run format
  • commitpnpm run commitzero commit
  • commit:pushpnpm run commitzero commit --add --push
  • commitzerocommitzero
  • commitzero:installpnpm run commitzero install-hooks
  • commitzero:uninstallpnpm run commitzero uninstall-hooks
  • coveragepnpm run build && COMMITSKIP_ADD_PROMPT=1 c8 --exclude "**/cli/commands/**" -r text-summary -r lcov node --import tsx --test test/unit/select.test.ts test/unit/formatter.test.ts test/unit/rules.test.ts test/unit/parser.test.ts test/unit/load-config.test.ts test/unit/hooks-install.test.ts test/unit/branches.test.ts test/unit/i18n.test.ts test/unit/commit.test.ts test/integration/cleanup.test.ts test/integration/cli.test.ts test/integration/precommit.test.ts
  • coverage:subsetpnpm run build && c8 -r text-summary -r lcov node --import tsx --test test/unit/select.test.ts test/unit/formatter.test.ts test/integration/cleanup.test.ts test/integration/cli.test.ts test/integration/precommit.test.ts
  • formatprettier --write "**/*.{ts,js,json,md}"
  • format:checkprettier --check "**/*.{ts,js,json,md}"
  • linteslint . --ext .ts
  • lint:fixeslint . --ext .ts --fix
  • postinstallnode ./scripts/postinstall-shim.js
  • postuninstallnode ./scripts/cleanup-shim.js || true
  • pretestpnpm run build
  • preuninstallnode ./scripts/cleanup-shim.js || true
  • simulate:releasenode scripts/simulate-release.js
  • sonar:auth:checknode --input-type=module -e "const host=process.env.SONAR_HOST_URL || 'http://sonarqube.codemastersolucoes.com'; const token=process.env.SONAR_TOKEN; const login=process.env.SONAR_LOGIN; const password=process.env.SONAR_PASSWORD; const url=new URL('/api/authentication/validate', host); const headers={}; if(token){ headers.Authorization='Basic ' + Buffer.from(token + ':').toString('base64'); console.log('Auth: token (len=' + token.length + ')'); } else if(login && password){ headers.Authorization='Basic ' + Buffer.from(login + ':' + password).toString('base64'); console.log('Auth: login/password'); } else { console.error('Provide SONAR_TOKEN or SONAR_LOGIN and SONAR_PASSWORD'); process.exit(1); } const res=await fetch(url,{headers}); const body=await res.text(); console.log('HTTP ' + res.status); console.log(body);"
  • sonar:downdocker compose -f docker-compose.sonarqube.yml down -v
  • sonar:exportpnpm sonar:export:metrics && pnpm sonar:export:quality-gate && pnpm sonar:export:issues && pnpm sonar:export:hotspots
  • sonar:export:hotspotsnode --input-type=module -e "import fs from 'node:fs'; import path from 'node:path'; const host=process.env.SONAR_HOST_URL || 'http://sonarqube.codemastersolucoes.com'; const token=process.env.SONAR_TOKEN; const login=process.env.SONAR_LOGIN; const password=process.env.SONAR_PASSWORD; let auth=''; if(token){ auth='Basic ' + Buffer.from(token + ':').toString('base64'); } else if(login && password){ auth='Basic ' + Buffer.from(login + ':' + password).toString('base64'); } else { console.error('Provide SONAR_TOKEN or SONAR_LOGIN and SONAR_PASSWORD'); process.exit(1); } const dir=path.resolve('sonar'); fs.mkdirSync(dir,{recursive:true}); const pageSize=500; let page=1; const hotspots=[]; while(true){ const url=new URL('/api/hotspots/search', host); url.searchParams.set('projectKey','commitzero'); url.searchParams.set('ps', String(pageSize)); url.searchParams.set('p', String(page)); const res=await fetch(url,{headers:{Authorization:auth}}); if(!res.ok){ if(res.status === 403 || res.status === 401){ let body=''; try{ body = await res.text(); }catch{} fs.writeFileSync(path.join(dir,'hotspots.json'), JSON.stringify({projectKey:'commitzero', exportedAt:new Date().toISOString(), hotspots: [], error: { status: res.status, body: body.slice(0, 500) }},null,2)+'\\n'); console.log('Hotspots export skipped: HTTP ' + res.status + ' (missing permissions or feature not available)'); process.exit(0); } throw new Error('HTTP ' + res.status + ' ' + res.statusText); } const json=await res.json(); hotspots.push(...(json.hotspots||[])); const paging=json.paging||{}; const total=Number(paging.total||0); if(page*pageSize>=total) break; page++; } fs.writeFileSync(path.join(dir,'hotspots.json'), JSON.stringify({projectKey:'commitzero', exportedAt:new Date().toISOString(), hotspots},null,2)+'\\n'); console.log('Wrote sonar/hotspots.json (' + hotspots.length + ' hotspots)');"
  • sonar:export:issuesnode --input-type=module -e "import fs from 'node:fs'; import path from 'node:path'; const host=process.env.SONAR_HOST_URL || 'http://sonarqube.codemastersolucoes.com'; const token=process.env.SONAR_TOKEN; const login=process.env.SONAR_LOGIN; const password=process.env.SONAR_PASSWORD; let auth=''; if(token){ auth='Basic ' + Buffer.from(token + ':').toString('base64'); } else if(login && password){ auth='Basic ' + Buffer.from(login + ':' + password).toString('base64'); } else { console.error('Provide SONAR_TOKEN or SONAR_LOGIN and SONAR_PASSWORD'); process.exit(1); } const dir=path.resolve('sonar'); fs.mkdirSync(dir,{recursive:true}); const pageSize=500; let page=1; const issues=[]; while(true){ const url=new URL('/api/issues/search', host); url.searchParams.set('componentKeys','commitzero'); url.searchParams.set('statuses','OPEN,REOPENED,CONFIRMED'); url.searchParams.set('ps', String(pageSize)); url.searchParams.set('p', String(page)); const res=await fetch(url,{headers:{Authorization:auth}}); if(!res.ok){throw new Error('HTTP ' + res.status + ' ' + res.statusText);} const json=await res.json(); issues.push(...(json.issues||[])); const total=Number(json.total||0); if(page*pageSize>=total) break; page++; } fs.writeFileSync(path.join(dir,'issues.json'), JSON.stringify({projectKey:'commitzero', exportedAt:new Date().toISOString(), issues},null,2)+'\\n'); console.log('Wrote sonar/issues.json (' + issues.length + ' issues)');"
  • sonar:export:metricsnode --input-type=module -e "import fs from 'node:fs'; import path from 'node:path'; const host=process.env.SONAR_HOST_URL || 'http://sonarqube.codemastersolucoes.com'; const token=process.env.SONAR_TOKEN; const login=process.env.SONAR_LOGIN; const password=process.env.SONAR_PASSWORD; let auth=''; if(token){ auth='Basic ' + Buffer.from(token + ':').toString('base64'); } else if(login && password){ auth='Basic ' + Buffer.from(login + ':' + password).toString('base64'); } else { console.error('Provide SONAR_TOKEN or SONAR_LOGIN and SONAR_PASSWORD'); process.exit(1); } const dir=path.resolve('sonar'); fs.mkdirSync(dir,{recursive:true}); const url=new URL('/api/measures/component', host); url.searchParams.set('component','commitzero'); url.searchParams.set('metricKeys','bugs,vulnerabilities,security_hotspots,code_smells,coverage,duplicated_lines_density,ncloc'); const res=await fetch(url,{headers:{Authorization:auth}}); if(!res.ok){throw new Error('HTTP ' + res.status + ' ' + res.statusText);} const json=await res.json(); fs.writeFileSync(path.join(dir,'metrics.json'), JSON.stringify(json,null,2)+'\\n'); console.log('Wrote sonar/metrics.json');"
  • sonar:export:quality-gatenode --input-type=module -e "import fs from 'node:fs'; import path from 'node:path'; const host=process.env.SONAR_HOST_URL || 'http://sonarqube.codemastersolucoes.com'; const token=process.env.SONAR_TOKEN; const login=process.env.SONAR_LOGIN; const password=process.env.SONAR_PASSWORD; let auth=''; if(token){ auth='Basic ' + Buffer.from(token + ':').toString('base64'); } else if(login && password){ auth='Basic ' + Buffer.from(login + ':' + password).toString('base64'); } else { console.error('Provide SONAR_TOKEN or SONAR_LOGIN and SONAR_PASSWORD'); process.exit(1); } const dir=path.resolve('sonar'); fs.mkdirSync(dir,{recursive:true}); const url=new URL('/api/qualitygates/project_status', host); url.searchParams.set('projectKey','commitzero'); const res=await fetch(url,{headers:{Authorization:auth}}); if(!res.ok){throw new Error('HTTP ' + res.status + ' ' + res.statusText);} const json=await res.json(); fs.writeFileSync(path.join(dir,'quality-gate.json'), JSON.stringify(json,null,2)+'\\n'); console.log('Wrote sonar/quality-gate.json');"
  • sonar:scansonar -Dsonar.host.url=https://sonarqube.codemastersolucoes.com -Dsonar.token=process.env.SONAR_TOKEN -Dsonar.projectKey=codemastersolutions_commitzero_eb012d27-7d59-454a-907f-b31e016f7358
  • sonar:updocker compose -f docker-compose.sonarqube.yml up -d
  • …and 3 more.