Skip to content

Releases: loobric/loobric-cli

1.9.0 — CAM library importers

Choose a tag to compare

@sliptonic sliptonic released this 17 Aug 21:23

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 .vtdb and 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

Choose a tag to compare

@sliptonic sliptonic released this 17 Aug 18:39

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 over sync_records_batch()): batch-sync many records in one transaction per chunk — items carry data + 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

Choose a tag to compare

@sliptonic sliptonic released this 16 Aug 21:37

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) and seed-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_field recovers 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

Choose a tag to compare

@sliptonic sliptonic released this 16 Aug 17:52

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_preset and list_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

Choose a tag to compare

@sliptonic sliptonic released this 30 Jul 16:05

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-tools names each machine's entry count), the MCP tool description, and loobric://concepts, instead of a bare "no tools".
  • Credential hygiene — new README section (agent workstations get a --preset agent key, 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's DELETE /auth/keys/{id}?purge=true).
  • MCP machine_setup_status states the exact use-set MACHINE SET verb 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

Choose a tag to compare

@sliptonic sliptonic released this 30 Jul 13:56

BREAKING — pairs with loobric-server 0.7.0 (setups replace the set↔machine link).

Added

  • Setups: loobric use-set MACHINE SET makes a tool set the machine's active setup (--none ends it); loobric status MACHINE renders 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 MACHINE lists 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 contract status checks the machine against). Library: add_to_set(..., numbers={id: n}).
  • MCP: machine_setup_status (read-only setup view) and numbers on add_to_tool_set. Switching setups stays beyond agent keys (bind door).
  • Units on the assert door: loobric assert … --unit rpm, plus unit on the MCP assert_field tool, for the server's machine capability fields (spindle.max_rpm, …). loobric show-machine prints 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-machine and Client.link_set_to_machine — the set↔machine link is no longer a set field; use use-set. The MCP link_tool_set_to_machine tool is gone for the same reason.

Full details in CHANGELOG.md.

loobric-cli 1.3.1 — loud dead-credential diagnosis at MCP startup

Choose a tag to compare

@sliptonic sliptonic released this 27 Jul 23:37

Fixed

  • loobric-mcp now 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

Choose a tag to compare

@sliptonic sliptonic released this 27 Jul 18:58

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) is read sync assert: it can never observe, bind, or delete — the agent doctrine as a property of the credential. --scopes wins when both given; no preset grants admin.
  • loobric-mcp least-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

Choose a tag to compare

@sliptonic sliptonic released this 25 Jul 22:52

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, stamped asserted:<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_data no longer silently lost on create. The server stores client_data only under a named client section; without a name it was dropped without error (caught by the media e2e smoke). create_catalog_record now injects client: "mcp" when client_data arrives unnamed; an explicitly named client is left alone.

loobric-cli 1.1.1 — MCP field-placement guidance

Choose a tag to compare

@sliptonic sliptonic released this 25 Jul 22:38

Fixed

  • MCP: create_catalog_record now 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 nested geometry object, 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-form client_data dict — stored, never discarded. The loobric://concepts resource gains the same guidance. No behavior change — the server accepted all of this all along; the agent just couldn't discover it.