boxlang-zip — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited boxlang-zip (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
BoxLang provides the bx:zip component for creating, extracting, listing, and modifying ZIP archives. Supports compression levels, entry filtering, encryption, and reading individual entries without full extraction.
// Create from directory
bx:zip action="zip"
file="#expandPath( '/temp/archive.zip' )#"
source="#expandPath( '/files/documents' )#"
// Overwrite existing
bx:zip action="zip"
file="#expandPath( '/temp/archive.zip' )#"
source="#expandPath( '/files' )#"
overwrite="true"
// Multiple sources with prefixes
bx:zip action="zip" file="#expandPath( '/temp/backup.zip' )#" {
bx:zipparam source="#expandPath( '/app' )#" prefix="app"
bx:zipparam source="#expandPath( '/config' )#" prefix="config"
bx:zipparam source="#expandPath( '/uploads' )#" prefix="uploads"
}
// Filter by pattern
bx:zip action="zip"
file="#expandPath( '/temp/pdfs.zip' )#"
source="#expandPath( '/documents' )#"
filter="*.pdf"
recurse="true"
// Compression level (0 = store, 9 = maximum)
bx:zip action="zip"
file="#expandPath( '/temp/compressed.zip' )#"
source="#expandPath( '/files' )#"
compressionLevel="9"// Extract all
bx:zip action="unzip"
file="#expandPath( '/temp/archive.zip' )#"
destination="#expandPath( '/extracted' )#"
overwrite="true"
// Extract specific entry
bx:zip action="unzip"
file="#expandPath( '/temp/archive.zip' )#"
destination="#expandPath( '/extracted' )#"
entryPath="docs/report.pdf"
// Extract filtered subset
bx:zip action="unzip"
file="#expandPath( '/temp/archive.zip' )#"
destination="#expandPath( '/pdfs' )#"
filter="*.pdf"// List all entries into a query
bx:zip action="list"
file="#expandPath( '/temp/archive.zip' )#"
name="local.zipContents"
for ( var row in zipContents ) {
println( "#row.name# - #row.size# bytes" )
}
// Read a single file without extracting
bx:zip action="read"
file="#expandPath( '/temp/archive.zip' )#"
entryPath="config.json"
variable="local.configContent"
var config = jsonDeserialize( configContent )// Append file to existing archive
bx:zip action="zip" file="#expandPath( '/temp/archive.zip' )#" {
bx:zipparam source="#expandPath( '/newfile.txt' )#"
}
// Delete entry
bx:zip action="delete"
file="#expandPath( '/temp/archive.zip' )#"
entryPath="oldfile.txt"
// Delete multiple entries
bx:zip action="delete" file="#expandPath( '/temp/archive.zip' )#" {
bx:zipparam entryPath="temp/*"
bx:zipparam entryPath="logs/*.log"
}// Create encrypted archive
bx:zip action="zip"
file="#expandPath( '/temp/secure.zip' )#"
source="#expandPath( '/sensitive' )#"
password="SecurePassword123"
// Extract encrypted archive
bx:zip action="unzip"
file="#expandPath( '/temp/secure.zip' )#"
destination="#expandPath( '/extracted' )#"
password="SecurePassword123"class singleton {
function create( required zipFile, required source, overwrite = false, filter = "*" ) {
if ( !overwrite && fileExists( zipFile ) ) {
throw( "ZIP file already exists: #zipFile#" )
}
bx:zip action="zip" file="#zipFile#" source="#source#" overwrite="#overwrite#" filter="#filter#"
return getFileInfo( zipFile )
}
function extract( required zipFile, required destination, overwrite = false ) {
if ( !fileExists( zipFile ) ) {
throw( "ZIP file not found: #zipFile#" )
}
if ( !directoryExists( destination ) ) {
directoryCreate( destination, createPath: true )
}
bx:zip action="unzip" file="#zipFile#" destination="#destination#" overwrite="#overwrite#"
}
function list( required zipFile, filter = "*" ) {
bx:zip action="list" file="#zipFile#" filter="#filter#" name="local.contents"
var files = []
for ( var row in contents ) {
files.append( { name: row.name, size: row.size, modified: row.dateLastModified } )
}
return files
}
function readEntry( required zipFile, required entryPath ) {
bx:zip action="read" file="#zipFile#" entryPath="#entryPath#" variable="local.content"
return content
}
function hasEntry( required zipFile, required entryPath ) {
return list( zipFile ).some( ( e ) -> e.name == entryPath )
}
}function createBackup() {
var timestamp = dateFormat( now(), "yyyymmdd_HHnnss" )
var backupFile = expandPath( "/backups/app_#timestamp#.zip" )
var backupDir = getDirectoryFromPath( backupFile )
if ( !directoryExists( backupDir ) ) {
directoryCreate( backupDir )
}
bx:zip action="zip" file="#backupFile#" {
bx:zipparam source="#expandPath( '/app' )#" prefix="app"
bx:zipparam source="#expandPath( '/config' )#" prefix="config"
bx:zipparam source="#expandPath( '/uploads' )#" prefix="uploads"
}
return { file: backupFile, size: getFileInfo( backupFile ).size, created: now() }
}try/catch — archives can be corrupt or lockedfinally blockgetTempFile() for dynamically named temporary archives// ✅ Cleanup pattern
var tempZip = getTempFile( getTempDirectory(), "archive" ) & ".zip"
try {
bx:zip action="zip" file="#tempZip#" source="#source#"
// use tempZip...
} catch ( any e ) {
writeLog( "ZIP failed: #e.message#" )
} finally {
if ( fileExists( tempZip ) ) {
fileDelete( tempZip )
}
}~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.