diff --git a/.github/workflows/linux-release.yml b/.github/workflows/linux-release.yml new file mode 100644 index 0000000..3e4b512 --- /dev/null +++ b/.github/workflows/linux-release.yml @@ -0,0 +1,84 @@ +name: Linux Release Artifacts + +on: + release: + types: [published] + workflow_dispatch: + inputs: + release_tag: + description: "Release tag to upload artifacts to (e.g. v2.4.0)" + required: true + default: "v2.4.0" + +jobs: + build-linux: + name: Build AppImage + .deb + runs-on: ubuntu-22.04 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install build tools + run: | + python -m pip install --upgrade pip + pip install build setuptools wheel + + - name: Install app dependencies + run: pip install -r requirements.txt + + - name: Build Python wheel + run: python -m build --wheel --no-isolation + + - name: Install AppImage + .deb prerequisites + run: | + sudo apt-get update -qq + sudo apt-get install -y wget fuse libfuse2 dpkg-dev + + - name: Build AppImage + run: | + bash linux/appimage/build_appimage.sh \ + --wheel dist/vibrante_node-*.whl + + - name: Build .deb package + run: | + bash linux/deb/build_deb.sh \ + --wheel dist/vibrante_node-*.whl + + - name: Resolve release tag + id: tag + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "value=${{ github.event.inputs.release_tag }}" >> $GITHUB_OUTPUT + else + echo "value=${{ github.ref_name }}" >> $GITHUB_OUTPUT + fi + + - name: Upload AppImage + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload "${{ steps.tag.outputs.value }}" \ + linux/build/Vibrante-Node-*-x86_64.AppImage \ + --clobber + + - name: Upload .deb + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload "${{ steps.tag.outputs.value }}" \ + linux/build/vibrante-node_*.deb \ + --clobber + + - name: Upload wheel + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload "${{ steps.tag.outputs.value }}" \ + dist/vibrante_node-*.whl \ + --clobber diff --git a/.gitignore b/.gitignore index a6e8ddd..412dc09 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,9 @@ linux/build/ # Runtime logs crash.log upload_result.json + +# Cached MCP / package dependencies (local dev only) +.mcp_deps/ + +# Temporary orchestration run reports +tmp/ diff --git a/workflows/hou_mcp_scene_context_demo.json b/workflows/hou_mcp_scene_context_demo.json new file mode 100644 index 0000000..9a96c6c --- /dev/null +++ b/workflows/hou_mcp_scene_context_demo.json @@ -0,0 +1,67 @@ +{ + "nodes": [ + { + "instance_id": "d538ca27-24a2-4786-b480-a88328ed5306", + "node_id": "hou_mcp_scene_context", + "position": [-280.0, -80.0], + "parameters": { + "exec_in": null, + "exec_out": true, + "include_selection": true, + "include_assets": true, + "include_render": true, + "force_refresh": false, + "context": {}, + "context_json": "", + "scene": {}, + "networks": {}, + "selection": [] + }, + "state": "idle" + }, + { + "instance_id": "ce864ced-6172-4611-b522-0409084628ba", + "node_id": "console_print", + "position": [220.0, -80.0], + "parameters": { + "exec_in": null, + "exec_out": true, + "data": "", + "out": "" + }, + "state": "idle" + } + ], + "connections": [ + { + "id": "ecc29f87-2a4d-476c-a69d-54d2ca541999", + "from_node": "d538ca27-24a2-4786-b480-a88328ed5306", + "from_port": "exec_out", + "to_node": "ce864ced-6172-4611-b522-0409084628ba", + "to_port": "exec_in", + "is_exec": true + }, + { + "id": "8b2f1c32-98f3-4a01-aa71-4166aa31786d", + "from_node": "d538ca27-24a2-4786-b480-a88328ed5306", + "from_port": "context_json", + "to_node": "ce864ced-6172-4611-b522-0409084628ba", + "to_port": "data", + "is_exec": false + } + ], + "sticky_notes": [ + { + "id": "d86cbc0b-8fd2-4d8c-babd-be6fbae395e2", + "position": [-280.0, -210.0], + "size": [680.0, 110.0], + "text": "Demo: aggregate the live Houdini scene state via the runtime layer and print the JSON-serialised context.\n\nPrereqs: Vibrante-Node was launched from Houdini (the bridge is reachable). The output is shape-stable JSON — feed it directly into an LLM prompt.\n\nToggle force_refresh on the scene_context node to bypass the 5-second cache.", + "color": "#ffffcc" + } + ], + "backdrops": [], + "metadata": { + "name": "Houdini MCP: Scene Context Demo", + "description": "Tier 1 smoke graph for the AI-oriented scene context node." + } +} diff --git a/workflows/mcp_list_tools_demo.json b/workflows/mcp_list_tools_demo.json new file mode 100644 index 0000000..5abed58 --- /dev/null +++ b/workflows/mcp_list_tools_demo.json @@ -0,0 +1,90 @@ +{ + "nodes": [ + { + "instance_id": "2ee17392-cacb-4e57-92ab-d2817996c8a6", + "node_id": "mcp_server_init", + "position": [-360.0, -80.0], + "parameters": { + "exec_in": null, + "exec_out": true, + "server_name": "everything", + "transport_type": "stdio", + "command": "npx", + "args": "-y, @modelcontextprotocol/server-everything", + "env_json": "", + "url": "", + "connected": false, + "server_info": {}, + "capabilities": {} + }, + "state": "idle" + }, + { + "instance_id": "8ed659c6-c027-431a-942b-f7e1f0459d6a", + "node_id": "mcp_list_tools", + "position": [40.0, -80.0], + "parameters": { + "exec_in": null, + "exec_out": true, + "server_name": "everything", + "tools": [], + "names": [], + "schemas": [], + "count": 0 + }, + "state": "idle" + }, + { + "instance_id": "12f93d2e-59c7-482c-ae5b-f3fa7305a33c", + "node_id": "console_print", + "position": [400.0, -80.0], + "parameters": { + "exec_in": null, + "exec_out": true, + "data": "", + "out": "" + }, + "state": "idle" + } + ], + "connections": [ + { + "id": "dc90adad-04a3-492a-9360-cd7f42b08697", + "from_node": "2ee17392-cacb-4e57-92ab-d2817996c8a6", + "from_port": "exec_out", + "to_node": "8ed659c6-c027-431a-942b-f7e1f0459d6a", + "to_port": "exec_in", + "is_exec": true + }, + { + "id": "32b30ae5-c747-4f24-adb7-70f159ba08c6", + "from_node": "8ed659c6-c027-431a-942b-f7e1f0459d6a", + "from_port": "exec_out", + "to_node": "12f93d2e-59c7-482c-ae5b-f3fa7305a33c", + "to_port": "exec_in", + "is_exec": true + }, + { + "id": "9cbfd9da-6465-4d8d-9e70-80782509dd96", + "from_node": "8ed659c6-c027-431a-942b-f7e1f0459d6a", + "from_port": "names", + "to_node": "12f93d2e-59c7-482c-ae5b-f3fa7305a33c", + "to_port": "data", + "is_exec": false + } + ], + "sticky_notes": [ + { + "id": "6a8b449a-2dd5-4393-96db-5ec3dbf91a9c", + "position": [-360.0, -200.0], + "size": [820.0, 90.0], + "text": "Demo: connect to the reference MCP server (npx @modelcontextprotocol/server-everything), list its tools, then print their names.\n\nPrereqs: Node.js with npx on PATH, mcp Python package installed (pip install mcp). The first run will download the server package on demand.", + "color": "#ffffcc" + } + ], + "backdrops": [], + "metadata": { + "name": "MCP: List Tools Demo", + "description": "Tier 1 smoke graph for the generic MCP client nodes." + } +}