Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion .claude/settings.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Consider mounting the .claude directory instead of the specific credentials file.

File-level bind mounts are fragile when the application performs atomic file updates (write to temporary file + rename). If the Claude CLI updates credentials by replacing the file rather than modifying it in-place, the bind mount will break and the container will still see the old inode.

Mounting the parent directory is more robust:

📁 Recommended fix to mount the directory
-    "source=${localEnv:HOME}/.claude/.credentials.json,target=/home/vscode/.claude/.credentials.json,type=bind"
+    "source=${localEnv:HOME}/.claude,target=/home/vscode/.claude,type=bind"

This also requires updating .devcontainer/init-services.sh accordingly (it currently creates the file, but would only need to create the directory).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.devcontainer/devcontainer.json at line 12, Replace the bind mount of the
single credentials file with a bind mount of the parent .claude directory so
inode-swapping updates won’t break the container (i.e., change the mount entry
that currently binds the specific credentials.json to bind the .claude directory
instead, keeping the target directory under the container user). Also update the
init script (init-services.sh) to create the .claude directory if missing rather
than creating the credentials file so the container can accept file replacements
performed by the Claude CLI.

],
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind",
"workspaceFolder": "/workspace",
Expand Down
4 changes: 4 additions & 0 deletions .devcontainer/init-services.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 || \
Expand Down
8 changes: 7 additions & 1 deletion .devcontainer/post-create.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Comment thread
stbenjam marked this conversation as resolved.

echo "==> Building sippy and seeding database..."
make sippy
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.playwright-mcp/
.claude/*local.json
/*.json
report.sh
Expand Down
9 changes: 9 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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")
Expand Down Expand Up @@ -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

Expand Down