bim revit now covers Revit 2024 through 2027, up from 2025-2026. No new verb and no
protocol change -- the same commands work against two more Revit years.
Revit 2024 and Revit 2027 support via bim-revit v0.3.0. The constraint was a
runtime split, not a feature gap: Revit 2024 hosts .NET Framework 4.8 and Revit 2027
hosts .NET 10, where 2025/2026 host .NET 8. The add-in now multi-targets
net48;net8.0-windows;net10.0-windows and the driver ships one payload per year.
Both new years were validated against live Revit installs, not just compiled: the
add-in loads, binds its bridge, and exec compiles and runs C# through Roslyn. Asked
from inside the add-in, it reports .NET Framework 4.8.9310.0 on 2024 and .NET 10.0.9
on 2027 as its host runtime -- which is what distinguishes "it built" from "it runs".
Version reach is the durable differentiator recorded in the 2026-08-09 listening pass -- "But that only runs in 2027. This runs in any version." -- so the supported-year range is a product surface, not build trivia.
ElementId note for script authors: 2024 and 2025 expose both .Value and
.IntegerValue; 2026 and later expose only .Value. .Value is the single safe
spelling for 2024+.
CI now runs driver-conformance against every driver in driver-pins.json, i.e. exactly
the binaries a release bundles. Each driver repo tested only itself, so drift in the
SHARED contract was invisible until someone audited by hand -- which is how bim-code and
bim-sketchup both shipped without the required version verb, and how bim-sketchup
returned its process exit code (2) as a JSON-RPC error code instead of -32601. Both
are fixed and re-pinned below.
The gate is a ratchet: it blocks new drift immediately, and the violations that already
existed are recorded in an $exempt baseline with a reason and a filed issue rather than
silently blessed. bim-code/bim-rules are pure-computation drivers that can satisfy
neither branch of describe:has-extensions (DIM-1369); bim-pdfv declares kind:session
without implementing the session contract (DIM-1370). Exemptions are per-CHECK, not
per-driver, so a baselined driver is still fully audited on everything else -- verified by
fault injection.
bim-oauthr is skipped outright: driver-pins.json is the BUNDLING list, so it also
carries binaries the host ships but does not route as JSON-RPC drivers. oauthr is a
credential-broker passthrough, already absent from the manifest and from bim doctor.
Auditing it as a driver produced 8 permanent failures, and a gate that always reports the
same failure is one people stop reading.
bim-revit v0.2.2 -> v0.3.0 for the Revit 2024/2027 support above.bim-code v0.3.1 -> v0.3.2 and bim-sketchup v0.1.1 -> v0.1.2, picking up the
driver-contract fixes above.Logging moves into the dispatcher. Drivers no longer write log files of their own, and
bim.jsonl becomes one central stream carrying what was asked for, what happened, and
what the call exercised. No new CLI surface -- the changes are to the local log schema
and to a driver pin.
exit-N. That
hit exactly the verbs whose failures are hardest to diagnose: a failed
bim google login logged err="exit-1" against a five-minute timeout while the driver
had reported login timed out, and a failed sheets read logged exit-3 while the
driver had reported not-found with a message and a remediation hint. The last line is
now retained and parsed, and the kind, message and hint recorded (#191).flags, arg_count,
has_stdin, out_format, result_count. These were already computed on every
invocation and handed only to the telemetry event, which no-ops without a build-time
key, so on any non-release build they were computed and discarded. Flag names are
normalised to bare form so they join against the driver manifest's arg names, which
makes "which declared flags does nobody ever use" answerable (#192).run_id correlates the invocations of a session. Each record was previously an island,
so a caller working through a problem across several commands was indistinguishable
from unrelated traffic. Honored from BIM_RUN_ID when set, minted per process
otherwise, and exported to every driver at spawn (#192)._usage block on the RPC result lets a driver report what a call
exercised without writing anything itself. The schema belongs to bim-cli, is bounded,
and a malformed block is recorded as usage_err rather than silently dropped (#192).bim-revit pinned to v0.2.2, which returns _usage instead of writing its own
exec-api.jsonl. That file had no rotation anywhere, an ok field that defaulted to
true and so recorded zero failures across 675 entries, and a UTF-8 BOM that broke naive
per-line parsing. bim revit alias rank now reads bim.jsonl and still counts the
legacy shape, so existing symbol history stays usable (#194).unknowns.jsonl is documented and now guarded as a deliberate second file rather than
duplication to be merged away. It is the egress buffer: membership in it is what makes a
record eligible for bim feedback to scrub and upload, while bim.jsonl is local-only
and holds full argument values. A test fails if the upload path ever reads the
local-only log (#193).A driver-pin patch release. No dispatcher changes -- both commits since v0.10.0 bump a pinned driver to a release that fixes a feature which was fully broken in the version v0.10.0 bundled.
bim google login works again, and so does every bim google sheets <verb>.
Bumps the bim-google pin v0.5.0 -> v0.5.1 (bim-google#35). v0.5.0 and earlier built
the OAuth authorization URL from a build-time client ID that nothing injected, so
Google received client_id= and answered "Missing required parameter: client_id";
the driver then waited out its full five-minute timeout and reported only
login timed out -- try again, never naming the cause. Separately, every sheets
flag was rejected as unknown, because the driver declared its argument names with
leading dashes while the dispatcher strips -- before matching (producing the
----spreadsheet hint); --id was rejected too -- implemented and documented, but
never declared.google entry in the bundled manifest.json lists verbs again. It had been an
error entry ({"ok": false, "error": {"kind": "protocol-mismatch"}}) with zero
verbs, because bim-google declared no protocol_version -- so bim-cli's capability
document advertised no sheets or drive surface at all and agents reading it could
not discover the driver. v0.5.1 declares protocol_version: "2.0", and the slot is
regenerated from that release: 33 verbs, correct bare argument names (#189).bim revit exec opens documents again on Revit 2026. Bumps the bim-revit pin
v0.2.0 -> v0.2.1 (DIM-1342, #188); v0.2.0 cancelled every OpenDocumentFile call and
had also dropped the raw release asset name that bim-cli installs fetch.This release collects the driver-release wave and ships the 11 bim-cli commits
accumulated on main since v0.9.0. It is the first release to consume the
repo-external bim-pdfv pin (v0.2.0). Two of the CLI changes are measurement- or
agent-critical: routed telemetry verbs no longer fold positional file arguments
into the verb key (previously roughly 6.4% of telemetry events were silently
rejected at ingest, and file paths could cross the wire despite the package doc
promising they never do), and describe now answers scoped --driver/--verb
help so a caller no longer re-fetches the full 226 KB manifest to learn a verb's
args.
Version rationale: bumped to v0.10.0 (minor, not patch) because of new
user-visible CLI surface -- scoped describe --driver/--verb with --help
routing, unknown-flag rejection with a near-miss hint, and a newer-version notice
on failing commands -- plus a wave of driver minor bumps.
describe --driver <name> and describe --verb <name> return a scoped view of a
single driver or verb, and --help routes to it, so agents stop re-fetching the
full manifest to answer "what args does this verb take" (#183).revit status now reports lastLaunch, and launch lifetime is documented as
process-scoped (DIM-1279, #182).--flags are now rejected with a bad-args error and a near-miss hint
instead of being silently ignored (DIM-1277, #180).modal-blocked, and dismiss --cancel handles
dialog #32770 (DIM-1278, #181).go test step to CI (DIM-1272, #178).manifest.json is regenerated against the pinned driver set (DIM-1248, #177).bim-revit v0.1.16 -> v0.2.0bim-rhino v0.1.2 -> v0.2.0bim-google v0.4.0 -> v0.5.0bim-oauthr v0.3.0 -> v0.3.1bim-code v0.2.1 -> v0.3.1 (pin was stale; code-cli had already published v0.3.1)bim-site v0.7.0 -> v0.8.0 (supersedes the off-mainline v0.7.0)bim-pdf v0.4.0 -> v0.4.1 (landed on main in #186)bim-pdfv first release to consume the pin (v0.2.0), replacing the
committed-binary workaround (DIM-1247, #176)bim-blender held at v0.5.3 -- main is missing behaviour v0.5.3 ships
(IfcOpeningElement); reconciliation is tracked separately.This release ships the 3 fixes accumulated on main since v0.8.0 and bumps the
bim-site driver from v0.6.7 to v0.7.0. The driver bump is the headline: site-cli
v0.7.0 adds a MassGIS parcel adapter, Miami 21 zoning providers, a frontage verb,
and a massing-envelope verb -- new user-visible surface that justifies the minor
version increment. It also delivers the retry fix for nfhl-reachable (the FEMA
TCP-drop flakiness measured at 1 in 5 runs on a healthy host). The three bim-cli
commits are host-hygiene fixes that take effect on the next upgrade.
Version rationale: bumped to v0.9.0 (minor, not patch) because bim-site v0.7.0
exposes new user-visible verbs (frontage, massing-envelope) and new data
providers, constituting new user-visible surface per semver convention.
bim-site bumped to v0.7.0: adds MassGIS parcel adapter, Miami 21 zoning
providers, frontage and massing-envelope verbs; also delivers the
nfhl-reachable retry fix that prevents a single dropped FEMA TCP connection
from failing bim doctor outright (DIM-1233).doctor indefinitely (DIM-1229, #174).driver_version in telemetry now matches the binary (DIM-1228, #173).This release delivers the telemetry v2 client and ships the 8 commits accumulated
on main since v0.7.0. Its headline is the client half of telemetry v2
(DIM-901): every dispatched run now populates the new Event fields -- driver,
exit_stage, flags, arg_count, out_format, and result_count -- which the
worker has accepted since v0.7.0 but which stayed NULL in production until a
client shipped them. It also adds a first-run telemetry notice, synthesizes usage
hints on bad-args errors, and bumps the bim-pdf renderer to v0.4.0.
driver, exit_stage, flags, arg_count, out_format, result_count)
and attach a distinct_id + hint to feedback, closing the measurement gap the
worker-side schema opened in v0.7.0 (#170, DIM-901).bad-args errors that carry an empty hint, so a
misused verb points at its own correct usage (DIM-1086).bim-pdf bumped to v0.4.0 (DIM-1160).Stat on an unknown-driver error to absorb the brief
file-swap window during a driver upgrade, so an in-progress upgrade no longer
surfaces as a spurious unknown-driver failure (DIM-1093).result_count event field
(DIM-1080).This release ships the 13 commits accumulated on main since v0.6.0. It adds
new revit verbs, changes bim feedback to upload by default (a behaviour
change), bundles the faster bim-pdf v0.3.5 renderer, and delivers the
acad/sketchup doctor first-run relief plus the structural doctor fix. It
supersedes the never-cut v0.6.1 -- that entry documented only the doctor fix and
mislabelled a minor release (new verbs) as a patch; no v0.6.1 tag or R2 build
was ever produced.
revit gains save and export-image verbs and an open --activate flag
(DIM-1036).bim prints a feedback hint to stderr on any non-zero exit, so a failing run
points at how to report it (DIM-1041)./revit-cli/ landing page on bimcli.com targeting the "revit cli" query
(DIM-1045).bim feedback now uploads by default. Feedback is sent unless you pass the
new --no-upload flag; all advertising surfaces were updated to match
(DIM-1044). Prior versions required an explicit opt-in to upload.bim-pdf bumped to v0.3.5: pdfium-based rendering, faster pdf pages, and
parallel marked-content extraction (DIM-1035).feedback.did (DIM-900).bim doctor no longer exits 1 on machines without AutoCAD or SketchUp:
bim-acad (autocad-cli v0.1.1) and bim-sketchup (sketchup-cli v0.1.1)
now mark their host-presence checks optional, so a missing host app
downgrades to NOTE / exit 0 instead of FAIL / exit 1 (DIM-1071).bim doctor inverts the bridge/session probe default and adds a conformance
guard; the overall result now reports degraded rather than a hard fail when
only optional checks are down (DIM-1079).ok/errKind: an RPC error envelope returned
with exit 0 is reconciled to a consistent failing event (DIM-1068).findArgSpecs live-describe fallback fixed so an incomplete
manifest no longer starves stdin or drops arg specs (DIM-1039).This release ships 30 commits that had accumulated on main since v0.5.0,
including the doctor first-run regression fix and the telemetry v2 foundation.
It also bumps the bim-google driver pin.
bim doctor failures are now recorded in telemetry with their check details,
so a failing environment is diagnosable from the fleet rather than opaque.distinct_id that joins
install events to later command telemetry, plus install/first-event
timestamps, and captures the install-intent beacon referrer.revit exec gains a --failures delete-warnings|rollback preprocessor
option for controlling how Revit warnings/failures are handled mid-transaction.bim now writes a per-run bim.jsonl operation log.BIM_DEBUG routing trace surfaces the dispatcher's driver-resolution path and
probe stderr for troubleshooting.bim doctor no longer hard-fails the whole run when an optional check fails.
Checks marked optional (for example a host-app presence probe on a machine
without Revit / Blender / Rhino / SketchUp, or an optional auth check) now
downgrade to a NOTE and leave the overall result ok with exit 0, instead of
reporting overall: fail and exiting non-zero on a correct install
(normalizeDoctorResult + three-valued row status). This was a 100% first-run
bounce for fresh installs on host-app-less machines.exit-N floor and wires the doctor telemetry error, so every failing event
carries a machine-readable kind.bim-google pinned to v0.4.0, which fixes Google Sheets write-path error
classification (google.sheets.write failures were previously misclassified).revit exec reports modal-blocked instead of a retriable timeout when Revit
is showing a modal dialog.revit exec auto-detects script-managed transactions and skips the automatic
transaction wrap.revit export-sheets honors a .pdf extension in --output and accepts an
--out alias.describe/doctor/DESIGN.lastmod, flood-zone heading, and normalized internal
links to trailing slashes.dispatch.Route now surfaces the resolved driver name, driver version, and
exit stage in its result (result shape changed -- a minor-version reason).telemetry.Fire refactored to accept an Event struct.bim-linear driver removed (breaking). bim-linear is no longer bundled,
documented, or listed in the checked-in manifest. driver-pins.json, the
vendored drivers/bim-linear.exe, the Linear docs pages, and the Linear
scenario fixture are removed so fresh installs and the website no longer
advertise a bim linear surface. Anyone invoking bim linear must migrate./stats telemetry endpoint and the dead bim analytics verb removed,
closing a live privacy/attack-surface item.New driver bim-acad, pinned from HelloHowAreYouHaveANiceDay/autocad-cli @ v0.1.0
and vendored into drivers/. It drives the headless AutoCAD Core Console
(accoreconsole.exe) on a local AutoCAD 2025/2026 install -- no GUI, no add-in DLL.
Verbs: info (layers/layouts/blocks/entity counts/extents), extract (model-space
entities as NDJSON), convert (DWG<->DXF version-targeted, or print to PDF via the
built-in DWG To PDF.pc3 plotter; --dry-run/--yes), and exec (arbitrary
.scr/AutoLISP). Results are read from LISP-written side-car files;
accoreconsole's UTF-16 stdout redirect is never parsed. bim acad ... routes to it.
bim-linear graduated to its own repo (HelloHowAreYouHaveANiceDay/bim-linear)
and is fetched as a pinned driver via driver-pins.json (@ v0.1.0), like every
other driver. The now-redundant in-repo source cmd/bim-linear/ and its
duplicate cross-compile steps in release.yml + release-local.ps1 are removed;
the pinned release asset is the single source. Runtime behaviour of bim linear
is unchanged -- the manifest entry, driver docs, and vendored drivers/bim-linear.exe
are all retained.
Bumps bim-pdf driver to v0.3.4. The validator now accepts packages produced
by bim blender ifc.export-pdf: elements.json in canonical bim-pdf-1.0
format (bim-pdf, meta, source, class_registry, elements) passes
elements_schema and join_resolves checks. Profile field now returns
"bim-pdf-1.0" for canonical packages. Legacy v2 and flat-array formats
still accepted.
New in-repo driver bim-ifc (cmd/bim-ifc). Reads IFC (ISO-10303-21) files
at the STEP/header level without requiring a running Blender session.
bim ifc info <file.ifc> prints: schema version (IFC2X3, IFC4, IFC4X3), MVD /
view definition, project/site/building names, units, and per-type entity counts.
--json flag emits the same data as structured JSON.
The bim ifc alias is updated: info, describe, doctor, and version route
to the new offline driver; all other verbs (render, import, etc.) still delegate
to bim blender ifc.
bim sketchup ships as a pinned driver (sketchup-cli v0.1.0). It uses
the same TCP bridge pattern as bim revit: a Ruby extension (bim_bridge.rb)
listens on port 15700 inside the SketchUp process; the Go CLI speaks JSON-RPC
to it over loopback.
Targets SketchUp Make 2017 by default (free, no account needed). Pro/2026
is supported with --year or --url override but requires a Trimble subscription.
Verbs: launch, close, exec, open, export, status, doctor,
install, setup.
setup downloads Make 2017 from archive.org (~148 MB) and guides the user
through the one required UAC step.install writes bim_bridge.rb into %APPDATA%\SketchUp\SketchUp 2017\SketchUp\Plugins\.launch detects the install via the Windows Uninstall registry (works for
non-default paths), prefers Make over Pro, passes the saved default template
on the command line to skip the welcome chooser. Cold start ~13s.close quits gracefully via Sketchup.quit, falls back to process kill.exec evaluates Ruby against the live model: bim sketchup exec --code "Sketchup.version".bim-oauthr pin bumped from v0.2.0 to v0.3.0 (DIM-220). oauthr now ships as a
vendored driver in the bim-cli release zip (fetched from the oauthr repo's GitHub
Release at build time) rather than a runtime download. The broken runtime-download
path (firstrun.go: empty sha256 pins, wrong version, 404 downloadBase) has been
removed; the first-run flow now only drives consent + bim oauthr connect.
All four oauthr-binary resolvers now agree on <drivers>/bim-oauthr.exe (the
bim oauthr passthrough, bim doctor's checkOauthr, the bim-linear doctor
probe, and the first-run intercept), with PATH and co-install next to bim.exe
as fallbacks. bim-oauthr is excluded from format-driver enumeration
(listDrivers) since it is a kind: bridge, not a JSON-RPC driver.
bim-google pin bumped to v0.3.5. Includes oauthr control-plane auth hardening
(same POST /v1/internal/token contract fix as bim-linear v0.1.0) and a
drive-proxy bug fix.
bim-linear is now pinned in driver-pins.json (HelloHowAreYouHaveANiceDay/bim-linear
@ v0.1.0) and fetched from its GitHub Release at build time. Previously the
in-repo cmd/bim-linear was cross-compiled during release.yml; it is now a
first-class driver like all others, with its own release asset.
The release workflow's build bim-linear.exe (in-repo driver) step is retained
as a fallback for the workflow_dispatch path but the pinned release asset takes
precedence in the standard tag-triggered flow.
bim linear graphql auto-starts the oauthr proxy and returns data when
OAUTHR_CONTROL_URL is configured; returns kind: auth-required with a
bim oauthr connect linear hint otherwise.
Three new builtin alias verbs in bim-revit v0.1.16 (read-only, no transaction):
bim revit element-list --category <cat> [--level <name>] [--properties <p1,p2>] --
lists non-type elements by category using FilteredElementCollector. --category accepts
a BuiltInCategory enum name (OST_Walls) or display name (Walls). --level filters by
level name (case-insensitive). --properties appends extra parameter columns to each row.bim revit schedule-read --name <schedule> -- reads a named ViewSchedule and returns
column headers + data rows as JSON via ViewSchedule.GetTableData().bim revit material-query --name <material> -- returns a material's appearance asset
properties: transparency, shininess, smoothness, color (RGB), and appearance_asset
name from AppearanceAssetElement.Two new builtin alias verbs in bim-revit v0.1.14:
bim revit pdf-view [--output <path>] -- exports the active Revit view to
PDF using PDFExportOptions. --output defaults to a temp file when omitted;
prints the written path in outPath.bim revit view-activate --name <viewname> -- activates the named view by
setting uidoc.ActiveView. Case-insensitive name match; errors if the view is
not found. Runs without a Revit transaction (required for UI operations).Three new builtin alias verbs in bim-revit v0.1.13:
bim revit rotate --id <eid> --angle <deg> [--axis x|y|z] — rotates one
or more elements about an axis through each element's location point.
--angle in degrees; --axis defaults to z. Wraps
ElementTransformUtils.RotateElement inside a Revit transaction.bim revit move --id <eid> [--dx <ft>] [--dy <ft>] [--dz <ft>] — translates
one or more elements by a vector in feet. Wraps
ElementTransformUtils.MoveElement inside a Revit transaction.bim revit location --id <eid> — reads the LocationPoint.Point for one
or more elements; returns {id, x, y, z} per element. Read-only, no transaction.All three accept comma-separated --id lists.
bim oauthr and the oauthr-backed cloud drivers (e.g. bim linear) could never
find the oauthr binary on a normal install: the only install path was a runtime
download in internal/oauthr/firstrun.go that was broken three ways -- empty
sha256ByPlatform pins (hard-fail), PinnedVersion v0.1.0 (actual 0.2.0), and a
downloadBase (oauthr.com/releases) that 404s -- and it installed to a
different directory than the bim oauthr passthrough searched.
oauthr now ships like every other driver: pinned in driver-pins.json
(bim-oauthr -> HelloHowAreYouHaveANiceDay/oauthr), fetched from the oauthr
repo's GitHub Release at bim-cli build time, and vendored into drivers/ as
bim-oauthr.exe.
<drivers>/bim-oauthr.exe (the
bim oauthr passthrough, bim doctor's checkOauthr, the bim-linear doctor
probe, and the first-run intercept), with PATH and a co-install next to
bim.exe as fallbacks. The passthrough honours BIM_HOME.bim-oauthr is excluded from format-driver enumeration (listDrivers): it is
a kind: bridge reached via the bim oauthr passthrough, not a JSON-RPC
driver, so bim describe/bim doctor no longer probe it over the wrong
protocol. Its health is reported by checkOauthr.firstrun.go
(Download/Installed/ExePath/sha256ByPlatform/PinnedVersion/
downloadBase); the first-run flow now only drives consent + bim oauthr connect since the binary is always vendored.bim-code was a pure-CLI driver, but the dispatcher interrogates drivers via
JSON-RPC over stdin (protocol_version "2.0"). So bim code <verb> printed usage
and bim doctor reported FAIL code. Re-pinned to code-cli v0.2.1, which
rewrites the driver to rpc.Serve like every other driver. Verified through the
dispatcher: bim code doctor -> ok:true; check/rules/jurisdictions return data.
End-to-end testing against the live oauthr + Linear API surfaced two bugs that
made every bim linear call fail. Both fixed and verified (list, get,
exec return real data):
GET /v1/token?service=linear,
which does not exist on the oauthr control plane (404) -- so the direct
control-plane path never authenticated and always fell through to
auth-required. Now calls POST /v1/internal/token with the principal/service
in the body and reads access_token, matching the oauthr contract.list state filter: emitted Linear's state.type filter as bareword enums
({ type: { in: [unstarted, started] } }). Linear's type filter is a
StringComparator, so this returned HTTP 400 (String cannot represent a non string value). Now emits quoted strings.scripts/release-local.ps1 -- cut a release entirely from a local Windows box
(stage drivers -> build -> zip -> R2 upload -> flip latest.txt -> verify),
mirroring release.yml. For use when GitHub Actions is unavailable (e.g. an
Actions spending-limit block) or for out-of-band hotfixes.Linear project management integration using oauthr for credential brokering (no tokens stored locally -- DESIGN.md SS15).
bim linear list [--team <key>] [--limit N] [--state <type>] -- list open issues; defaults to unstarted + startedbim linear get <identifier> -- fetch a single issue by identifier (e.g. DIM-120)bim linear create --title <str> [--team <key>] [--description <md>] -- create an issuebim linear comment <identifier> --body <md> -- add a comment to an issuebim linear status <identifier> --state <name> -- update workflow state (resolves state by name)bim linear exec --gql '<query>' [--variables <json>] -- arbitrary GraphQL passthrough for power userskind: "auth-required" with hint: "oauthr connect linear"bim doctor surfaces oauthr availability and Linear session status via the driver's doctor checksoauthr:linear, network:api.linear.appExpanded NYC Building Code 2022 coverage -- 5 new room-level rules beyond the original light/air pair.
nyc-2022-1208.1 -- minimum ceiling height (7 ft habitable rooms, 7 ft 6 in bathrooms, 7 ft corridors)nyc-2022-1208.2 -- minimum room area (70 SF for first room; 50 SF additional habitable rooms; 35 SF kitchen; 30 SF bath)nyc-2022-1208.4 -- minimum room dimension (7 ft least dimension for habitable rooms)nyc-2022-1010.1.1 -- egress door minimum clear width (32 in clear, 36 in nominal)nyc-2022-1005.1 -- egress width capacity factor (0.2 in/occupant; occupant load from area + occupancy type)ibc-2021 (natural light SS1205.2 + natural ventilation SS1203.4)bim code jurisdictions now returns ["ibc-2021", "nyc-2022"]describe output updated to enumerate the full rule coverageBuilding-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)bim revit alias list -- list all builtin and user-tier alias scripts; user scripts shadow builtins by name.bim revit alias show --name <alias> -- print script body and metadata (wraps, description, language).bim revit alias rank [--top N] -- rank Revit API symbols by frequency across logs/exec-api.jsonl; surfaces the most-exec'd patterns as promotion candidates.sheet-list, warnings-export, linked-models, param-dump, export-sheets (convenience wrappers that were previously hand-written exec snippets).describe --json aliases[] now reflects the full on-disk set (system + user tier).exec call appends an entry to %LOCALAPPDATA%\bim-cli\logs\exec-api.jsonl containing only PascalCase API identifier tokens -- no string literals, numeric literals, file paths, or parameter values. Feeds alias rank for desire-path analysis.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