Skip to content
Merged
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
6 changes: 6 additions & 0 deletions .env.quickstart.example
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,12 @@ ROSETTA_MCP_ENABLED=false
# How: Keep as-is. Only change if you mount a custom plugin.
ROSETTA_PLUGIN_PATH=/opt/rosetta-plugin
#
# ROSETTA_MARKETPLACE_REF
# What: Git tag/branch/SHA of the public griddynamics/rosetta marketplace to bake into
# the image at BUILD time (build arg, not a runtime setting). Pins the plugin version.
# How: Bump to a newer tag and rebuild the backend image to upgrade the bundled KB plugin.
ROSETTA_MARKETPLACE_REF=v2.0.55
#
# ROSETTA_API_KEY / ROSETTA_USER_EMAIL / ROSETTA_SERVER_URL
# What: Credentials for the live IMS-MCP Rosetta service.
# Only needed when ROSETTA_MCP_ENABLED=true.
Expand Down
10 changes: 8 additions & 2 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -124,15 +124,21 @@ COPY claude-settings.json /root/.claude/settings.json
# the codegen agents use). We invoke it by absolute path (it is not a uv/venv entry point).
# The install path is read back from the CLI's own installed_plugins.json (via jq) and copied
# to a stable /opt/rosetta-plugin so the runtime path never depends on the resolved version.
# Plugin versions cannot be pinned via the CLI, so the build takes the marketplace's current version.
#
Comment thread
awrobel-gd marked this conversation as resolved.
# The marketplace catalog is PINNED to a git tag via the `<git-url>#<ref>` syntax. `plugin install`
# has no version flag, so pinning the marketplace ref is what pins the installed plugin version.
# The ref is a build arg (ROSETTA_MARKETPLACE_REF); docker-compose supplies it from .env
# (falling back to the default below), so it can be bumped without editing this Dockerfile:
# docker build --build-arg ROSETTA_MARKETPLACE_REF=v2.0.56 ...
#
# The guard asserts the staged plugin actually ships the offline toolset (manifest + skills +
# workflows), failing the build if the marketplace ever serves an empty/MCP-only plugin.
# ---------------------------------------------------------------------------
ENV HOME=/root
ARG ROSETTA_MARKETPLACE_REF=v2.0.55
RUN CLAUDE_BIN="$(find /app/.venv -type f -path '*/claude_agent_sdk/_bundled/claude' | head -1)" \
&& test -n "$CLAUDE_BIN" \
&& "$CLAUDE_BIN" plugin marketplace add griddynamics/rosetta \
&& "$CLAUDE_BIN" plugin marketplace add "https://github.com/griddynamics/rosetta.git#${ROSETTA_MARKETPLACE_REF}" \
&& "$CLAUDE_BIN" plugin install "rosetta@rosetta" --scope user \
&& installed="$(jq -r '.plugins["rosetta@rosetta"][] | select(.scope=="user") | .installPath' /root/.claude/plugins/installed_plugins.json | head -1)" \
&& test -n "$installed" && test -d "$installed" \
Expand Down
4 changes: 4 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ services:
build:
context: ./backend
dockerfile: Dockerfile
args:
# Git tag/branch/SHA of the griddynamics/rosetta marketplace to bake in.
# Sourced from .env; falls back to the Dockerfile's own pinned default.
ROSETTA_MARKETPLACE_REF: ${ROSETTA_MARKETPLACE_REF:-v2.0.55}
image: specflow-backend:latest
container_name: ${SPECFLOW_BACKEND_CONTAINER:-specflow-backend}
ports:
Expand Down