diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 1edb684..8d6926b 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -8,6 +8,8 @@ project_name: claude-mnemonic before: hooks: - go mod tidy + # Download ONNX runtime library for current platform if not present + - bash -c "./scripts/download-onnx-libs.sh auto" # Generate versioned package.json from template and build Vue dashboard - bash -c "sed 's/{{ .Version }}/{{ .Version }}/g' ui/package.json.tpl > ui/package.json" - bash -c "cd ui && npm ci --silent && npm run build" diff --git a/Makefile b/Makefile index 3d8e347..683171f 100644 --- a/Makefile +++ b/Makefile @@ -14,12 +14,16 @@ GOARCH ?= $(shell go env GOARCH) export CGO_ENABLED=1 BUILD_TAGS := -tags "fts5" -.PHONY: all build clean test install lint hooks worker mcp stop-worker start-worker restart-worker dashboard website dev-website +.PHONY: all build clean test install lint hooks worker mcp stop-worker start-worker restart-worker dashboard website dev-website setup-libs all: build +# Download ONNX runtime libraries (all platforms for local dev, skips if present) +setup-libs: + @./scripts/download-onnx-libs.sh all + # Build all binaries -build: dashboard worker hooks mcp +build: setup-libs dashboard worker hooks mcp # Build Vue dashboard dashboard: @@ -154,7 +158,7 @@ uninstall: stop-worker @echo "Uninstallation complete!" # Run tests -test: +test: setup-libs go test -v -race ./... # Run tests with coverage diff --git a/internal/worker/static/placeholder.html b/internal/worker/static/placeholder.html new file mode 100644 index 0000000..e69de29 diff --git a/scripts/download-onnx-libs.sh b/scripts/download-onnx-libs.sh new file mode 100755 index 0000000..f40adfc --- /dev/null +++ b/scripts/download-onnx-libs.sh @@ -0,0 +1,111 @@ +#!/bin/bash +# Download ONNX Runtime libraries for embedding +# Usage: ./download-onnx-libs.sh [platform] +# Platform: darwin-amd64, darwin-arm64, linux-amd64, linux-arm64, or "all" (default) + +set -e + +ONNX_VERSION="1.19.2" +ASSETS_DIR="internal/embedding/assets/lib" +PLATFORM="${1:-all}" + +# Auto-detect platform if not specified +if [ "$PLATFORM" = "auto" ]; then + OS=$(uname -s | tr '[:upper:]' '[:lower:]') + ARCH=$(uname -m) + case "$OS" in + darwin) OS="darwin" ;; + linux) OS="linux" ;; + *) echo "Unsupported OS: $OS"; exit 1 ;; + esac + case "$ARCH" in + x86_64|amd64) ARCH="amd64" ;; + arm64|aarch64) ARCH="arm64" ;; + *) echo "Unsupported arch: $ARCH"; exit 1 ;; + esac + PLATFORM="${OS}-${ARCH}" +fi + +# Temporary directory for downloads +TEMP_DIR=$(mktemp -d) +trap "rm -rf ${TEMP_DIR}" EXIT + +download_darwin_amd64() { + echo "Downloading darwin-amd64..." + mkdir -p "${ASSETS_DIR}/darwin-amd64" + curl -sSL "https://github.com/microsoft/onnxruntime/releases/download/v${ONNX_VERSION}/onnxruntime-osx-x86_64-${ONNX_VERSION}.tgz" -o "${TEMP_DIR}/darwin-amd64.tgz" + tar -xzf "${TEMP_DIR}/darwin-amd64.tgz" -C "${TEMP_DIR}" + cp "${TEMP_DIR}/onnxruntime-osx-x86_64-${ONNX_VERSION}/lib/libonnxruntime.${ONNX_VERSION}.dylib" "${ASSETS_DIR}/darwin-amd64/libonnxruntime.dylib" +} + +download_darwin_arm64() { + echo "Downloading darwin-arm64..." + mkdir -p "${ASSETS_DIR}/darwin-arm64" + curl -sSL "https://github.com/microsoft/onnxruntime/releases/download/v${ONNX_VERSION}/onnxruntime-osx-arm64-${ONNX_VERSION}.tgz" -o "${TEMP_DIR}/darwin-arm64.tgz" + tar -xzf "${TEMP_DIR}/darwin-arm64.tgz" -C "${TEMP_DIR}" + cp "${TEMP_DIR}/onnxruntime-osx-arm64-${ONNX_VERSION}/lib/libonnxruntime.${ONNX_VERSION}.dylib" "${ASSETS_DIR}/darwin-arm64/libonnxruntime.dylib" +} + +download_linux_amd64() { + echo "Downloading linux-amd64..." + mkdir -p "${ASSETS_DIR}/linux-amd64" + curl -sSL "https://github.com/microsoft/onnxruntime/releases/download/v${ONNX_VERSION}/onnxruntime-linux-x64-${ONNX_VERSION}.tgz" -o "${TEMP_DIR}/linux-amd64.tgz" + tar -xzf "${TEMP_DIR}/linux-amd64.tgz" -C "${TEMP_DIR}" + cp "${TEMP_DIR}/onnxruntime-linux-x64-${ONNX_VERSION}/lib/libonnxruntime.so.${ONNX_VERSION}" "${ASSETS_DIR}/linux-amd64/libonnxruntime.so" + cp "${TEMP_DIR}/onnxruntime-linux-x64-${ONNX_VERSION}/lib/libonnxruntime_providers_shared.so" "${ASSETS_DIR}/linux-amd64/libonnxruntime_providers_shared.so" 2>/dev/null || true +} + +download_linux_arm64() { + echo "Downloading linux-arm64..." + mkdir -p "${ASSETS_DIR}/linux-arm64" + curl -sSL "https://github.com/microsoft/onnxruntime/releases/download/v${ONNX_VERSION}/onnxruntime-linux-aarch64-${ONNX_VERSION}.tgz" -o "${TEMP_DIR}/linux-arm64.tgz" + tar -xzf "${TEMP_DIR}/linux-arm64.tgz" -C "${TEMP_DIR}" + cp "${TEMP_DIR}/onnxruntime-linux-aarch64-${ONNX_VERSION}/lib/libonnxruntime.so.${ONNX_VERSION}" "${ASSETS_DIR}/linux-arm64/libonnxruntime.so" + cp "${TEMP_DIR}/onnxruntime-linux-aarch64-${ONNX_VERSION}/lib/libonnxruntime_providers_shared.so" "${ASSETS_DIR}/linux-arm64/libonnxruntime_providers_shared.so" 2>/dev/null || true +} + +# Check if library already exists for a platform +lib_exists() { + local plat="$1" + case "$plat" in + darwin-*) [ -f "${ASSETS_DIR}/${plat}/libonnxruntime.dylib" ] ;; + linux-*) [ -f "${ASSETS_DIR}/${plat}/libonnxruntime.so" ] ;; + *) return 1 ;; + esac +} + +# Download only if not present +download_if_needed() { + local plat="$1" + if lib_exists "$plat"; then + echo "Library for ${plat} already exists, skipping download" + return 0 + fi + case "$plat" in + darwin-amd64) download_darwin_amd64 ;; + darwin-arm64) download_darwin_arm64 ;; + linux-amd64) download_linux_amd64 ;; + linux-arm64) download_linux_arm64 ;; + esac +} + +echo "ONNX Runtime v${ONNX_VERSION} - Platform: ${PLATFORM}" + +case "$PLATFORM" in + darwin-amd64|darwin-arm64|linux-amd64|linux-arm64) + download_if_needed "$PLATFORM" + ;; + all) + download_if_needed darwin-amd64 + download_if_needed darwin-arm64 + download_if_needed linux-amd64 + download_if_needed linux-arm64 + ;; + *) + echo "Unknown platform: $PLATFORM" + echo "Supported: darwin-amd64, darwin-arm64, linux-amd64, linux-arm64, all, auto" + exit 1 + ;; +esac + +echo "Done!" diff --git a/ui/package-lock.json b/ui/package-lock.json index 3023d9e..614c507 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "claude-mnemonic-dashboard", - "version": "v0.6.1-11-g7fe679f-dirty", + "version": "v0.6.5-11-gdb528b2-dirty", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "claude-mnemonic-dashboard", - "version": "v0.6.1-11-g7fe679f-dirty", + "version": "v0.6.5-11-gdb528b2-dirty", "dependencies": { "vue": "^3.5.13" }, diff --git a/ui/package.json b/ui/package.json index a9520b8..38c3a0d 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "claude-mnemonic-dashboard", - "version": "{{ .Version }}", + "version": "v0.6.5-11-gdb528b2-dirty", "private": true, "type": "module", "scripts": {