Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #4304 +/- ##
==========================================
- Coverage 68.77% 68.51% -0.27%
==========================================
Files 473 478 +5
Lines 47917 48483 +566
==========================================
+ Hits 32956 33218 +262
- Misses 12300 12415 +115
- Partials 2661 2850 +189 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
aponcedeleonch
left a comment
There was a problem hiding this comment.
Thanks for the fix — the root cause analysis is spot on and the merge logic is solid. Left two comments on things that could bite us.
|
|
||
| # Install runtime dependencies | ||
| RUN apk add --no-cache ca-certificates | ||
| RUN apk add --no-cache {{range .RuntimeConfig.AdditionalPackages}}{{.}} {{end}} |
There was a problem hiding this comment.
If AdditionalPackages is ever empty (e.g. user config specifies additional_packages: [], or GetDefaultRuntimeConfig is called with an unknown transport type returning an empty RuntimeConfig{}), this renders as:
RUN apk add --no-cache
…which fails the Docker build. Same issue in go.tmpl and uvx.tmpl (all three branches).
Consider wrapping with an {{if}} guard:
{{if .RuntimeConfig.AdditionalPackages}}
RUN apk add --no-cache {{range .RuntimeConfig.AdditionalPackages}}{{.}} {{end}}
{{end}}
| return nil, fmt.Errorf("invalid runtime config override: %w", err) | ||
| } | ||
| return override, nil | ||
| return merged, nil |
There was a problem hiding this comment.
The override path now correctly merges with defaults — nice. However, the user config path just below (via provider.GetRuntimeConfig()) still returns the raw config without merging. If a user writes a config.yaml with additional_packages: [git] (omitting ca-certificates), the runtime stage will no longer install it since the templates no longer hardcode ca-certificates.
On main this was safe because the runtime stage always hardcoded ca-certificates regardless of config. With this PR that safety net is gone.
Suggest applying the same merge logic to the user config path as well, e.g.:
if rc := provider.GetRuntimeConfig(string(transportType)); rc != nil {
merged := mergeRuntimeConfig(transportType, rc)
if err := merged.Validate(); err != nil {
return nil, fmt.Errorf("invalid user runtime config: %%w", err)
}
return merged, nil
}c7001e8 to
b56db14
Compare
When --runtime-add-package is used without --runtime-image,
loadRuntimeConfig returned the override as-is with an empty
BuilderImage, producing an invalid Dockerfile ("FROM AS builder").
Even with --runtime-image, AdditionalPackages replaced the defaults
instead of merging.
Additionally, the npx, go, and uvx templates only installed
AdditionalPackages in the builder stage. The runtime stage hardcoded
ca-certificates, so packages needed at runtime (e.g. git) were missing.
Fix both issues:
- Add mergeRuntimeConfig to fill empty BuilderImage from defaults and
deduplicate-merge AdditionalPackages
- Update all three templates to install AdditionalPackages in the
runtime stage
Fixes #4301
b56db14 to
21ab354
Compare
There was a problem hiding this comment.
Large PR Detected
This PR exceeds 1000 lines of changes and requires justification before it can be reviewed.
How to unblock this PR:
Add a section to your PR description with the following format:
## Large PR Justification
[Explain why this PR must be large, such as:]
- Generated code that cannot be split
- Large refactoring that must be atomic
- Multiple related changes that would break if separated
- Migration or data transformationAlternative:
Consider splitting this PR into smaller, focused changes (< 1000 lines each) for easier review and reduced risk.
See our Contributing Guidelines for more details.
This review will be automatically dismissed once you add the justification section.
Summary
--runtime-add-packagewithout--runtime-imagecreated aRuntimeConfigoverride with an emptyBuilderImage, whichloadRuntimeConfigreturned as-is — bypassing defaults and producing an invalid Dockerfile (FROM AS builder). Even with--runtime-image, the override'sAdditionalPackagesreplaced the defaults instead of merging with them.Separately, the npx, go, and uvx Dockerfile templates only installed
AdditionalPackagesin the builder stage. The runtime stage hardcodedca-certificates, so runtime dependencies likegitadded via--runtime-add-packagewere missing from the final container.Fixes first half of #4301
Type of change
Test plan
task test)Built
thvfrom the branch and ranthv run --transport stdio --runtime-add-package git --name awesome npx://awesome-agent-skills-mcp. Verified:FROM node:22-alpine AS builder(not empty)apk add --no-cache git ca-certificatesChanges
pkg/runner/protocol.gomergeRuntimeConfigthat fills emptyBuilderImagefrom defaults and dedup-mergesAdditionalPackages; updateloadRuntimeConfigto call itpkg/runner/protocol_test.goTestMergeRuntimeConfig(5 table cases) andTestLoadRuntimeConfigMergesOverrideWithDefaultspkg/container/templates/npx.tmplAdditionalPackagesinstead of hardcodedca-certificatespkg/container/templates/go.tmplpkg/container/templates/uvx.tmplpkg/container/templates/templates_test.goTestRuntimeStageInstallsAdditionalPackagescovering all three transportsDoes this introduce a user-facing change?
--runtime-add-packagenow works correctly without requiring--runtime-image, and packages are available at runtime inside the container.