Building-code compliance checker. Stdin-first, no Revit dependency.
bim code check [--jurisdiction <id>] [--input <file>] [--rules <id,...>] -- pass rooms with area_sf and glazing_sf; returns pass/fail per room with delta and fix guidance; missing facts produce missing_data severity rather than a guessbim code rules --jurisdiction <id> -- list rules and required facts for a jurisdictionbim code jurisdictions -- list available jurisdictionsnyc-2022 (NYC 2022 BC SS1205.2 natural light + SS1203.5 ventilation), ibc-2021 (IBC 2021 SS1205.2 natural light + SS1203.4 natural ventilation)sheets read --grid -- lossless 2D output: one JSON array per row, header row included, column order preserved. Use for clean grids, the raw header, irregular/blank headers, or a single-row range (which the default header-keyed mode reports as rows:0). Mirrors write --grid (#210).bim google sheets tabs list, bim google sheets write (and similar) previously errored method not found; they now dispatch correctly (#29).bim revit ui / bim bluebeam ui alias to ui-cli (#135).sheets format -- number/text format, bold, fg/bg color, alignment, freeze rows/cols, merge, column width.sheets conditional-format -- boolean rules (NUMBER_LESS / NUMBER_GREATER / TEXT_CONTAINS / BLANK / etc.) to background/text color.drive list --parent + drive.metadata.readonly scope to browse pre-existing files; BYO client ID via bim google login --client-id-file.bim pdf table -- table extraction verb.bim revit model health -- aggregate model quality report.GET /stats aggregate read endpoint.Energy modeling and Passive House compliance checking via NREL OpenStudio CLI.
bim energy run --in model.gbxml — EnergyPlus simulation; returns EUI, annual kWh, peak kW, end-use breakdownbim energy phius.check --in model.gbxml — PHIUS CORE 2024 performance path compliance; returns pass/fail per criterionbim energy install — download and silently install NREL OpenStudio CLI 3.11.0bim energy doctor — verify OpenStudio CLI and EnergyPlus versionsDesire-path feedback can now be uploaded directly from the CLI: bim feedback --upload scrubs all argument values and POSTs to the telemetry worker. Use --dry-run to preview the payload first.
fix(dispatch): -- end-of-flags terminator now correctly passes negative values (e.g. PDF crop coordinates like -785,-123,-348,195) through to drivers without misinterpreting them as flag names/revit-api-reference consolidated Revit API namespace reference pageAnonymous verb-usage telemetry, disabled unless BIM_TELEMETRY=1 is set.
When enabled, one ping is sent per top-level command containing: verb shape,
version, OS family, success flag, error kind, and latency bucket. No IP
addresses, identifiers, arguments, file paths, or sub-day timestamps are
ever collected. DO_NOT_TRACK=true always overrides. See
bimcli.com/privacy for the full schema.
bim site hurricane-zone now returns zones 1–6 for Nassau County addresses (was not_applicable). Source: Nassau County OEM ArcGIS FeatureServer.bim site zoning now covers the Town of Southold (zone codes R-40, HB, LB, LI, etc. with eCode360 links). Suffolk County zoning now covers 9 towns.-ldflags; bim google doctor client-configured check now passes on installed builds.parseFloodZoneFeatures and parseAirportElements — testable
without HTTP.adapters.PostForm deduplicates 5 identical POST-form patterns across nfhl/nces; nces
now inherits rate-limit handling uniformly.nfhl.New / nces.New accept *http.Client (injectable in tests); all command entry
points use DefaultClient (with ThrottledTransport).FuzzParseFloodZoneFeatures, FuzzParseCoord, FuzzClassifyZone.Makefile with cover/fuzz/vuln targets,
internal/covcheck ratchet gate, CI baseline 12.9%.All non-streaming verb responses are now flat JSON objects. The {"jsonrpc":"2.0","id":1,"result":{…}} wrapper is stripped by the dispatcher before printing — agents receive the inner result directly.
Error responses now use the canonical flat envelope ({"ok":false,"error":{"kind":"…","message":"…","hint":"…"}}) instead of the raw JSON-RPC error object. Streaming verbs (output: ndjson / binary) pass through untouched.
New arg types available in driver manifests:
csv-float / csv-int — comma-separated values coerced to []float64 / []int64. Non-numeric values error explicitly (were silently 0 before). --bbox "50,60,550,380" instead of --bboxes "[[50,60,550,380]]".csv-float/csv-int/array/json flag passed more than once accumulates into [[…],[…]]. --bbox a --bbox b replaces the old JSON-string approach.stdin type — flag value is read from stdin (pipe). bim revit exec --code - reads a Python script from the pipe.bim blender quit — new lifecycle verb (kill remains a permanent alias). Terminates the Blender bridge and deregisters the session.--pid is now optional when exactly one instance is running. Zero instances → no-instance error; two or more → ambiguous-instance listing PIDs.bim blender launch --reuse — attaches to a running managed instance instead of spawning a new one.bim revit quit — canonical lifecycle verb; kill kept as permanent alias.no-instance / ambiguous-instance error kinds.status response re-includes the instances array (was accidentally dropped).bim rhino quit / bim rhino kill — new lifecycle verbs; canonical no-instance / ambiguous-instance error kinds on all session verbs.driver-pins.json and fetches binaries from each driver repo's GitHub Releases at build time. Driver updates no longer require committing binaries to bim-cli.bim-google release zip was missing gws.exe; bim google verbs failed on fresh installs.bim rhino doctor returned empty output (JSON-RPC framing bug).New driver: bim blender — connects to a running Blender instance via the Python bridge addon (JSON-RPC 2.0 over TCP). Supports launch, instances, exec, convert, kill, doctor.
New driver: bim google — Docs, Sheets, Drive, and OAuth session management via gws.exe.
flood map / flood vector accept string lat/lon (was float-only, caused parse errors from assess JSON output piped directly).--address without requiring explicit --lat/--lon flags.CreateProcessW path, discovery timing).--pid accepted as string or int; DETACHED_PROCESS flag on RDP sessions.New driver: bim pdfv — a native PDF viewer (Rust + PDFium + egui) that exposes an agent-driven control surface via JSON-RPC 2.0 named pipes. First session-kind driver in bim-cli.
bim pdfv open --file drawings.pdf --layout left # open viewer, returns pid + pipe name
bim pdfv open --file code.pdf --layout right # side-by-side
bim pdfv search --pid <N> --pattern "28-302" # search + auto-navigate + highlight
bim pdfv navigate --pid <N> --page 96 # go to page (0-indexed)
bim pdfv highlight --pid <N> --page 96 --bboxes "[[72,425,542,438]]"
bim pdfv fit --pid <N> # fit page width to window
bim pdfv render --pid <N> --out frame.png # snapshot current view to PNG
bim pdfv state --pid <N> # current page, scale, highlights
bim pdfv instances # list all running viewers with PIDs
Key properties:
bim pdfv open call detaches the GUI and returns immediately; bim-cli does not block\\.\pipe\pdfv-{pid} provides persistent IPC between viewer and agent%LOCALAPPDATA%\bim-cli\instances\pdfv-{pid}.json — bim pdfv instances scans and prunes dead PIDs automatically--layout left|right|top|bottom|full positions the window on launch; no external window-management script needed--pidbim pdfv render bakes active highlights and annotations into the PNG — what you see in the window is what the agent seesRuntime dependency: pdfium.dll (7 MB) ships alongside bim-pdfv.exe in the drivers/ directory.
7 new NYC verbs (all no-key, all wired into assess): e-designation, stormwater-flood, building-history, brownfield, coastal, special-district, subway. NYC assess now returns 23 layers.
satellite.map — new first-class global imagery verb. Works for any coordinate worldwide with no parcel registry required. Supports Esri Wayback dated imagery (193 snapshots 2014→2026, monthly), live World_Imagery, and optional parcel outline overlay where registry coverage exists.
parcel.map improvements: --satellite flag and --wayback-date YYYY-MM-DD for dated Esri Wayback imagery.
airport.lookup fix: Overpass query now searches (node; way; relation) with out center; — previously only found node-type airports, missing JFK, LGA, EWR and all other polygon airports.
Rate-limit propagation: assess response gains throttle_hint with affected_layers, retry_after_secs, and exact retry commands when any layer is rate-limited. Individual verbs surface retry_after_secs and throttle_source in error.data. Agents can check structured fields rather than parsing error strings.
pkg/rpc — Data struct additionsrpc.Data gains two new optional fields:
retry_after_secs int — seconds to wait before retrying a rate-limited callthrottle_source string — hostname of the service that issued the rate limitThese fields are omitempty — no change to existing response shapes.
bim pdf package now produces conformant PDF-BIM v2 files.
Every packaged PDF gets:
/AF array on the document catalog, pointing to each embedded BIM filespec/AFRelationship /Data + /Subtype application/json on each filespec — standard PDF attachment-discovery path; any PDF/A-3 reader finds the data without guessing filenamespdfbim:version=2 + pdfbim:generator in the XMP metadata stream — sniffable in <2KB without extracting attachmentsNew verb: bim pdf bim validate <file> — checks all three spec layers and reports conformance:
bim pdf bim validate drawings.pdf
{"ok":true,"result":{"profile":"v2","checks":{"af_present":true,"pdfbim_xmp":true,"elements_attachment":true,"marks_attachment":true,"elements_schema":true,"marks_schema":true,"join_resolves":true}}}
Reports profile: "v2" (conformant), "legacy-v1" (old packages without /AF), or "unknown".
Marks bounds are now CTM-correct. The walker tracks q/Q/cm operators; element bounding boxes are device-space coordinates. Fixes latent misplacement on PDFs that apply viewport transforms (rotated/scaled detail callouts).
Backward compatible. Old packages (no /AF, no XMP marker) continue to open in the viewer and are reported as legacy-v1 by the validator.
Scenario tests pdf-archive-pdfa3 and pdf-shrink-batch were checking for result.outputFile — corrected to result.path (field was renamed in v0.2.1).
bim site assess now supports Taiwan addresses with automatic country detection — no flag or config change needed. Any address containing Chinese characters or Taiwan city/county keywords routes through the Taiwan layer stack; all US functionality is unchanged.
Geocoding: Nominatim OSM is the default — no API keys. Set BIM_SITE_TGOS_APPID + BIM_SITE_TGOS_APIKEY for house-number precision via TGOS (free registration at api.tgos.tw).
Taiwan layer stack: elevation (Open-Meteo SRTM), faults (GSMMA), seismic (Taiwan Building Code static zone), school (OSM Overpass 1 km), parcel (NLSC Open API + Nominatim reverse), zoning (luz.tcd.gov.tw cache-backed PIP), flood (NCDR registry-routed), airport/historic/transit (OSM/Transitland, global).
luz.tcd.gov.tw zoning: On first call per county, downloads all zone polygons from the National Development Council (Taiwan), caches locally (30-day TTL), answers subsequent queries via point-in-polygon. Geo-IP accessible from Taiwan. No API key required.
New optional env vars: BIM_SITE_TGOS_APPID, BIM_SITE_TGOS_APIKEY, BIM_SITE_CACHE_DIR.
Example:
bim site assess --address "台中市西屯區市政路200號"
All US verbs unchanged. Global layer (airport/historic/transit) jurisdiction tag changed from "federal" to "global" in JSON output (cosmetic).
bim info path was double-prefixing driver name (bim-bim-pdf.exe); fixed"path" (was "outputFile"); output defaults to %TEMP%\bim-cli\out\--address geocodes automatically on all verbs; map/vector verbs return "path" keyresize --width N without --height scales proportionally (was 0×0 crash); file verbs return "path"sheets/info row counts exclude headerstatus exits 0 when Revit not running"bim-rhino"; status exits 0 when Rhino not runningparcel map subverb; SF parcel bbox+centroid strategya841-dotweb01.nyc.gov). Previously only Manhattan (36061) was registered, with a stub adapter that had no Go implementation. All five borough FIPS codes (36005, 36047, 36061, 36081, 36085) now use arcgis_feature with corrected field names (ZoneDist1, Landmark, HistDist, BldgArea).bim site hurricane-zone: NYC hurricane evacuation zone (1–6, 1=highest risk). Source: NYC DCP/NYCEM FeatureServer. Returns not_applicable outside NYC. Added to assess orchestrator under NY gate.bim site landmark: NYC LPC landmark status — individual designation and historic district membership. Parallel query: MapPLUTO + LPC Historic Districts FeatureServer. Added to assess orchestrator under NY gate.bim site parcel now accepts --address --geocode (previously lat/lon only).bim pdf report: new verb that generates a graphical multi-page PDF site assessment from bim site assess JSON output. Accepts --data <path> or stdin. Fetches basemap images (Esri satellite, street, USGS topo, USGS imagery+topo) automatically from lat/lon in the assess data. Accepts --flood-map and --school-map from bim site flood map / bim site school map. Renders: cover, 14-row data layers table with colour-coded status, maps section, NYC regulatory panel (when state=NY), unknowns table.bim site assess --address "4720 Center Blvd, Long Island City, NY 11109" > assess.json
bim site flood map --lat 40.7461 --lon -73.9570 --out flood.png
bim site school map --lat 40.7461 --lon -73.9570 --out school.png
bim pdf report --data assess.json --flood-map flood.png --school-map school.png --out report.pdf