jetdb-cli — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited jetdb-cli (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.
Read-only CLI for Microsoft Access (.mdb / .accdb) databases. Single Rust binary, no runtime dependencies.
cargo install jetdb-clijetdb [--password <PASS>] <COMMAND> [OPTIONS] <FILE> [ARGS]--password is a global flag — it may appear before or after the subcommand.prop target) are matched by exact-case string comparison. Always quote them — Access names commonly contain spaces, multibyte characters, and case-sensitive variants. Use the relevant list command as the source of truth; never guess a name.jetdb: ... (warnings as jetdb: warning: ...).error:).list-style commands with no data → exit 0 with empty stdout (not an error).export and vba show stream their full result to stdout. Always redirect large output to a file (> out.csv) and inspect the file — do not let the agent read the raw stream.export, scan stderr for jetdb: warning: N row(s) skipped. Exit code is still 0 but the CSV is incomplete in that case.jetdb ver <FILE> # Short token: JET3 | JET4 | ACE12 .. ACE17
jetdb ver -l <FILE> # Long form, e.g. "Jet4 (Access 2000/2003)"jetdb tables <FILE> # User tables, one per line, sorted
jetdb tables -s <FILE> # Include system tables (MSys*)
jetdb tables -T <FILE> # Prefix type name (table / systable), tab-separated
jetdb tables -t <FILE> # Prefix numeric type code, tab-separated-t and -T are mutually exclusive.
Output example:
$ jetdb tables -s -T data.mdb
systable MSysACEs
systable MSysObjects
table Customers
table Ordersjetdb schema <FILE> # All user tables, human-readable
jetdb schema <FILE> -T <TABLE> # Single table
jetdb schema <FILE> --ddl sqlite # sqlite | postgres | mysql | access
jetdb schema <FILE> --no-indexes --no-relations--no-indexes and --no-relations apply to both human and DDL output. Human form prints Columns:, Indexes:, Relationships: sections. DDL form emits CREATE TABLE, CREATE INDEX, and ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY statements.
Output example (human-readable):
Table: Customers
Columns:
ID Long NOT NULL AUTO
Name Text(100)
Email Text(200)
Indexes:
PrimaryKey [ID ASC] UNIQUE REQUIREDjetdb export <FILE> <TABLE> # RFC 4180 CSV to stdout
jetdb export <FILE> <TABLE> -H # Suppress header row
jetdb export <FILE> <TABLE> -d $'\t' # Tab-delimited (literal "\t" does NOT work)
jetdb export <FILE> <TABLE> -D "%Y-%m-%d" # Date format (strftime)
jetdb export <FILE> <TABLE> -T "%Y-%m-%dT%H:%M:%S" # DateTime format
jetdb export <FILE> <TABLE> -b hex # Binary mode (default: hex)
jetdb export <FILE> <TABLE> -0 NULL # NULL placeholder (default: empty string)
jetdb export <FILE> <TABLE> -B # Booleans as TRUE/FALSE (default: 1/0)
jetdb export <FILE> <TABLE> -s # Include replication columns-d/--delimiter accepts a string but uses only the first character (warns otherwise). For tab in bash/zsh use -d $'\t'; "\t" is a literal backslash-t.-b modes (default hex):strip — drop binary entirely (empty cell)raw — UTF-8 lossy decode, CSV-escaped only if it contains delimiter / quote / newlineoctal — \NNN per bytehex — lowercase hex per bytewc -l / head to verify.Output example:
ID,Name,Email,Active
1,"Alice","[email protected]",1
2,"Bob","[email protected]",0jetdb queries list <FILE> # Space-separated, sorted
jetdb queries list -1 <FILE> # One per line
jetdb queries list -d , <FILE> # Custom delimiter (first char only)
jetdb queries show <FILE> <QUERY_NAME> # Print reconstructed SQL-1 and -d are mutually exclusive.
jetdb vba list <FILE> # Space-separated, sorted
jetdb vba list -1 <FILE> # One per line
jetdb vba list -d , <FILE> # Custom delimiter
jetdb vba show <FILE> <MODULE_NAME> # Print full source (UTF-8)-1 and -d are mutually exclusive.
Jet4 / ACE only. Access 97 (Jet3) does not store form/report design in the MSysAccessStorage format that form parses.
jetdb form list <FILE> # Forms + reports, space-separated, sorted
jetdb form list -1 <FILE> # One per line
jetdb form list -d , <FILE> # Custom delimiter
jetdb form list --forms-only <FILE> # Forms only
jetdb form list --reports-only <FILE> # Reports only
jetdb form dump <FILE> <NAME> # Dump default Blob stream to stdout — REDIRECT to file
jetdb form dump <FILE> <NAME> -s typeinfo # Streams: blob (default) | typeinfo | propdata | blobdelta
jetdb form controls <FILE> <NAME> # name<TAB>type<TAB>index, one per line
jetdb form props <FILE> <NAME> # Pretty-printed form / control properties--forms-only and --reports-only are mutually exclusive; -1 and -d are mutually exclusive.form dump writes raw binary to stdout. Always redirect (> form.blob) — never let the bytes hit the conversation.form controls: known control codes resolve to type names (e.g. TextBox, CommandButton, Label); unknown codes appear as 0xNNNN.form props: properties come from the Blob payload (RecordSource, ControlSource, Filter, Caption, FontName, Format, event handlers like OnClick, etc.). Binary values render as (N bytes), GUIDs as {…}, booleans as yes/no. Control type names are taken from TypeInfo when available; otherwise the type displays as 0x0000.Output example (form controls):
$ jetdb form controls data.accdb F_Customers
Txt_Name TextBox 1
Btn_Save CommandButton 2
Lbl_Title Label 3Output example (form props):
$ jetdb form props data.accdb F_Customers
Form: F_Customers
Form Properties:
RecordSource SELECT * FROM Customers ORDER BY ID;
Filter ([Active] = True)
FontName MS UI Gothic
Control: Txt_Name (TextBox)
Name Txt_Name
ControlSource Name
FontName Meiryo UIjetdb prop <FILE> <OBJECT_NAME>Shows LvProp values grouped into Table Properties, per-column blocks, and Additional Properties.
Note: if the object name does not exist, or has no LvProp data, prop exits 0 with empty stdout — there is no "not found" error. Confirm the name against jetdb tables (or the relevant list command) first.
.mdb (Jet3 / Jet4) uses Jet RC4 obfuscation that jetdb undoes transparently — no password needed. .accdb (ACE12+) may be password-protected:
jetdb --password "secret" tables protected.accdb
# or equivalently (--password is global)
jetdb tables protected.accdb --password "secret"jetdb ver data.mdb
jetdb tables -s data.mdb
jetdb schema data.mdbjetdb tables data.mdb
jetdb schema data.mdb -T Customers
jetdb export data.mdb Customers > customers.csv
head -n 5 customers.csv
wc -l customers.csvjetdb schema data.mdb --ddl postgres > schema.sqljetdb vba list -1 data.mdb | while IFS= read -r mod; do
jetdb vba show data.mdb "$mod" > "${mod}.bas"
donejetdb queries list -1 data.mdb | while IFS= read -r q; do
printf '=== %s ===\n' "$q"
jetdb queries show data.mdb "$q"
done > queries.sqljetdb form list data.accdb
jetdb form props data.accdb F_Main
jetdb form controls data.accdb F_Mainjetdb: this database is password-protectedjetdb: invalid password*show / form dump|controls|props with an unknown object name → exit 1prop with an unknown object name or no LvProp → exit 0, empty stdout (silent)list-style command with no data → exit 0, empty stdoutjetdb: warning: N row(s) skipped on stderr — treat the CSV as incompleteerror:~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.