Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Releases: KamalTD/Vibrante-Node

Vibrante-Node v2.2.1

15 May 19:21

Choose a tag to compare

Release Notes — Vibrante-Node v2.2.1

Release date: 2026-05-15
Type: Patch — exe build bug fixes
Previous release: v2.2.0


Summary

Two bugs that only manifested in the frozen Windows exe (not in dev mode) are fixed in this release.


Bug Fixes

About Dialog crash — AttributeError: 'QTextEdit' object has no attribute 'setOpenExternalLinks'

Symptom: Opening Help → About Vibrante-Node in the exe build crashed with:

AttributeError: 'QTextEdit' object has no attribute 'setOpenExternalLinks'

Root cause: The _show_about() fallback branch (shown when the LICENSE file cannot be found) called text_edit.setOpenExternalLinks(True) on a QTextEdit instance. setOpenExternalLinks is a method of QLabel and QTextBrowser, not QTextEdit.

Fix: Changed the license display widget from QTextEdit to QTextBrowser. QTextBrowser is a subclass of QTextEdit with identical API plus full support for setOpenExternalLinks(True). All existing calls (setReadOnly, setFont, setLineWrapMode, setPlainText, setHtml) continue to work unchanged.

File: src/ui/window.py


About Dialog always showed "LICENSE file not found" fallback in exe build

Symptom: Even after installing the exe, the About dialog displayed:

"LICENSE file not found. See https://vibrante-node.com for full license terms."

instead of the actual license text.

Root cause: The LICENSE file was not included in the PyInstaller datas list in vibrante_node.spec. When resource_path('LICENSE') was called at runtime, it looked for the file at sys._MEIPASS/LICENSE (_internal/LICENSE) — but the file was never bundled there.

Fix: Added ('LICENSE', '.') to the datas list in vibrante_node.spec. PyInstaller now copies LICENSE into _internal/ alongside splash.png, logo.png, and the other bundled assets. resource_path('LICENSE') finds it correctly in the frozen exe.

File: vibrante_node.spec


Migration Notes

No breaking changes. No configuration changes required.

Both fixes are transparent to the user — the About dialog now opens correctly and shows the full license text. No workflow, node, or settings files are affected.


Files Modified

File Change
src/ui/window.py QTextEditQTextBrowser in _show_about(); added QTextBrowser to local import
vibrante_node.spec Added ('LICENSE', '.') to datas; version comment updated to v2.2.1
file_version_info.txt Version 2.2.1.0
src/main.py Version bump to v2.2.1

Vibrante-Node v2.1.1 — Windows Publisher Fix & Theme Fixes

14 May 20:42

Choose a tag to compare

Overview

v2.1.1 patch release: Scripting Console theme fix, Houdini plugin LICENSE, Windows VERSIONINFO in exe (fixes "Unknown publisher" on Windows 11), and contact info cleanup.


Bug Fixes

Scripting Console — Theme Not Applied on Switch

  • Added ScriptingConsole.apply_theme(is_dark) updating code editor, debug output, and Git status panels.
  • _apply_dark_theme() / _apply_light_theme() in window.py now cascade to the console.

Windows 11 — "Unknown publisher" on Exe Launch

  • Added file_version_info.txt (PyInstaller VSVersionInfo format) embedded via version= in vibrante_node.spec.
  • Exe now carries CompanyName, ProductName, version 2.1.1.0, and copyright metadata.

SmartScreen / UAC elevation dialogs still require a code-signing certificate.


Changes

  • plugins/houdini/LICENSE — standalone commercial license for the Houdini plugin.
  • About dialog shows Houdini plugin license text.
  • Contact email replaced with [email protected] throughout.
  • Official website https://vibrante-node.com added to all relevant locations.

Upgrade Notes

No workflow format changes. All .json workflow files are compatible with v2.1.1.

Vibrante-Node v2.0.0

09 May 21:43

Choose a tag to compare

Release Notes — Vibrante-Node v2.0.0

Release date: 2026-05-10
Build: Python 3.10 / PyInstaller — Windows 64-bit


Overview

v2.0.0 is a major feature release that introduces the Subgraph / Group Node system, Live Wire Inspector, Autosave & Crash Recovery, Canvas Search, Mini-map, Recent Files, Node Execution Timing, and a Ctrl+C crash fix. It consolidates all v1.8.6, v1.8.7, v1.9.0, and post-1.9.0 work into a single stable release with a clean version number reflecting the scope of the changes.


New Features

Subgraph / Group Node (Ctrl+Shift+G)

Select two or more connected nodes and press Ctrl+Shift+G (or Edit → Group Selection) to collapse them into a single GroupNode that stores the complete subgraph as an embedded workflow.

  • The inner graph is preserved in full inside the collapsed node's parameters — saved and loaded transparently with the parent workflow.
  • Dynamic ports are created automatically from the boundary edges: one input per external-to-group connection, one output per group-to-external connection.
  • Double-click the GroupNode to open the subgraph in a new tab for live editing. Changes are written back to the parent GroupNode in real time (undo / redo included).
  • exec_out fires when the inner graph finishes without an unhandled exception.
  • exec_fail fires only on unhandled exceptions inside the inner graph — semantic failures (e.g. a DCC node returning success=False) are routed by the inner graph's own exec pins and do NOT trigger exec_fail.
  • Inner node logs are forwarded through the GroupNode's logger so they appear in the main log panel.
  • Keyboard shortcut: Ctrl+Shift+G (Ctrl+G is reserved for Wrap in Backdrop).

Live Wire Value Inspector

Hover over any connected wire during or after execution to see the last value that flowed through it as a tooltip (port_name: repr(value), capped at 300 characters).

  • Values persist after execution ends — inspect the final state of every wire without re-running.
  • Values are cleared automatically at the start of each new execution run.
  • Wire hit area is 12 px wide (up from 2 px) so wires are easy to hover.

Autosave & Crash Recovery

A QTimer fires every 2 minutes and writes all non-empty open tabs to ~/.vibrante_node_autosave.json.

  • On the next launch, if the autosave file exists, a restore dialog is offered.
  • On a clean exit (closeEvent), the autosave file is deleted — the dialog only appears after a crash or force-close.
  • Autosave is skipped during active execution to avoid capturing mid-run state.

Recent Files (File → Open Recent)

The File menu now has an Open Recent submenu listing the last 10 saved or loaded workflows.

  • Files that no longer exist on disk are shown grayed-out (disabled).
  • Clear Recent Files wipes the list.
  • The list is rebuilt each time the File menu opens so it is always current.

Canvas Search Bar (Ctrl+F)

Press Ctrl+F (or Edit → Find in Canvas…) to open a floating search bar at the top of the canvas.

  • Type to filter nodes by display name or node_id.
  • The matched node is selected and the view pans to it.
  • Enter / cycles forward; Shift+Enter / cycles backward.
  • Match counter shows "X / N". Escape closes.

Mini-map (Ctrl+M)

A 200×150 px thumbnail of the full canvas is always visible in the bottom-right corner of each NodeView.

  • A blue semi-transparent rectangle shows the current viewport position.
  • Click or drag on the mini-map to pan the main view.
  • Toggle with Ctrl+M or Window → Toggle Mini-map.
  • Respects dark / light theme.

Node Execution Timing

The log panel now shows how long each node took to execute — e.g. Node 'Get Asset' finished in 0.34s.


Bug Fixes

GroupNode: exec_fail False Positive

exec_fail previously fired whenever any inner node returned a result that looked like a failure (e.g. maya_headless returning success=False). This caused false-positive "Group inner execution reported failure" errors even when the inner graph handled the failure correctly via its own exec routing.

Fix: exec_fail now fires only when an unhandled exception propagates out of an inner node (i.e. node_error signal is emitted by the sub-executor). Semantic outcomes are the inner graph's responsibility.

GroupNode: Injected Input Values Lost on Exec Ports

Group input values were injected into GroupInNode.parameters["value"], but "value" is an output port — the engine's clear_outputs() call resets all output-port-named parameters to None before execute() runs. Input values were therefore always None by the time the inner node ran.

Fix: Injection now uses parameters["_injected_value"] (not a port name, immune to clear_outputs()). GroupInNode.execute() reads from this key.

GroupNode: Inner Node Logs Discarded

All log messages from nodes inside a GroupNode were silently dropped — sub_executor.node_log was never connected.

Fix: node_log is connected to _forward_log which routes inner messages through the GroupNode's own logger with a [node_label] prefix.

GroupNode: exec_out Not Forwarded Through GroupOutNode

GroupOutNode was use_exec=False, meaning the inner exec chain could not route through it. If an inner exec chain needed to flow node-A → group_out → (end), the exec pin on group_out was ignored.

Fix: GroupOutNode is now use_exec=True with exec_in / exec_out ports. It calls set_output("exec_out", True) so the inner exec chain routes correctly. Legacy subgraphs without exec wiring on group_out still work — the node runs as a data entry node when no exec connection is present.

GroupNode: Subgraph Edits Not Persisted

Opening a subgraph in a new tab and editing it (adding nodes, changing connections) did not update the parent GroupNode. The __workflow__ parameter was never written back.

Fix: _open_subgraph_tab sets a _sync_callback on the subgraph NodeScene. The callback fires on every push_history(), undo(), and redo() call and writes the current workflow dict back to group_widget.node_definition.parameters["__workflow__"], then pushes the parent scene's history so the parent workflow is also saved correctly.

GroupNode: [ERROR] Group node has no internal workflow. After Save/Load

After editing a subgraph and saving the parent workflow, reloading it produced "Group node has no internal workflow." The __workflow__ key was silently dropped from the JSON file.

Root cause: push_history() uses model_dump() which returns Python UUID objects. _serializable_params() calls json.dumps() internally — UUID objects raise TypeError and the entire __workflow__ key is dropped silently.

Fix: _sync_back now calls WorkflowModel.model_validate(workflow_dict).model_dump(mode='json') before storing, converting all UUID objects to strings — matching the format group_selection() uses when first creating the GroupNode.

KeyboardInterrupt Crash (Ctrl+C in Terminal)

Pressing Ctrl+C in the terminal while the app was running caused a traceback crash through NodeView.event() at the C++/Python boundary of Qt's event loop.

Fix (two layers):

  1. signal.signal(signal.SIGINT, lambda *_: app.quit()) in main() intercepts SIGINT before it reaches Qt's event loop.
  2. A 200 ms QTimer wakes the Python interpreter periodically so the signal is processed promptly.
  3. NodeView.event() wraps super().event(event) in try/except KeyboardInterrupt as a safety net, calling app.quit() for a clean shutdown.
  4. sys.excepthook now exits cleanly on KeyboardInterrupt instead of writing a crash log.

Keyboard Shortcuts

Shortcut Action
Ctrl+Shift+G Group / collapse selected nodes into a subgraph
Ctrl+F Open canvas search bar
Ctrl+M Toggle mini-map
Tab Open node-search popup
Ctrl+E Edit selected node in Node Builder
Ctrl+R Reload selected node from disk
Ctrl+Shift+R Reload all nodes
F5 Run workflow
F Focus selected nodes
Ctrl+B Toggle bypass on selected nodes
Ctrl+G Wrap selection in backdrop
Ctrl+C / Ctrl+V Copy / Paste nodes
Delete Delete selected items
Ctrl+Wheel Zoom canvas

Upgrade Notes

  • Existing workflows containing GroupNodes saved before v2.0.0 may need to be re-grouped if the __workflow__ key was previously lost due to the UUID serialization bug.
  • QScintilla remains a required dependency (pip install QScintilla). It is bundled in the Windows release build.
  • No breaking API changes for custom nodes or automation scripts.

Vibrante-Node v1.8.5

05 May 19:53

Choose a tag to compare

Release Notes — Vibrante-Node v1.8.5

Release date: 2026-05-05
Build: Python 3.10 / PyInstaller — Windows 64-bit


Overview

v1.8.5 is a polish and bugfix release focused on the code editor, Node Builder UX, and the node canvas widget layer.


New Features

Professional Code Editor (QScintilla)

All code editors across the application have been replaced with QsciScintilla (QScintilla), providing a full IDE-grade editing experience:

  • Syntax highlighting with Dracula-dark and One-Light palettes
  • Line numbers, code folding (boxed-tree style), and brace matching
  • Auto-completion for Python keywords, builtins, and node API symbols
  • Real-time syntax error markers in the gutter
  • Ctrl+Wheel zoom
  • Theme switches apply instantly to all open editors

Node Builder UX Overhaul

  • Window is now maximizable with full minimize / maximize / close buttons
  • Python Algorithm editor is the hero panel — it takes all available horizontal space; configuration and AI chat panels are compact side panes
  • Left configuration panel is scrollable so all fields remain accessible when narrow
  • Exec port checkboxes now correctly add / remove add_exec_input / add_exec_output lines in generated code; use_exec=True when any exec port is active, use_exec=False only when both are off

Theme System

  • Dracula Theme (renamed from "Dark Theme") and One-Light theme now persist immediately on switch — no need to close the app
  • Theme cascades to all open dialogs (Script Editor, Node Builder, Export dialog) via QApplication.topLevelWidgets()
  • Global Fusion style applied for consistent QSS rendering on Windows (border-radius, custom scrollbars, etc.)
  • Comprehensive dark stylesheet covers all widget types: QCheckBox with indicator, QComboBox with dropdown, QSlider, QScrollBar, QTabBar, QMenuBar, and more

Bug Fixes

Canvas Dropdown Menu

  • Dropdown menus in canvas node widgets now close on the first outside click
  • Fixed crash when selecting an item from the dropdown (C++ object destroyed mid-signal emission)
  • Fixed dropdown arrow not rendering after theme stylesheet was applied
  • Fixed multiple clicks required to dismiss — _MenuCloser app-level event filter intercepts mouse press events before QGraphicsView can consume them

Canvas Slider Widget

  • Slider groove, filled track, and handle are now visible with proper QSS (::groove, ::sub-page, ::handle)

Node Search Popup (Tab)

  • Single click now adds exactly one node — removed itemDoubleClicked + itemActivated dual-signal setup that caused double adds on double-click

Code Editor Theme Init

  • Editors in Script Editor and Node Builder now open with the correct saved theme on first show — palette is baked into the lexer before setLexer() is called so no black-on-white flash occurs

Keyboard Shortcuts

Shortcut Action
Tab Open node-search popup
Ctrl+E Edit selected node in Node Builder
Ctrl+R Reload selected node from disk
Ctrl+Shift+R Reload all nodes
F5 Run workflow
F Focus selected nodes
Ctrl+C / Ctrl+V Copy / Paste nodes
Delete Delete selected items
Ctrl+Wheel Zoom code editor font

Upgrade Notes

  • QScintilla is now a required dependency (pip install QScintilla). It is bundled in the Windows release build.
  • The src/utils/highlighter.py module (old QSyntaxHighlighter) is no longer used by any editor but is kept for backward compatibility with third-party scripts.

Vibrante-Node v1.8.4

02 May 08:54

Choose a tag to compare

Release date: 2026-05-01
Build: Python 3.10 / PyInstaller — Windows 64-bit


Overview

v1.8.4 bundles the post-v1.8.3 feature work that landed on the main branch: node reload-from-disk, init-first scene ordering, edit/add toolbar shortcuts, and a new in-app HTML help system. It also corrects the for_loop execution model and introduces an additional output port on list_item_picker.


New Features

Node Reload from Disk

Edit a node's JSON definition file, then reload all live canvas instances without re-adding the node.

  • Ctrl+R — Reload selected node from disk. Ports are rebuilt, saved parameter values are re-applied, and connections whose port names still exist are preserved. Connections to removed ports are dropped.
  • Ctrl+Shift+R — Reload All Nodes: re-reads every registered JSON node from disk and refreshes all live instances in every open scene.
  • Right-click → "Reload Node" — same as Ctrl+R for the selected node.
  • NodeRegistry.get_source_path(node_id) — returns the on-disk JSON path the node was loaded from.
  • NodeRegistry.reload_node_definition(node_id) — re-reads and re-registers the definition from disk.
  • NodeWidget.reload_definition(new_definition) — swaps the definition in-place and rebuilds the widget.
  • NodeScene.reload_node_type(node_id) — orchestrates reload for all instances in the scene.

Edit Node Shortcut

  • Ctrl+E — Opens the Node Builder pre-loaded with the selected node's definition. After the builder closes, the node is automatically reloaded so canvas instances reflect any saved changes immediately.
  • Right-click → "Edit Node" — same action from the context menu.

Toolbar Additions

Five new toolbar buttons added to the main toolbar:

  • Add Node — opens the node-search popup at the canvas centre (same as Tab).
  • Add Sticky Note — adds a sticky note at the canvas centre.
  • Add Network Box — adds a backdrop/network box at the canvas centre.
  • Edit Selected Node — opens Node Builder (Ctrl+E).
  • Reload Selected Node — reloads from disk (Ctrl+R).

Init-First Scene Ordering

When loading a workflow, nodes with init_priority > 0 (marked as Init First) are now created and wired up before all other nodes. This guarantees authentication or server-connect nodes are fully initialized before any downstream node is instantiated.

HTML Help System

All documentation is now shipped as styled HTML files in the docs/ folder. The Help menu opens these HTML files directly in the system browser, providing properly rendered headings, tables, and code blocks instead of raw Markdown text.


Bug Fixes

for_loop — exec_out Now Fires Once

for_loop previously fired exec_out once per index (acting as its own loop body). This caused issues when the downstream chain had side effects. for_loop now fires exec_out once after the full indices list is ready. Use a loop_body node connected to indices + exec_out to iterate per item.

on_parameter_changed — Reactive Execution Propagation

When a node's execute produces an output that propagates to a downstream node mid-run, on_parameter_changed is now correctly called on the target instance. This allows reactive nodes (e.g. TwoWaySwitchNode, GetVariable) to update their own outputs when upstream data changes during execution — without the double-propagation bug fixed in v1.8.3.

list_item_picker — Added port_1 Output

A second output port port_1 of type any has been added to list_item_picker.


Keyboard Shortcuts Summary

Shortcut Action
Tab Open node-search popup at canvas centre
Ctrl+E Edit selected node in Node Builder
Ctrl+R Reload selected node from disk
Ctrl+Shift+R Reload all nodes from disk
F5 Run workflow
F Focus on selected nodes
Ctrl+C / Ctrl+V Copy / Paste selected nodes
Delete Delete selected items

Upgrade Notes

  • for_loop users: If your graph relied on for_loop firing exec_out per iteration, insert a loop_body node between for_loop.exec_outloop_body.exec_in and connect for_loop.indicesloop_body.items. The loop_body fires exec_out once per item.
  • The docs/ folder is now required alongside the executable. It is included automatically in the PyInstaller build.

Vibrante-Node v1.8.3

30 Apr 19:00

Choose a tag to compare

Release Notes — Vibrante-Node v1.8.3

Release date: 2026-04-30
Build: Python 3.10 / PyInstaller


Overview

v1.8.3 is a targeted bugfix patch that fixes incorrect on_parameter_changed calls being fired during node execution, which caused cascading side effects, premature data propagation, and unexpected flow triggers in complex graphs.


Bug Fixes

Engine — on_parameter_changed Called During Execution (engine.py)

  • on_parameter_changed called during pre-execute input sync — Before calling a node's execute, the engine synced incoming connection values and called on_parameter_changed for each one. Nodes like TwoWaySwitchNode that call set_output inside on_parameter_changed would then eagerly propagate intermediate/stale values to downstream nodes before execute had run, causing incorrect or double-propagated results. Fixed by removing the on_parameter_changed call from the pre-execute sync phase — parameters are already set directly and execute receives the correct values in inputs.

  • on_parameter_changed called during reactive output propagation — When a node called set_output during its execute, the engine's output handler fired on_parameter_changed on every downstream data node. This caused cascading set_output calls from downstream on_parameter_changed implementations while the upstream node's execute was still running, potentially triggering flow execution at unexpected times. Fixed by removing the on_parameter_changed call from the reactive data propagation in the output handler. Downstream data nodes still receive updated parameter values (the direct parameter assignment is kept) and are correctly pulled via _run_single_node_impl when a flow node needs them.

Nodes not affected: WhileLoopNode, ForEachNode — these read condition, break_condition, and continue_condition directly from self.parameters, which are still updated reactively by the engine's output handler.

Vibrante-Node v1.8.2

26 Apr 22:22

Choose a tag to compare

Release Notes — Vibrante-Node v1.8.2

Release date: 2026-04-27
Build: Python 3.10 / PyInstaller


Overview

v1.8.2 is a targeted bugfix patch fixing a dropdown parameter value mismatch that caused execute to receive an empty string instead of the actually selected item.


Bug Fixes

Dropdown Parameter Value (node_widget.py)

  • Dropdown returns empty string in executeadd_input initialises parameters[name] to "" for string type ports. When the widget was built, setCurrentText("") found no match in the combobox and left it visually at index 0, but parameters[name] stayed "". Calling self.get_parameter(name) or reading inputs[name] in execute therefore returned "" instead of the displayed item. Fixed by always syncing parameters[name] from w.currentText() after the initial-value setup, so the stored value always matches what is shown in the UI.

Vibrante-Node v1.8.1

26 Apr 09:03

Choose a tag to compare

Release Notes — Vibrante-Node v1.8.1

Release date: 2026-04-26
Build: Python 3.10 / PyInstaller


Overview

v1.8.1 is a targeted bugfix patch addressing reactive data-flow issues in the node widget and a code-preservation bug in the Node Builder.


Bug Fixes

Reactive Data Flow (node_widget.py)

  • on_parameter_changed stale value — Downstream nodes were receiving the previous output value on the first change after a wire was plugged. Root cause: _propagate_all_outputs() ran synchronously before the on_parameter_changed coroutine had a chance to execute and update outputs via set_output(). Both set_parameter and _update_param now await on_parameter_changed to completion before triggering downstream propagation.

Node Builder (node_builder.py)

  • Execute method reset on port edit — Editing inputs or outputs in the Node Builder table was silently overwriting user-written code inside the async def execute method. The [SET-OUTPUT-START/END] and [EXEC-OUT-START/END] blocks were being regenerated on every table/metadata change. These blocks are now only regenerated when the exec checkboxes change (update_exec_hints flag), preserving custom execute logic during port edits.

Vibrante-Node v1.8.0

23 Apr 13:46

Choose a tag to compare

Release Notes — Vibrante-Node v1.8.0

Release date: 2026-04-23
Build: Python 3.10 / PyInstaller


Overview

v1.8.0 is a stability and bugfix release focused on the VFX pipeline workflows. All known execution errors across the Maya, Houdini, Blender, Prism, and Deadline nodes have been resolved, and the engine has been hardened against edge-case crashes.


Bug Fixes

Engine

  • result or {} guardNetworkExecutor now protects node_results.update(result) against nodes that return None from execute(), preventing TypeError: 'NoneType' object is not iterable crashes.

Flow Control

  • for_loop — Was firing exec_out only once (last index). Now iterates correctly in a Python loop, calling set_output('current_index', i) then set_output('exec_out', True) per index.
  • _executed_nodes cache invalidation — Pure data nodes are now discarded from the cache when their inputs change reactively, forcing them to recompute each loop iteration instead of serving stale results.
  • Bypass flag — Bypassed nodes now correctly skip execute() and pass exec flow through to downstream nodes.

Prism Nodes

  • prism_get_export_path
    • Added "3d" and "2d" as valid output_type aliases (previously only "3drender" / "2drender" were recognised).
    • version_path output now returns the full file path of the first matching file inside the version directory, not the directory itself. Falls back to the directory path when no file exists yet.
    • Added new version_dir output for the directory path.
  • prism_create_product_version — Data outputs (version_path, success) are now emitted via set_output() before exec_out fires, so downstream nodes receive values before continuing.
  • Prism shot/sequence getter nodes — All six nodes (prism_get_shots, prism_get_shots_by_sequence, prism_get_sequence_by_project, prism_get_sequences_by_project, prism_get_sequence_by_project, prism_get_shot_by_sequence) updated to use Prism v2.1.0 flat-list getShots() API.

Deadline Nodes

  • deadline_job_status — Two bare return statements inside execute() replaced with return {} to prevent NoneType crashes in the engine.

Houdini Nodes

  • houdini_headless
    • Added upfront os.path.isfile(hython) check with a clear error message instead of the cryptic [WinError 2] when the executable path is wrong.
    • import_alembic context logic inverted: now defaults to /obj for any value except the explicit string "/stage", preventing accidental LOP imports.
    • import_obj and import_fbx context checks hardened with the same inversion.
  • houdini_action_import_alembic — Context value normalised with (value or "/obj").strip() to prevent None falling through to the /stage branch.

Blender Nodes

  • blender_headless
    • Fixed SyntaxError: unterminated string literal in the runner script: '\n' inside a triple-quoted Python string was being written as a real newline to the temp .py file. Replaced with chr(10).
    • bpy.ops.wm.alembic_export: Blender 4+ renamed frame_start/frame_end to start/end. Runner now tries start/end first and falls back to the old names.
    • Added os.makedirs(..., exist_ok=True) before FBX, Alembic, and USD exports so missing output directories don't silently fail.

UI

  • Delete / F key conflictskeyPressEvent in both scene.py and view.py now checks QApplication.focusWidget() and bails early if focus is on a text widget, preventing accidental node deletion or focus-fitting while typing in parameters, sticky notes, or backdrop titles.

VFX Workflow Files

Six production VFX workflow templates added/updated under vfx_workflows/:

File Description
01_prism_project_overview.json Project/shot/asset browser
02_maya_asset_publish.json Maya headless asset publish to Prism
03_multi_shot_alembic_export.json Multi-shot alembic export loop via Maya
04_deadline_render_pipeline.json Deadline Maya render submission + job status polling
05_houdini_fx_pipeline.json Houdini FX sim + Prism cache registration
06_blender_multi_format_export.json Blender FBX / Alembic / USD multi-format export

Release: v1.7.0

19 Apr 09:33

Choose a tag to compare

Release Notes — Vibrante-Node v1.7.0

Release date: 2026-04-19
Build: Python 3.10 / PyInstaller 6.19


Overview

v1.7.0 is a major Prism Pipeline integration overhaul. All Prism getter nodes have been audited and standardised, department/task/path resolution is now fully dynamic (read from the project's pipeline.json), and two new path-resolution nodes have been added.


New Features

prism_get_scene_path

Resolves the filesystem path for a scene file from entity + department + task + application + version inputs.

  • Scans Scenefiles/<dept>/<task>/ using the project's configured folder structure
  • Filters by application extension (Blender → .blend, Houdini → .hip/.hiplc/.hipnc, Maya → .ma/.mb, Nuke → .nk, etc.)
  • version=latest picks the highest _v#### file; explicit version resolves exact match
  • If no file exists, constructs the expected filename from Prism's template (<seq>-<shot>_<task>_<version><ext>)
  • Outputs: scene_path, task_path, version, exists

prism_get_export_path

Resolves output paths for exports, renders, and playblasts.

  • output_type: exportExport/, 3drenderRenders/3dRender/, 2drenderRenders/2dRender/, playblastPlayblasts/
  • Scans identifier folder for existing version directories; version=latest returns highest
  • Outputs: identifier_path, version_path, version, file_pattern, exists
  • file_pattern uses Prism naming: <seq>-<shot>_<identifier>_<version>.####.exr

src/utils/prism_config.py — Dynamic Project Config Reader

New shared utility replacing all hardcoded department abbreviation dictionaries.

  • Reads globals.departments_shot / globals.departments_asset from pipeline.json
  • Config discovery: entity path walk-up → project['configPath'] → core's current project → user Prism2 dir
  • Respects PRISM_LAUNCHER_CONFIG environment variable for non-standard installs
  • API: get_departments(), resolve_dept_folder(), resolve_dept_name(), get_entity_scenefiles_root(), build_abbrev_map()
  • versionPadding read from project globals for correct v0001/v0004 formatting

prism_get_departments — New Outputs

  • Added default_tasks output: list of default task names per department (from pipeline.json)
  • Added abbreviations output: raw folder names (anm, cfx, …) alongside full names

Bug Fixes

Entity dict enrichment — path/location/paths fields

prism_get_shot_by_sequence and prism_get_shot_by_name previously emitted a minimal entity dict {type, sequence, shot}. Prism's getScenefiles() silently returns empty without the path field. All shot-outputting nodes now emit the full dict:

{"type": "shot", "sequence": "seq_0001", "shot": "shot_001",
 "path": "G:/Prism/.../shot_001", "location": "global", "paths": [...]}

prism_get_scene_files — Disk fallback

getScenefiles() returns empty even with a correctly enriched entity. Added disk scanner that reads Scenefiles/<dept>/<task>/ directly, filters out *versioninfo.json and *preview.jpg, sorts by version, and returns file dicts with path, version, task, department.

prism_get_departments — Wrong data source

Was calling getCategories() which returns Prism UI tabs (Scenefiles/Renders/Exports) not departments. Fixed to read from pipeline.json globals first, then scan Scenefiles/ as fallback.

prism_get_tasks — Crash on getTaskNames

Prism's decorator re-raises exceptions as BaseException, bypassing except Exception. Removed the broken getTaskNames fallback. Tasks are now resolved via disk scan of Scenefiles/<dept>/ with config-driven abbreviation mapping.

Department resolution — All nodes

Removed hardcoded DEPT_ABBREVS dictionaries from prism_get_tasks, prism_get_entity_path, prism_get_scene_files. All nodes now use prism_config.resolve_dept_folder() which reads the actual project's department list.

prism_get_entity_info — Missing path output

Added path output port that passes through entity['path'] for downstream nodes.

prism_get_shot_info — Broken getEntityPath call

Removed calls to non-existent getEntityPath/getShotPath API methods. entity_path now reads directly from entity.get('path').

prism_get_sequences_by_project — Inconsistent output type

Was outputting a list of strings. Now outputs a list of dicts {name, project_path, project_name} matching the shape expected by prism_get_shot_by_sequence.

Audit: None defaults

12 nodes (prism_get_media_versions, prism_get_product_versions, prism_get_plugin, prism_import_product, prism_send_cmd, prism_trigger_callback, prism_eval, prism_register_callback, and others) returned None for output ports on error. Changed to safe empty defaults ({} or "").

prism_core_info — Runtime crash

Removed stray exec_out emission on a use_exec=False node.

prism_build_entity / prism_create_entity — Incomplete entity dicts

Shot entities now include path, location, paths; asset entities include path.

prism_get_shotsgetShots() unpack crash

sequences, shots = core.entities.getShots() crashes when Prism returns a single list after changeProject(). Fixed with try/except unpack pattern across all affected nodes.


Nodes Changed

Node Change
prism_get_shot_by_sequence Entity enrichment: path/location/paths
prism_get_shot_by_name Entity enrichment: path/location/paths
prism_get_departments Config-driven, added abbreviations + default_tasks outputs
prism_get_tasks Config-driven, disk fallback, removed crashing getTaskNames
prism_get_scene_files Disk fallback scanner
prism_get_entity_path Config-driven dept resolution
prism_get_entity_info Added path output
prism_get_shot_info Uses entity.path directly
prism_get_sequences_by_project Outputs sequence dicts not strings
prism_get_shots getShots unpack fix
prism_get_shots_by_sequence getShots unpack fix
prism_get_asset_by_name Asset entity includes path
prism_get_scene_files DEPT_ABBREVS → prism_config
prism_core_info Remove stray exec_out
prism_build_entity Full entity dict fields
prism_create_entity Full entity dict fields
prism_get_current_scene Full entity dict reconstruction
12× misc nodes None → safe empty defaults