refactor: ship full consumer surface as one binary (remove MVP/full feature gate)#165
Merged
Merged
Conversation
…eature gate) The deacon crate declared `default = ["full"]` / `full = []`, a marker feature (no dependencies) that flipped #[cfg(feature = "full")] code in/out to hide build/doctor/templates/outdated/run-user-commands/etc. behind an "MVP" subset. The decision is to ship the entire in-scope consumer surface as a single binary, so the gate is pure overhead. Remove it completely. - crates/deacon/Cargo.toml: delete the [features] table (default/full). - Strip all ~55 #[cfg(feature = "full")] and #[cfg_attr(not(feature = "full"), allow(dead_code))] attributes across the deacon crate (src + ~28 test files). - .github/workflows/release.yml: drop RELEASE_FEATURE_FLAGS and every --no-default-features usage so releases build the full default binary. - .github/workflows/ci.yml: drop --no-default-features from the fast test job; the MSRV job already builds the full surface. Single test path, no duplication. - Makefile: remove the MVP_FLAGS/FULL_FLAGS variables and the *-full target duplicates; consolidate to a single build/test/clippy path and update help. `--no-default-features` is now a no-op. Verified locally: cargo fmt --all -- --check and cargo clippy --all-targets --all-features -- -D warnings pass; `cargo run -- doctor --help` / `build --help` work and all subcommands appear in `--help`; `make -n build|clippy` show no --no-default-features. NOTE: a full `make test-nextest` cannot complete cleanly on this branch OR on main because of a pre-existing, unrelated failure in deacon::integration_cli::test_debug_logging_with_subcommand (a stale workspace-path error-message assertion), fixed separately in PR #166. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ce855d4 to
ea1852d
Compare
Two tests (`test_workspace_folder_option`, `test_debug_logging_with_subcommand`)
pass `--workspace-folder /tmp/nonexistent`, which now errors at workspace-path
resolution ("Failed to resolve workspace path …") before config discovery — so
the old "No devcontainer.json found in workspace" assertion no longer matches.
This was masked on main because the file is `#![cfg(feature = "full")]` and CI
ran `--no-default-features`, compiling it out; removing the feature gate in this
PR surfaces both. Assert the actual current error message.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…eature-gate # Conflicts: # CHANGELOG.md
The corrected assertion string is short enough to fit on one line, so rustfmt collapses the `.stderr(predicate::str::contains( … ))` call. Apply it to keep `cargo fmt --all -- --check` (CI lint job) green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…mplemented The `exec` subtest expected stderr containing "Dev container config" AND "not found", but `exec` now emits "Configuration file not found: <path>" (the same message the `build` subtest already asserts). This was masked on main because the file is `#![cfg(feature = "full")]` and CI ran `--no-default-features`, compiling it out; removing the feature gate surfaces it. Assert the actual current message. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…eature-gate # Conflicts: # CHANGELOG.md
6888d98 to
fda271d
Compare
pofallon
added a commit
that referenced
this pull request
Jun 2, 2026
…#173) * feat(ports): support appPort arrays and share build-config resolution appPort now accepts a single value or an array per the containers.dev spec (new AppPort untagged enum), and appPort bindings are published as docker -p args alongside forwardPorts. Port publish-arg construction is extracted into tested helpers in docker.rs. Dockerfile build-config resolution is deduplicated into a shared resolve_devcontainer_build_config() helper used by both `build` and `up`, resolving dockerFile/build.dockerfile relative to the config dir. Also drops stale "MVP-only" comments from release.yml left over after the MVP/full feature gate was removed (#165). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(build): place Dockerfile fixtures alongside nested devcontainer.json The build-config refactor resolves dockerFile/build.dockerfile relative to the devcontainer.json location (spec-correct), so fixtures with the config under .devcontainer/ but the Dockerfile at the workspace root no longer resolve. Move those Dockerfiles into .devcontainer/ to match. Fixtures with a root-level .devcontainer.json (config dir == workspace root) and compose-based builds are unaffected and left unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The
deaconcrate declareddefault = ["full"]/full = []— a marker Cargo feature (no dependencies) whose only job was to flip#[cfg(feature = "full")]code in/out, hidingbuild,doctor,templates,outdated,run-user-commands,set-up,upgrade, etc. behind an "MVP" subset. The decision is to ship the entire in-scope consumer surface as a single binary, so this gate is now pure overhead. This PR removes it completely.Changes
crates/deacon/Cargo.toml: deleted the[features]table (default = ["full"],full = []) and its explanatory comment.#[cfg(feature = "full")]and#[cfg_attr(not(feature = "full"), allow(dead_code))]attributes across thedeaconcrate —main.rs,cli.rs,commands/mod.rs,commands/shared/feature_resolver.rs, and ~28 test files (including file-level#![cfg(feature = "full")]gates)..github/workflows/release.yml: removed theRELEASE_FEATURE_FLAGS: --no-default-featuresenv var and every$RELEASE_FEATURE_FLAGS/--no-default-featuresusage, so releases build the full default binary..github/workflows/ci.yml: dropped--no-default-featuresfrom the fast test job. The MSRV job already builds the full surface (--all-features), and there was a single test path (no full-vs-MVP job pair to collapse).Makefile: removed theMVP_FLAGS/FULL_FLAGSvariables and the*-fulltarget duplicates (build-full,run-full,test-full,test-fast-full,dev-fast-full,test-nextest-fast-full,clippy-full); consolidated to a single build/test/clippy path and updated thehelpgroupings.Behavior
--no-default-featuresis now a harmless no-op.cargo buildproduces the full subcommand surface.Acceptance
Repo-wide, zero occurrences of
feature = "full"or--no-default-featuresremain in source, CI, and the Makefile (the only residual mentions are descriptive prose inCHANGELOG.md).Gates (run locally against this tree)
cargo fmt --all -- --check— passcargo clippy --all-targets --all-features -- -D warnings— passcargo build/cargo build --no-default-features— both build the full surfacecargo run -- doctor --helpandcargo run -- build --help— both work; all subcommands present in--helpmake -n build/make -n clippy/make -n test-nextest— expand cleanly, no--no-default-featuresKnown pre-existing failures (NOT caused by this PR, reproduce identically on
main)make test-nextestdoes not run to completion becausedeacon::integration_cli::test_debug_logging_with_subcommandfails on a stale workspace-path error-message assertion (unrelated to the feature gate) — being fixed separately in build: raise MSRV to 1.95 to restore the MSRV CI gate #166.cargo +1.85 check(MSRV) fails on pre-existing lockfile drift (transitive deps now require rustc ≥ 1.86). Also fails onmain; out of scope here.🤖 Generated with Claude Code