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 updateStatic 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"}'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
Status history (1 event)
- new → available · risk high · score 87 · status changed
Related candidates
Linked campaigns and clusters
Install-time lifecycle script — postinstall="node ./scripts/postinstall-shim.js"
3 members · evidence strength 80Install Lifecycle Remote Or Exec — postinstall="node ./scripts/postinstall-shim.js"
3 members · evidence strength 80Evidence
Static findings
11 static · 0 from release diff · showing high-signal first.
| Severity | Kind | Path | Detail | Points |
|---|---|---|---|---|
| high | Install-time lifecycle script | package.json | postinstall="node ./scripts/postinstall-shim.js" | 30 |
| high | Install Lifecycle Remote Or Exec | package.json | postinstall="node ./scripts/postinstall-shim.js" | 30 |
Show all 11 findings (low-signal and informational)
| Severity | Kind | Path | Detail | Points |
|---|---|---|---|---|
| high | Install-time lifecycle script | package.json | postinstall="node ./scripts/postinstall-shim.js" | 30 |
| high | Install Lifecycle Remote Or Exec | package.json | postinstall="node ./scripts/postinstall-shim.js" | 30 |
| low | Obfuscation | package/dist/cjs/cli/colors.js | matched "\\x1b" | 3 |
| low | Obfuscation | package/dist/esm/cli/colors.js | matched "\\x1b" | 3 |
| low | Obfuscation | package/dist/cjs/cli/commands/commit.js | matched "\\x00" | 3 |
| low | Obfuscation | package/dist/esm/cli/commands/commit.js | matched "\\x00" | 3 |
| low | Obfuscation | package/dist/esm/cli/index.js | matched "\\x00" | 3 |
| low | Obfuscation | package/dist/cjs/cli/commands/select.js | matched "\\x1b" | 3 |
| low | Obfuscation | package/dist/esm/cli/commands/select.js | matched "\\x1b" | 3 |
| low | Obfuscation | package/dist/cjs/utils/shared.js | matched "\\x00" | 3 |
| low | Obfuscation | package/dist/esm/utils/shared.js | matched "\\x00" | 3 |
Manifest
Package metadata
Scripts33
buildpnpm run build:esm && pnpm run build:cjs && node scripts/postbuild-cjs.jsbuild:cjstsc -p tsconfig.cjs.jsonbuild:esmtsc -p tsconfig.esm.jsoncleanrm -rf distcomments:stripnode scripts/strip-comments.js && pnpm run formatcommitpnpm run commitzero commitcommit:pushpnpm run commitzero commit --add --pushcommitzeropnpm run pretest && chmod +x dist/cjs/cli/index.js && ./dist/cjs/cli/index.jscommitzero:installpnpm run commitzero install-hookscommitzero:uninstallpnpm run commitzero uninstall-hookscoveragepnpm 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.tscoverage: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.tsformatprettier --write "**/*.{ts,js,json,md}"format:checkprettier --check "**/*.{ts,js,json,md}"linteslint . --ext .tslint:fixeslint . --ext .ts --fixpostinstallnode ./scripts/postinstall-shim.jspostuninstallnode ./scripts/cleanup-shim.js || truepretestpnpm run buildpreuninstallnode ./scripts/cleanup-shim.js || truesimulate:releasenode scripts/simulate-release.jssonar: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 -vsonar:exportpnpm sonar:export:metrics && pnpm sonar:export:quality-gate && pnpm sonar:export:issues && pnpm sonar:export:hotspotssonar: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-b31e016f7358sonar:updocker compose -f docker-compose.sonarqube.yml up -d- …and 3 more.