From 52787736c63ebcd6d399093288de9dd10e622131 Mon Sep 17 00:00:00 2001 From: Stephen Benjamin Date: Mon, 11 May 2026 12:36:51 -0400 Subject: [PATCH 1/8] Add Claude Code plugins to devcontainer post-create Configures the openshift-eng/ai-helpers marketplace and installs the golang and typescript-lsp plugins during container setup. Co-Authored-By: Claude Opus 4.6 --- .devcontainer/post-create.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 8f4060349..36220efaf 100755 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -17,8 +17,11 @@ python3 -m venv mcp/.venv mcp/.venv/bin/pip install --upgrade pip -q mcp/.venv/bin/pip install -r mcp/requirements.txt -q -echo "==> Configuring Playwright MCP server for Claude..." +echo "==> Configuring Claude Code plugins..." claude mcp add playwright -- npx @playwright/mcp@latest --executable-path /usr/lib64/chromium-browser/headless_shell +claude plugin marketplace add openshift-eng/ai-helpers --scope project +claude plugin install golang@claude-plugins-official --scope project +claude plugin install typescript-lsp@claude-plugins-official --scope project echo "==> Building sippy and seeding database..." make sippy From 9339628a30f662bcf00021123efbfafe5396575b Mon Sep 17 00:00:00 2001 From: Stephen Benjamin Date: Mon, 11 May 2026 12:37:56 -0400 Subject: [PATCH 2/8] Add Atlassian CLI (acli) to devcontainer Co-Authored-By: Claude Opus 4.6 --- .devcontainer/Dockerfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 965522401..8c29189f6 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -35,6 +35,11 @@ RUN ARCH=$(uname -m) && \ ln -s /opt/google-cloud-sdk/bin/gsutil /usr/local/bin/gsutil && \ ln -s /opt/google-cloud-sdk/bin/bq /usr/local/bin/bq +RUN ARCH=$(uname -m) && \ + if [ "$ARCH" = "aarch64" ]; then ACLI_ARCH="arm64"; else ACLI_ARCH="amd64"; fi && \ + curl -fsSL -o /usr/local/bin/acli "https://acli.atlassian.com/linux/latest/acli_linux_${ACLI_ARCH}/acli" && \ + chmod +x /usr/local/bin/acli + RUN groupadd -g 1000 vscode && \ useradd -u 1000 -g 1000 -m -s /bin/bash vscode && \ echo "vscode ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/vscode From 25354ede7a71725d78767b47e2eb79a956abae99 Mon Sep 17 00:00:00 2001 From: Stephen Benjamin Date: Mon, 11 May 2026 12:41:26 -0400 Subject: [PATCH 3/8] Replace acli binary with Atlassian Rovo MCP server Use the hosted Atlassian MCP server instead of the standalone CLI binary. Co-Authored-By: Claude Opus 4.6 --- .devcontainer/Dockerfile | 5 ----- .devcontainer/post-create.sh | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 8c29189f6..965522401 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -35,11 +35,6 @@ RUN ARCH=$(uname -m) && \ ln -s /opt/google-cloud-sdk/bin/gsutil /usr/local/bin/gsutil && \ ln -s /opt/google-cloud-sdk/bin/bq /usr/local/bin/bq -RUN ARCH=$(uname -m) && \ - if [ "$ARCH" = "aarch64" ]; then ACLI_ARCH="arm64"; else ACLI_ARCH="amd64"; fi && \ - curl -fsSL -o /usr/local/bin/acli "https://acli.atlassian.com/linux/latest/acli_linux_${ACLI_ARCH}/acli" && \ - chmod +x /usr/local/bin/acli - RUN groupadd -g 1000 vscode && \ useradd -u 1000 -g 1000 -m -s /bin/bash vscode && \ echo "vscode ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/vscode diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 36220efaf..f518e7d97 100755 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -22,6 +22,7 @@ claude mcp add playwright -- npx @playwright/mcp@latest --executable-path /usr/l claude plugin marketplace add openshift-eng/ai-helpers --scope project claude plugin install golang@claude-plugins-official --scope project claude plugin install typescript-lsp@claude-plugins-official --scope project +claude mcp add --transport http atlassian https://mcp.atlassian.com/v1/mcp echo "==> Building sippy and seeding database..." make sippy From 225e21be512e10a2f289d42e84975ee67bfe4855 Mon Sep 17 00:00:00 2001 From: Stephen Benjamin Date: Mon, 11 May 2026 12:46:23 -0400 Subject: [PATCH 4/8] Mount Claude Code credentials into devcontainer Bind-mount ~/.claude/.credentials.json (rw) so MCP OAuth tokens persist across container rebuilds. The init script ensures the file exists on the host before the container starts. Co-Authored-By: Claude Opus 4.6 --- .devcontainer/devcontainer.json | 3 ++- .devcontainer/init-services.sh | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 89ae9c3ed..eb6080bca 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -8,7 +8,8 @@ }, "runArgs": ["--name", "sippy-dev", "--network", "sippy-net", "--env-file", ".devcontainer/.env", "-p", "8080:8080", "-p", "3000:3000"], "mounts": [ - "source=${localEnv:HOME}/.config/gcloud,target=/home/vscode/.config/gcloud,type=bind,readonly" + "source=${localEnv:HOME}/.config/gcloud,target=/home/vscode/.config/gcloud,type=bind,readonly", + "source=${localEnv:HOME}/.claude/.credentials.json,target=/home/vscode/.claude/.credentials.json,type=bind" ], "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind", "workspaceFolder": "/workspace", diff --git a/.devcontainer/init-services.sh b/.devcontainer/init-services.sh index 61425e042..8568d7069 100755 --- a/.devcontainer/init-services.sh +++ b/.devcontainer/init-services.sh @@ -2,6 +2,10 @@ set -eu # Starts PostgreSQL and Redis as standalone Podman containers (runs on the host before the devcontainer starts) +# Ensure Claude Code credentials file exists so the bind mount succeeds +mkdir -p "$HOME/.claude" +[ -f "$HOME/.claude/.credentials.json" ] || echo '{}' > "$HOME/.claude/.credentials.json" + podman network create sippy-net 2>/dev/null || true podman start sippy-postgres 2>/dev/null || \ From 05e5b3e6e137e80bfff77574081ae5ea9a6e3711 Mon Sep 17 00:00:00 2001 From: Stephen Benjamin Date: Mon, 11 May 2026 12:50:43 -0400 Subject: [PATCH 5/8] Fix plugin marketplace references in devcontainer post-create - Install golang plugin from ai-helpers marketplace (not claude-plugins-official) - Add anthropics/claude-plugins-official marketplace for typescript-lsp - Update .claude/settings.json with enabled plugins and marketplace config Co-Authored-By: Claude Opus 4.6 --- .claude/settings.json | 21 ++++++++++++++++++++- .devcontainer/post-create.sh | 3 ++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.claude/settings.json b/.claude/settings.json index 55a5ff820..3f2b33e64 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,3 +1,22 @@ { - "model": "claude-opus-4-6" + "model": "claude-opus-4-6", + "enabledPlugins": { + "golang@ai-helpers": true, + "gopls-lsp@claude-plugins-official": true, + "typescript-lsp@claude-plugins-official": true + }, + "extraKnownMarketplaces": { + "ai-helpers": { + "source": { + "source": "github", + "repo": "openshift-eng/ai-helpers" + } + }, + "claude-plugins-official": { + "source": { + "source": "github", + "repo": "anthropics/claude-plugins-official" + } + } + } } diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index f518e7d97..0a43cbb0c 100755 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -20,7 +20,8 @@ mcp/.venv/bin/pip install -r mcp/requirements.txt -q echo "==> Configuring Claude Code plugins..." claude mcp add playwright -- npx @playwright/mcp@latest --executable-path /usr/lib64/chromium-browser/headless_shell claude plugin marketplace add openshift-eng/ai-helpers --scope project -claude plugin install golang@claude-plugins-official --scope project +claude plugin marketplace add anthropics/claude-plugins-official --scope project +claude plugin install golang@ai-helpers --scope project claude plugin install typescript-lsp@claude-plugins-official --scope project claude mcp add --transport http atlassian https://mcp.atlassian.com/v1/mcp From e19119ab8fafba76ed42e88957ea77a2f4975e88 Mon Sep 17 00:00:00 2001 From: Stephen Benjamin Date: Mon, 11 May 2026 13:06:11 -0400 Subject: [PATCH 6/8] Add .mcp.json, sippy-dev MCP registration, and devcontainer make targets - Add .mcp.json so Claude Code discovers the sippy-dev MCP server - Register sippy-dev MCP server in post-create.sh for devcontainer - Add make devcontainer-up and devcontainer-claude targets - Skip go/npm dep check for devcontainer targets Co-Authored-By: Claude Opus 4.6 --- .devcontainer/post-create.sh | 1 + .gitignore | 1 + .mcp.json | 8 ++++++++ Makefile | 9 +++++++++ 4 files changed, 19 insertions(+) create mode 100644 .mcp.json diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 0a43cbb0c..f951419e4 100755 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -23,6 +23,7 @@ claude plugin marketplace add openshift-eng/ai-helpers --scope project claude plugin marketplace add anthropics/claude-plugins-official --scope project claude plugin install golang@ai-helpers --scope project claude plugin install typescript-lsp@claude-plugins-official --scope project +claude mcp add sippy-dev -- mcp/run.sh claude mcp add --transport http atlassian https://mcp.atlassian.com/v1/mcp echo "==> Building sippy and seeding database..." diff --git a/.gitignore b/.gitignore index f09c83495..e009b5596 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .claude/*local.json /*.json +!.mcp.json report.sh /sippy /sippy-daemon diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 000000000..924cb0693 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "sippy-dev": { + "command": "mcp/run.sh", + "args": [] + } + } +} diff --git a/Makefile b/Makefile index 0cb140d4a..23c926345 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,12 @@ export PATH := ${HOME}/go/bin:/go/bin:${PATH} DOCKER := $(or $(DOCKER),podman) +NO_DEP_CHECK_TARGETS := devcontainer-up devcontainer-claude +ifeq ($(filter $(NO_DEP_CHECK_TARGETS),$(MAKECMDGOALS)),) DEPS = npm go CHECK := $(foreach dep,$(DEPS),\ $(if $(shell which $(dep)),"$(dep) found",$(error "Missing $(dep) in PATH"))) +endif GIT_COMMIT := $(shell git rev-parse --short HEAD) BUILD_DATE := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") @@ -72,6 +75,12 @@ verify-apm: apm exit 1; \ fi +devcontainer-up: + devcontainer up --workspace-folder . --docker-path podman + +devcontainer-claude: + podman exec -it -w /workspace sippy-dev claude $(CLAUDE_ARGS) + e2e: ./scripts/e2e.sh From 8c168286070f3a39a83d5c3d99d44977daf942f4 Mon Sep 17 00:00:00 2001 From: Stephen Benjamin Date: Mon, 11 May 2026 13:06:23 -0400 Subject: [PATCH 7/8] Remove .mcp.json, rely on claude mcp add in post-create instead Co-Authored-By: Claude Opus 4.6 --- .gitignore | 1 - .mcp.json | 8 -------- 2 files changed, 9 deletions(-) delete mode 100644 .mcp.json diff --git a/.gitignore b/.gitignore index e009b5596..f09c83495 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ .claude/*local.json /*.json -!.mcp.json report.sh /sippy /sippy-daemon diff --git a/.mcp.json b/.mcp.json deleted file mode 100644 index 924cb0693..000000000 --- a/.mcp.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "mcpServers": { - "sippy-dev": { - "command": "mcp/run.sh", - "args": [] - } - } -} From bf81aa20d6c13c688462b3e7ebfd7647a5f37db4 Mon Sep 17 00:00:00 2001 From: Stephen Benjamin Date: Mon, 11 May 2026 13:22:29 -0400 Subject: [PATCH 8/8] Ignore playwright mcp --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f09c83495..f9fd4c1f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.playwright-mcp/ .claude/*local.json /*.json report.sh