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/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 || \ diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index 8f4060349..f951419e4 100755 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -17,8 +17,14 @@ 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 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..." make sippy 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 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