feat(cli): add docker-compose addon for containerized deployments#160
feat(cli): add docker-compose addon for containerized deployments#160Alisha-21-cloud wants to merge 6 commits intoMarve10s:mainfrom
Conversation
|
@Alisha-21-cloud is attempting to deploy a commit to the Ibrahim's projects Team on Vercel. A member of the Team first needs to authorize it. |
|
@Alisha-21-cloud I went through the patch closely and there are a few misses that need to be fixed before this is mergeable:
Net: the CLI/config validation changes are not enough here. The prompt path, template handler, emitted Docker assets, and canonical compatibility metadata all need to agree, and they currently do not. |
|
Hey @Marve10s 👋 Thank you so much for the thorough review — really appreciate you going through the patch so carefully and calling out each issue with the exact file paths and line numbers. That makes it a lot easier to track down and fix. To summarize what I'll be addressing:
I'll get all of this fixed and push a follow-up commit. Will ping you once it's up for another look. Thanks again! |
|
fix: resolve docker-compose addon compatibility, template emission, and Dockerfile issues SummaryAddressed all issues flagged in code review plus additional fixes found ChangesPrompt & CLI Compatibility
Compatibility Matrix
Template Handler
Docker Assets
Template Processor
Tests
Builds Verified
|
Marve10s
left a comment
There was a problem hiding this comment.
Thanks for the contribution. I found two changes that need to be fixed before this is ready to merge:
-
The Ratatui template no longer builds when
rustErrorHandlingis set tonone. Inpackages/template-generator/templates/rust-base/crates/tui/src/main.rs.hbs, the conditional import removesuse anyhow::Result;, butrun_app()still returns bareResult<()>, so that generated variant ends up with an unresolved type. -
The new root
preparescript wiring is no longer cross-platform.package.jsonnow runssh scripts/install-hooks.sh, which assumes a Unix shell is available. That breaks native Windows installs whereshis not onPATH. The helper script itself is reasonable, but the way it is invoked is not portable enough for this repo.
One more thing to confirm: AGENTS.md also removes the fork/upstream remote guidance. If that was intentional, fine, but I wanted to call it out since this repo still operates with both origin and upstream.
Also, the current red CI checks do not look like the main problem here. The failing jobs I checked were setup/download failures (setup-deno and setup-nu returning HTTP 504s) plus Vercel preview auth, so please don't treat the transient CI red as the reason for the requested changes.
|
fix: resolve rustErrorHandling=none build regression, cross-platform prepare script, and confirm AGENTS.md integrity SummaryAddressed all three maintainer callouts from the review. Changes cover the 1. Ratatui
|
rustErrorHandling value |
run_app() return type |
|---|---|
anyhow-thiserror |
Result<()> |
eyre |
Result<()> |
none |
Result<(), Box<dyn std::error::Error>> |
The none path now uses a fully qualified standard library error type and
does not depend on any imported alias. Generated code compiles cleanly across
all three modes.
Files Modified
packages/template-generator/templates/rust-base/crates/tui/src/main.rs.hbs
2. Root prepare Script Cross-Platform Portability
Problem
package.json root prepare lifecycle script was wired as:
sh scripts/install-hooks.shThis assumes a Unix shell (sh) is available on PATH, which is not
guaranteed on native Windows installs without WSL or Git Bash. Any Windows
contributor running npm install or bun install would hit an immediate
command not found failure before any project setup could complete.
Fix
Rewired prepare in package.json to:
"prepare": "bun run scripts/install-hooks.ts"Replaced the shell script with a portable TypeScript entrypoint
scripts/install-hooks.ts that runs via Bun, which is already a hard
dependency of this repo and is available on Windows, macOS, and Linux.
Behavior preserved and improved in install-hooks.ts
| Condition | Behavior |
|---|---|
git not available on PATH |
No-op, exits cleanly |
| Current directory is not a git repo | No-op, exits cleanly |
lefthook not available |
No-op, exits cleanly |
core.hooksPath set to /dev/null or nul |
Hooks intentionally disabled, skip install |
core.hooksPath set to a custom path |
Skip install, print informative message |
core.hooksPath points to default hooks location |
Run lefthook install --reset-hooks-path |
No custom core.hooksPath set |
Run lefthook install |
The new TS script is strictly more robust than the original shell script —
it handles edge cases that the .sh version did not cover, and works
identically across all platforms.
Files Modified
package.json— rewiredpreparescriptscripts/install-hooks.ts— new portable installer entrypoint (replacesinstall-hooks.sh)
3. AGENTS.md Fork/Upstream Guidance — Confirmed Intact
Concern Raised
The reviewer flagged a possible removal of fork/upstream remote workflow
guidance from AGENTS.md, noting this repo still operates with both
origin and upstream remotes.
Verified Status
The guidance was never removed as part of this change set.
All relevant lines are confirmed present:
| Content | Location |
|---|---|
| Section header for remote guidance | AGENTS.md:20 |
origin fork rule |
AGENTS.md:24 |
upstream warning |
AGENTS.md:25 |
| PR target instruction | AGENTS.md:27 |
No edits were made to AGENTS.md in this change set.
Validation
| Check | Result |
|---|---|
bun run --cwd packages/template-generator build after main.rs.hbs fix |
✅ Succeeded |
bun run scripts/install-hooks.ts after prepare rewiring |
✅ Succeeded, hooks synced |
AGENTS.md fork/upstream section line audit |
✅ All lines confirmed present |
Net File Changes
| File | Change |
|---|---|
packages/template-generator/templates/rust-base/crates/tui/src/main.rs.hbs |
Modified — conditional return type for run_app() |
package.json |
Modified — prepare script rewired to bun run |
scripts/install-hooks.ts |
Added — portable cross-platform hook installer |
AGENTS.md |
No changes — guidance confirmed intact |
|
fix: align template-processor tests with .hbs-only rendering behavior SummaryTest-alignment fix in ProblemAfter restricting Changes
|
| Scenario | Before | After |
|---|---|---|
.hbs file with template syntax |
✅ Rendered correctly | ✅ Rendered correctly |
Plain .ts file with template syntax |
✅ Rendered (old behavior) | ✅ Returned unchanged (new behavior) |
| Test suite alignment | ❌ One test failing | ✅ All tests passing |
Result
| Metric | Status |
|---|---|
template-generator test suite |
✅ 100 pass, 0 fail |
| Previously failing CI test lane | ✅ Now green |
| Implementation/test drift risk | ✅ Locked in with new assertion |
Files Modified
| File | Change |
|---|---|
packages/template-generator/src/template-processor.test.ts |
Updated existing test path + added non-.hbs pass-through test |
Review — Docker Compose addonThanks for the PR! I walked through each change end-to-end and scaffolded projects against the branch. Unfortunately I found two blockers that prevent the addon from doing what it advertises, plus some cleanup items. Detail below, each with the concrete evidence I used to confirm. 🔴 Blocker 1 —
|
|
Hi,
Thank you for pointing out the errors. I’ve reviewed your feedback and will
work on fixing all the issues mentioned.
I’ll make the necessary updates and share the revised version with you soon.
…On Tue, Apr 21, 2026, 1:54 AM Ibrahim Elkamali ***@***.***> wrote:
*Marve10s* left a comment (Marve10s/Better-Fullstack#160)
<#160?email_source=notifications&email_token=BRHT72TM637ROAIJADNDHOD4W2BPJA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMRYGQYDIMZRHA3KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4284043186>
Review — Docker Compose addon
Thanks for the PR! I walked through each change end-to-end and scaffolded
projects against the branch. Unfortunately I found two blockers that
prevent the addon from doing what it advertises, plus some cleanup items.
Detail below, each with the concrete evidence I used to confirm.
🔴 Blocker 1 — docker-compose.yml is invalid for database=sqlite + any
external backend
templates/addons/docker-compose/docker-compose.yml.hbs:
- L22–28: web service adds depends_on: db: condition: service_healthy
under {{#unless (eq database \"none\")}}
- L41–46: server service adds DATABASE_URL + depends_on: db under the
same {{#unless (eq database \"none\")}}
- L51 / L74 / L98: the db service itself is only emitted under {{#if
(eq database \"postgres\")}} / mysql / mongodb
So database=\"sqlite\" renders depends_on: db but never renders the db:
service. Reproduced:
$ bun create ***@***.*** test-sqlite --ecosystem typescript \
--frontend tanstack-router --backend hono --runtime bun \
--database sqlite --orm drizzle --addons docker-compose ...
$ cd test-sqlite && docker compose config
service \"server\" depends on undefined service \"db\": invalid compose project
Fix: gate the depends_on: db blocks on the same DB-has-container
predicate that gates the db: service (or drop them for sqlite — sqlite is
file-based and doesn't need a container).
🔴 Blocker 2 — Generated Dockerfiles cannot build in a Bun workspace
monorepo
docker-compose.yml.hbs L5–6: build: { context: ./apps/web }. Combined
with generated apps/web/Dockerfile.next:
- L5: COPY package.json bun.lock* ./ — root bun.lock is outside the
apps/web context, so the glob silently matches nothing and
--frozen-lockfile runs without a lockfile.
- L6: bun install --frozen-lockfile — apps/web/package.json references
\"workspace:*\" (e.g. @test-sqlite/api, @test-sqlite/env,
@test-sqlite/config) and \"catalog:\" (e.g. zod, dotenv, @trpc/client).
Both are resolved against the root package.json workspaces /
workspaces.catalog, neither of which is reachable from the ./apps/web
context. bun install fails immediately.
- L21–22: COPY /app/.next/standalone ./ and /app/.next/static
./.next/static require output: \"standalone\" in next.config.ts, but
the scaffolded config only sets typedRoutes + reactCompiler. Nothing
is emitted to .next/standalone.
- L20: COPY /app/public ./public — apps/web/public does not exist in
the Next scaffold (ls returns ENOENT).
The Vite Dockerfile has the same workspace-context flaw.
Fix direction: build context must be the repo root (context: .),
Dockerfiles must COPY the root lockfile + all workspace members they
depend on, and next.config.ts needs output: \"standalone\" when
docker-compose is enabled (or a separate Next Dockerfile that builds
without standalone mode).
🟡 Major
*3. Orphan apps/web/Dockerfile.hbs.*
templates/addons/docker-compose/apps/web/ contains Dockerfile.hbs
alongside Dockerfile.next.hbs and Dockerfile.vite.hbs, but
src/template-handlers/addons.ts lines 79–128 only ever emit
Dockerfile.next or Dockerfile.vite. The generic Dockerfile.hbs is
excluded by the outer processTemplatesFromPrefix exclusion at line 62–65
and never referenced. Delete it, or wire it up.
*4. Divergent & orphaned ADDON_COMPATIBILITY in apps/cli/src/constants.ts.*
Two tables now exist:
- packages/types/src/compatibility.ts:2105 — the one getDisabledReason
actually reads (L2313), includes 8 frontends for docker-compose.
- apps/cli/src/constants.ts:37 — exported but *zero importers* (grep
-rn \"ADDON_COMPATIBILITY\" apps/cli/src returns only the
declaration). This PR adds \"docker-compose\": [] here, which
disagrees with the real table and would mean "incompatible with every
frontend" if anything used it. Please remove the dead declaration entirely.
*5. Arbitrary exclusion of react-vite (and solid-start).*
compatibility.ts:2167 lists 8 frontends but omits react-vite and
solid-start, which every peer addon (tanstack-query, tanstack-table,
etc.) includes. The Vite Dockerfile is generic COPY . . && bun run build
&& nginx — nothing frontend-specific excludes them. Add them, or document
the reason.
*6. Scope creep — 7 unrelated fixes bundled.* The diff touches:
- validateProjectName adds / and \\\\ to INVALID_CHARS (L256)
- isFrontendAllowedWithBackend frontend → webFrontend bugfix (L2242)
- New examples loop in evaluateCompatibility (L2475)
- Ratatui conditional Result<()> type in
rust-base/crates/tui/src/main.rs.hbs
- scripts/install-hooks.ts + package.json prepare change
- template-processor.ts .hbs-only rendering refactor
- bun.lock unrelated devDep churn
Each is reasonable on its own but should land in its own PR so git blame/revert/review
stay clean.
🟢 Minor
*7. bun.lock version drift.* @types/bun ^1.3.12→^1.3.11, oxlint
^1.59.0→^1.58.0, turbo ^2.9.6→^2.9.4 — all *downgrades* with no
corresponding package.json change. Looks like bun install ran on a stale
branch. Re-lock from main before merge.
*8. Orphan scripts/install-hooks.sh.* Replaced by install-hooks.ts but
the .sh file is still in tree and no longer referenced by package.json. git
rm scripts/install-hooks.sh.
*9. Unused originalPath variable.*
packages/template-generator/src/core/template-processor.ts:113:
const originalPath = filePath.endsWith(\".hbs\") ? filePath : filePath + \".hbs\"; // never readif (filePath.endsWith(\".hbs\")) { ... }
Delete it.
*10. projectNameWithClosingBrace helper is fragile.*
template-processor.ts:71-74 adds a helper whose sole purpose is to dodge
Handlebars treating }} as a delimiter in ${POSTGRES_DB:-{{projectName}}}
on docker-compose.yml.hbs:57. Handlebars supports
\\{{{{raw}}}}…\\{{{{/raw}}}} raw blocks for this exact case, which is
more self-documenting than a single-purpose helper that hard-codes a
closing brace into its name.
*11. Import formatting.* apps/cli/test/addons.test.ts:2 — missing space
after comma: readFileSync,existsSync. Also 8× (result as any).result
casts in the new test cases — prefer widening the runTRPCTest return type
or typing result explicitly at call sites.
------------------------------
*Summary:* requesting changes. The two blockers mean the addon doesn't
actually scaffold a working docker-compose setup for most configurations
today — sqlite compose files fail docker compose config, and Next/Vite
Dockerfiles can't bun install workspace packages from the narrow
./apps/web context. Happy to pair on fixes, and thank you for tackling
this!
—
Reply to this email directly, view it on GitHub
<#160?email_source=notifications&email_token=BRHT72TM637ROAIJADNDHOD4W2BPJA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMRYGQYDIMZRHA3KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4284043186>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/BRHT72TAXQLHJBSLD563FJT4W2BPJAVCNFSM6AAAAACX5XAELCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHM2DEOBUGA2DGMJYGY>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
|
Hi,
Thank you for pointing out the errors. I’ve reviewed your feedback and will
work on fixing all the issues mentioned.
I’ll make the necessary updates and share the revised version with you soon.
On Wed, Apr 22, 2026, 8:27 AM SYED AHMAD ALISHA ***@***.***>
wrote:
… Hi,
Thank you for pointing out the errors. I’ve reviewed your feedback and
will work on fixing all the issues mentioned.
I’ll make the necessary updates and share the revised version with you
soon.
On Tue, Apr 21, 2026, 1:54 AM Ibrahim Elkamali ***@***.***>
wrote:
> *Marve10s* left a comment (Marve10s/Better-Fullstack#160)
> <#160?email_source=notifications&email_token=BRHT72TM637ROAIJADNDHOD4W2BPJA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMRYGQYDIMZRHA3KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4284043186>
> Review — Docker Compose addon
>
> Thanks for the PR! I walked through each change end-to-end and scaffolded
> projects against the branch. Unfortunately I found two blockers that
> prevent the addon from doing what it advertises, plus some cleanup items.
> Detail below, each with the concrete evidence I used to confirm.
> 🔴 Blocker 1 — docker-compose.yml is invalid for database=sqlite + any
> external backend
>
> templates/addons/docker-compose/docker-compose.yml.hbs:
>
> - L22–28: web service adds depends_on: db: condition: service_healthy
> under {{#unless (eq database \"none\")}}
> - L41–46: server service adds DATABASE_URL + depends_on: db under the
> same {{#unless (eq database \"none\")}}
> - L51 / L74 / L98: the db service itself is only emitted under {{#if
> (eq database \"postgres\")}} / mysql / mongodb
>
> So database=\"sqlite\" renders depends_on: db but never renders the db:
> service. Reproduced:
>
> $ bun create ***@***.*** test-sqlite --ecosystem typescript \
> --frontend tanstack-router --backend hono --runtime bun \
> --database sqlite --orm drizzle --addons docker-compose ...
> $ cd test-sqlite && docker compose config
> service \"server\" depends on undefined service \"db\": invalid compose project
>
> Fix: gate the depends_on: db blocks on the same DB-has-container
> predicate that gates the db: service (or drop them for sqlite — sqlite
> is file-based and doesn't need a container).
> 🔴 Blocker 2 — Generated Dockerfiles cannot build in a Bun workspace
> monorepo
>
> docker-compose.yml.hbs L5–6: build: { context: ./apps/web }. Combined
> with generated apps/web/Dockerfile.next:
>
> - L5: COPY package.json bun.lock* ./ — root bun.lock is outside the
> apps/web context, so the glob silently matches nothing and
> --frozen-lockfile runs without a lockfile.
> - L6: bun install --frozen-lockfile — apps/web/package.json
> references \"workspace:*\" (e.g. @test-sqlite/api, @test-sqlite/env,
> @test-sqlite/config) and \"catalog:\" (e.g. zod, dotenv, @trpc/client).
> Both are resolved against the root package.json workspaces /
> workspaces.catalog, neither of which is reachable from the ./apps/web
> context. bun install fails immediately.
> - L21–22: COPY /app/.next/standalone ./ and /app/.next/static
> ./.next/static require output: \"standalone\" in next.config.ts, but
> the scaffolded config only sets typedRoutes + reactCompiler. Nothing
> is emitted to .next/standalone.
> - L20: COPY /app/public ./public — apps/web/public does not exist in
> the Next scaffold (ls returns ENOENT).
>
> The Vite Dockerfile has the same workspace-context flaw.
>
> Fix direction: build context must be the repo root (context: .),
> Dockerfiles must COPY the root lockfile + all workspace members they
> depend on, and next.config.ts needs output: \"standalone\" when
> docker-compose is enabled (or a separate Next Dockerfile that builds
> without standalone mode).
> 🟡 Major
>
> *3. Orphan apps/web/Dockerfile.hbs.*
> templates/addons/docker-compose/apps/web/ contains Dockerfile.hbs
> alongside Dockerfile.next.hbs and Dockerfile.vite.hbs, but
> src/template-handlers/addons.ts lines 79–128 only ever emit
> Dockerfile.next or Dockerfile.vite. The generic Dockerfile.hbs is
> excluded by the outer processTemplatesFromPrefix exclusion at line 62–65
> and never referenced. Delete it, or wire it up.
>
> *4. Divergent & orphaned ADDON_COMPATIBILITY in
> apps/cli/src/constants.ts.* Two tables now exist:
>
> - packages/types/src/compatibility.ts:2105 — the one getDisabledReason
> actually reads (L2313), includes 8 frontends for docker-compose.
> - apps/cli/src/constants.ts:37 — exported but *zero importers* (grep
> -rn \"ADDON_COMPATIBILITY\" apps/cli/src returns only the
> declaration). This PR adds \"docker-compose\": [] here, which
> disagrees with the real table and would mean "incompatible with every
> frontend" if anything used it. Please remove the dead declaration entirely.
>
> *5. Arbitrary exclusion of react-vite (and solid-start).*
> compatibility.ts:2167 lists 8 frontends but omits react-vite and
> solid-start, which every peer addon (tanstack-query, tanstack-table,
> etc.) includes. The Vite Dockerfile is generic COPY . . && bun run build
> && nginx — nothing frontend-specific excludes them. Add them, or
> document the reason.
>
> *6. Scope creep — 7 unrelated fixes bundled.* The diff touches:
>
> - validateProjectName adds / and \\\\ to INVALID_CHARS (L256)
> - isFrontendAllowedWithBackend frontend → webFrontend bugfix (L2242)
> - New examples loop in evaluateCompatibility (L2475)
> - Ratatui conditional Result<()> type in
> rust-base/crates/tui/src/main.rs.hbs
> - scripts/install-hooks.ts + package.json prepare change
> - template-processor.ts .hbs-only rendering refactor
> - bun.lock unrelated devDep churn
>
> Each is reasonable on its own but should land in its own PR so git blame/revert/review
> stay clean.
> 🟢 Minor
>
> *7. bun.lock version drift.* @types/bun ^1.3.12→^1.3.11, oxlint
> ^1.59.0→^1.58.0, turbo ^2.9.6→^2.9.4 — all *downgrades* with no
> corresponding package.json change. Looks like bun install ran on a stale
> branch. Re-lock from main before merge.
>
> *8. Orphan scripts/install-hooks.sh.* Replaced by install-hooks.ts but
> the .sh file is still in tree and no longer referenced by package.json. git
> rm scripts/install-hooks.sh.
>
> *9. Unused originalPath variable.*
> packages/template-generator/src/core/template-processor.ts:113:
>
> const originalPath = filePath.endsWith(\".hbs\") ? filePath : filePath + \".hbs\"; // never readif (filePath.endsWith(\".hbs\")) { ... }
>
> Delete it.
>
> *10. projectNameWithClosingBrace helper is fragile.*
> template-processor.ts:71-74 adds a helper whose sole purpose is to dodge
> Handlebars treating }} as a delimiter in ${POSTGRES_DB:-{{projectName}}}
> on docker-compose.yml.hbs:57. Handlebars supports
> \\{{{{raw}}}}…\\{{{{/raw}}}} raw blocks for this exact case, which is
> more self-documenting than a single-purpose helper that hard-codes a
> closing brace into its name.
>
> *11. Import formatting.* apps/cli/test/addons.test.ts:2 — missing space
> after comma: readFileSync,existsSync. Also 8× (result as any).result
> casts in the new test cases — prefer widening the runTRPCTest return
> type or typing result explicitly at call sites.
> ------------------------------
>
> *Summary:* requesting changes. The two blockers mean the addon doesn't
> actually scaffold a working docker-compose setup for most configurations
> today — sqlite compose files fail docker compose config, and Next/Vite
> Dockerfiles can't bun install workspace packages from the narrow
> ./apps/web context. Happy to pair on fixes, and thank you for tackling
> this!
>
> —
> Reply to this email directly, view it on GitHub
> <#160?email_source=notifications&email_token=BRHT72TM637ROAIJADNDHOD4W2BPJA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMRYGQYDIMZRHA3KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4284043186>,
> or unsubscribe
> <https://github.com/notifications/unsubscribe-auth/BRHT72TAXQLHJBSLD563FJT4W2BPJAVCNFSM6AAAAACX5XAELCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHM2DEOBUGA2DGMJYGY>
> .
> You are receiving this because you were mentioned.Message ID:
> ***@***.***>
>
|
This pull request adds support for a new "docker-compose" addon to the CLI, including compatibility logic, user prompts, and comprehensive tests. It ensures "docker-compose" is only available for appropriate backend/runtime combinations, with clear error messages for unsupported scenarios. The test suite is extended to validate both compatibility and file generation for Docker Compose projects.
Docker Compose Addon Support
apps/cli/src/constants.ts,apps/cli/src/prompts/addons.ts). [1] [2] [3]Compatibility and Validation Logic
validateAddonCompatibility,getCompatibleAddons, and related prompt functions to accept and checkbackendandruntime, enforcing that "docker-compose" is not selectable with Convex backend or Workers runtime, with specific error messages (apps/cli/src/utils/compatibility-rules.ts,apps/cli/src/prompts/addons.ts). [1] [2] [3] [4] [5]apps/cli/src/utils/config-validation.ts). [1] [2]Prompt and Config Integration
apps/cli/src/prompts/addons.ts,apps/cli/src/prompts/config-prompts.ts). [1] [2]Testing Enhancements
docker-compose.yml, Dockerfiles,.dockerignore) (apps/cli/test/addons.test.ts).apps/cli/test/addons.test.ts). [1] [2] [3] [4] [5] [6]These changes improve the CLI's addon system, making it more robust and user-friendly by supporting containerized deployment workflows while preventing invalid configurations.