You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
providers/workspaces/base/ and providers/workspaces/claude-cli/ are currently independent images, not parent/child. base/ is FROM debian:bookworm-slim; claude-cli/ is FROM node:22-slim. They each install their own (overlapping but non-identical) system packages, security hardening, user setup, etc.
This came up in #159 when adding the operator Co-authored-by: git hook to the workspace. The hook was placed in providers/workspaces/claude-cli/scripts/git-hooks/prepare-commit-msg because that's where it was actually needed — but architecturally it (and many other workspace concerns) should live once and be inherited by every workspace provider.
Proposed direction
Make claude-cli/Dockerfile actually inherit from a shared base image:
FROM agentic-base:latest AS claude-cli
# only claude-cli-specific layers (Node.js, Claude CLI, plugins) go here
…and consolidate into base/:
system packages: git, curl, ca-certificates, jq, procps, gnupg
the env-var contract (GIT_AUTHOR_*, GITHUB_TOKEN, SYN_OPERATOR_*, etc.)
claude-cli/ would then add only what's actually claude-specific: Node.js + npm install of @anthropic-ai/claude-code, the plugin baking, LSP servers, and any claude-specific entrypoint extensions.
Single source of truth for "what every workspace must have."
Consistent base for security audits and supply-chain attestation (cosign signing, SBOMs).
Why not now
#159 is scoped to issue #158 (operator attribution) and is already merge-ready. This refactor is meaningfully larger:
Reconciling Debian-slim vs Node-slim base (or moving Node into the base image)
Splitting the entrypoint into base + provider-specific extension points
Updating scripts/build-provider.py to know about layered builds
Possibly reconciling manifest.yaml schema between providers
Best done as a focused PR once there's a second active workspace provider to validate the abstraction against (otherwise we'd be designing for hypothetical second consumers).
Acceptance criteria
claude-cli/Dockerfile starts with FROM agentic-base:...
All system packages, security hardening, entrypoint scaffolding, and workspace-shipped git hooks live in base/ only
Existing just test-workspace integration tests still pass
At least one new provider (real or stub) demonstrates that adding a workspace requires only provider-specific layers, not duplicating base concerns
Context
providers/workspaces/base/andproviders/workspaces/claude-cli/are currently independent images, not parent/child.base/isFROM debian:bookworm-slim;claude-cli/isFROM node:22-slim. They each install their own (overlapping but non-identical) system packages, security hardening, user setup, etc.This came up in #159 when adding the operator
Co-authored-by:git hook to the workspace. The hook was placed inproviders/workspaces/claude-cli/scripts/git-hooks/prepare-commit-msgbecause that's where it was actually needed — but architecturally it (and many other workspace concerns) should live once and be inherited by every workspace provider.Proposed direction
Make
claude-cli/Dockerfileactually inherit from a shared base image:…and consolidate into
base/:git,curl,ca-certificates,jq,procps,gnupguvinstall + Python managed by uv (from chore(workspace): cleanup, uv-base Dockerfile, Claude CLI 2.1.126 #157)agentuser setup,/workspaceskeleton (ADR-036)GIT_AUTHOR_*,GITHUB_TOKEN,SYN_OPERATOR_*, etc.)claude-cli/would then add only what's actually claude-specific: Node.js + npm install of@anthropic-ai/claude-code, the plugin baking, LSP servers, and any claude-specific entrypoint extensions.What this enables
Why not now
#159 is scoped to issue #158 (operator attribution) and is already merge-ready. This refactor is meaningfully larger:
scripts/build-provider.pyto know about layered buildsmanifest.yamlschema between providersBest done as a focused PR once there's a second active workspace provider to validate the abstraction against (otherwise we'd be designing for hypothetical second consumers).
Acceptance criteria
claude-cli/Dockerfilestarts withFROM agentic-base:...base/onlyjust test-workspaceintegration tests still passRelated