From a7e5c61e6a5e1a678f487c1af0555cd3db72ec4a Mon Sep 17 00:00:00 2001 From: Charles N Wyble Date: Thu, 22 Jan 2026 17:43:37 -0500 Subject: [PATCH] feat: add LSP wrapper scripts for named containers Add wrapper scripts for bash, docker, and marksman LSP servers to ensure containers use explicit names matching image names. Enables multiple Crush sessions to share LSP server containers with clean restart capability. - lsp-bash-wrapper.sh: Wrapper for bash-language-server - lsp-docker-wrapper.sh: Wrapper for docker-language-server - lsp-marksman-wrapper.sh: Wrapper for marksman markdown LSP Each wrapper cleans up existing containers and starts new container with --name flag to ensure consistent naming. --- lsp-bash-wrapper.sh | 18 ++++++++++++++++++ lsp-docker-wrapper.sh | 18 ++++++++++++++++++ lsp-marksman-wrapper.sh | 18 ++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100755 lsp-bash-wrapper.sh create mode 100755 lsp-docker-wrapper.sh create mode 100755 lsp-marksman-wrapper.sh diff --git a/lsp-bash-wrapper.sh b/lsp-bash-wrapper.sh new file mode 100755 index 0000000..d5e5b5e --- /dev/null +++ b/lsp-bash-wrapper.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# Wrapper script for bash-language-server LSP +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-bash-language-server" +IMAGE_NAME="kneldevstack-aimiddleware-bash-language-server" + +# Remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" > /dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.1 + done +fi + +# Start the LSP server with explicit name +exec docker run -i --rm --name "${CONTAINER_NAME}" "${IMAGE_NAME}" start "$@" diff --git a/lsp-docker-wrapper.sh b/lsp-docker-wrapper.sh new file mode 100755 index 0000000..ce0e676 --- /dev/null +++ b/lsp-docker-wrapper.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# Wrapper script for docker-language-server LSP +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-docker-language-server" +IMAGE_NAME="kneldevstack-aimiddleware-docker-language-server" + +# Remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" > /dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.1 + done +fi + +# Start the LSP server with explicit name +exec docker run -i --rm --name "${CONTAINER_NAME}" "${IMAGE_NAME}" start --stdio "$@" diff --git a/lsp-marksman-wrapper.sh b/lsp-marksman-wrapper.sh new file mode 100755 index 0000000..5f83224 --- /dev/null +++ b/lsp-marksman-wrapper.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# Wrapper script for marksman markdown LSP +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-marksman" +IMAGE_NAME="kneldevstack-aimiddleware-marksman" + +# Remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" > /dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.1 + done +fi + +# Start the LSP server with explicit name +exec docker run -i --rm --name "${CONTAINER_NAME}" "${IMAGE_NAME}" server "$@"