Repository navigation
Releases: loobric/loobric-cli
Release list
1.9.0 — CAM library importers
CAM library importers
loobric import now reads Vectric .vtdb, SprutCam .db, and CAMotics JSON tool tables.
- CAM user libraries have no manufacturer/product_code natural key, so they become ToolInstanceRecords through the 0.15.0 batch sync door, keyed by
(client, client_item_id)— re-imports update in place, never duplicate. - Cutting data rides along as preset contributions where the floor is met: Vectric's per-material/per-machine rows normalize to vc/fz/ratio with labels like
Acrylic @ Journeyman; SprutCam when its material id resolves. - Shape is asserted only from each format's declared type enum (verified subsets) — honest absence over a wrong silhouette.
- Verified against the real Cadence Jenny Line
.vtdband a real SprutCam library; CAMotics read from its open source. - Fusion-library JSON is redirected to loobric-fusion by name.
New API: loobric.importers.base.LibraryToolDraft, run.import_library_drafts().
Tracking: loobric-clients #11 #17 #18 #22.
1.8.0 — batch sync verbs + keep-alive transport
Pairs with loobric-server 0.15.0 (the batch sync doors, docs/BATCH_SYNC.md).
Added
Client.sync_tool_records()/Client.sync_catalog_records()(both oversync_records_batch()): batch-sync many records in one transaction per chunk — items carrydata+asserts+presets, per-item result tuples return in request order, and chunking at the server's 200-item cap is transparent. A pre-0.15 server 404s; callers fall back to the per-record doors.
Changed
- Transport keep-alive: one pooled connection per (scheme, host) per thread instead of a fresh TLS handshake per request — the dominant client-side latency against api.loobric.com behind Cloudflare. Stale reused sockets retry once; POSTs only retry when the failure happened before the request was sent, so nothing can duplicate.
Measured (with the server door): a 327-tool Fusion library import went from ~11 minutes to ~4 seconds.
loobric-cli 1.7.0 — the completeness pass
Added
- Completeness pass (audit 2026-08-16 — the library and CLI had fallen a feature generation behind the server):
Client.delete_preset()(reference-client-first parity restored); label verbs and commands end to end (create-labels,list-labels,delete-label,print-labels,label-tool,unlabel-tool); spec labels from the terminal (loobric print-spec-labels <ids> --template --stock --format pdf|csv|json— printing never mints); account backup (loobric export→ the owner-operated zip) andseed-demo; catalog commands (create-catalog,list-catalogs,show-catalog,rename-catalog,catalog-members,delete-catalog --yes); preset commands (contribute-preset,list-presets,delete-preset); binary transport for PDF/zip responses. - Three new MCP tools (26 total):
list_catalogs,create_catalog,set_catalog_members— agents can file the records they research (organization, never identity; deliberately no delete tool). The glossary/concepts resources are refreshed with the cutting-data-preset doctrine (origin-vs-transcriber) and the Catalog entity.
Fixed
- MCP
assert_fieldrecovers transport-stringified numbers ("19.05"→ 19.05, the CLI assert rule) — a string in canonical geometry broke numeric consumers downstream.
Changed
- Catalog verbs target the v2 Catalog entity (server ≥ 0.14.0), replacing the dead v1 manufacturer-catalog verbs.
loobric-cli 1.6.0 — cutting data presets
Added
- Cutting data presets (server ≥ 0.13.0; loobric-server
docs/PRESETS.md, grilled 2026-08-16):Client.contribute_preset()/Client.list_presets()for the audited contribution door — an F&S recommendation with a source, engineering values only, replace-own on(origin, label). Two new MCP tools,contribute_presetandlist_presets(23 tools total): the contribute description teaches the doctrine — origin is the recommender, the agent is stamped as transcriber, raw feed/RPM are never stored, and replace-own is the agent's only revision path (removal stays a human act; there is deliberately no preset delete tool).
loobric-cli 1.4.1 — MCP SDK pin + field-session fixes
Fixes a startup crash on every fresh install: the MCP Python SDK released 2.0.0, removing the 1.x low-level Server API — the [mcp] extra is now pinned mcp>=1.0,<2, and environments already holding SDK 2.x get a one-line fix message instead of a traceback. uvx --from loobric-cli[mcp] loobric-mcp configs work again as-is.
Also in this release (lessons from the first setups-era field sessions):
- Fresh-sync disambiguation — an empty crib with a populated tool table now answers with both facts on the CLI (
list-toolsnames each machine's entry count), the MCP tool description, andloobric://concepts, instead of a bare "no tools". - Credential hygiene — new README section (agent workstations get a
--preset agentkey, never a shared session file) and a concepts-resource rule for agents: a bind/delete succeeding is the misconfiguration signal. loobric delete-key KEY [--yes]— permanently remove a revoked key (an active key must be revoked first; pairs with loobric-server 0.7.1'sDELETE /auth/keys/{id}?purge=true).- MCP
machine_setup_statusstates the exactuse-set MACHINE SETverb shape; set-related MCP descriptions caught up with 1.4.0's claims/setups vocabulary.
Full details in CHANGELOG.md.
loobric-cli 1.4.0 — setups: use-set, status, setup-history
BREAKING — pairs with loobric-server 0.7.0 (setups replace the set↔machine link).
Added
- Setups:
loobric use-set MACHINE SETmakes a tool set the machine's active setup (--noneends it);loobric status MACHINErenders the setup view —READY/NOT READY (n need attention, m notes)with per-line states (ok,requested,mismounted,blocked,pending bind; notes:unlisted,unknown tool);loobric setup-history MACHINElists the machine's setup rows. Client library:use_set,end_setup,list_setups,active_setup,reconciliation. add-to-set --number N— claim a tool number for a member (the durable CAM↔CNC contractstatuschecks the machine against). Library:add_to_set(..., numbers={id: n}).- MCP:
machine_setup_status(read-only setup view) andnumbersonadd_to_tool_set. Switching setups stays beyond agent keys (bind door). - Units on the assert door:
loobric assert … --unit rpm, plusuniton the MCPassert_fieldtool, for the server's machine capability fields (spindle.max_rpm, …).loobric show-machineprints spindle/coolant capability with provenance. examples/delete_tool_data.py— clear an account's machines/tools/sets while keeping API keys, login, and catalog records.
Removed (BREAKING)
loobric link-machineandClient.link_set_to_machine— the set↔machine link is no longer a set field; useuse-set. The MCPlink_tool_set_to_machinetool is gone for the same reason.
Full details in CHANGELOG.md.
loobric-cli 1.3.1 — loud dead-credential diagnosis at MCP startup
Fixed
loobric-mcpnow diagnoses a dead credential at startup. A rejected key (HTTP 401) previously failed silently at connect and only surfaced as 'everything 401s' mid-task. Startup now prints one specific stderr message naming the causes in likelihood order: MCP host not restarted after a key change (env is read at startup only), a project-scoped MCP config entry shadowing the global one, a key/LOOBRIC_BASE_URL server mismatch, or a revoked key. Non-401 errors stay quiet — a down server surfaces properly on the first tool call.
loobric-cli 1.3.0 — scope presets + least-privilege warning
Companion to loobric-server 0.6.0, which enforces door-aligned API key scopes and degrades pre-0.6.0 keys to read-only. Rotate old keys — this release makes that one word.
Added
loobric create-key --preset agent|controller|cam|full— named scope presets for the door model.agent(the AI/MCP key) isread sync assert: it can never observe, bind, or delete — the agent doctrine as a property of the credential.--scopeswins when both given; no preset grantsadmin.loobric-mcpleast-privilege startup warning — introspects its key on connect and logs one line when it grants doors the MCP server never uses. Warn, don't refuse; quiet on older servers and solo mode.
loobric-cli 1.2.0 — agents can attach media
Added
- MCP:
attach_media_from_url— agents can now attach media (founder decision reversing the v1 exclusion, prompted by the first real-world session leaving a manufacturer's CAD model behind). The MCP server downloads a public http(s) URL (50 MB cap; loobric-mcp User-Agent) and uploads the bytes through the existing audited media door onto a catalog or instance record's canonical media, stampedasserted:<agent>@mcp. Roles:model_3d,model_3d_basic,drawing_2d,image,icon,logo,document. File bytes never enter the model's context; non-http(s) URLs are refused before any fetch; re-attaching identical bytes is a no-op; no removal tool exists — dropping a media reference stays a human action. Tool count: 21.
Fixed
- MCP:
client_datano longer silently lost on create. The server storesclient_dataonly under a named client section; without a name it was dropped without error (caught by the media e2e smoke).create_catalog_recordnow injectsclient: "mcp"whenclient_dataarrives unnamed; an explicitly named client is left alone.
loobric-cli 1.1.1 — MCP field-placement guidance
Fixed
- MCP:
create_catalog_recordnow teaches field placement. Evidence from the first real-world agent session: spec fields sent at the top level (flute_count,hand_of_cut) were correctly rejected by the server's lane discipline, so the agent crammed the data into the name string. The tool description and input-schema example now document the nestedgeometryobject, the canonical key names (flutes; extra geometry keys accepted), and that non-geometry manufacturer data (grade, coating, substrate, source URL, availability, alternate part numbers) belongs in the free-formclient_datadict — stored, never discarded. Theloobric://conceptsresource gains the same guidance. No behavior change — the server accepted all of this all along; the agent just couldn't discover it.