Skip to content

refactor: ship full consumer surface as one binary (remove MVP/full feature gate)#165

Merged
pofallon merged 6 commits into
mainfrom
refactor/remove-mvp-feature-gate
May 31, 2026
Merged

refactor: ship full consumer surface as one binary (remove MVP/full feature gate)#165
pofallon merged 6 commits into
mainfrom
refactor/remove-mvp-feature-gate

Conversation

@pofallon
Copy link
Copy Markdown
Contributor

@pofallon pofallon commented May 30, 2026

Summary

The deacon crate declared default = ["full"] / full = [] — a marker Cargo feature (no dependencies) whose only job was to flip #[cfg(feature = "full")] code in/out, hiding build, 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.
  • Source/tests: stripped all ~55 #[cfg(feature = "full")] and #[cfg_attr(not(feature = "full"), allow(dead_code))] attributes across the deacon crate — 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 the RELEASE_FEATURE_FLAGS: --no-default-features env var and every $RELEASE_FEATURE_FLAGS / --no-default-features usage, so releases build the full default binary.
  • .github/workflows/ci.yml: dropped --no-default-features from 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 the MVP_FLAGS / FULL_FLAGS variables and the *-full target 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 the help groupings.

Behavior

--no-default-features is now a harmless no-op. cargo build produces the full subcommand surface.

Acceptance

Repo-wide, zero occurrences of feature = "full" or --no-default-features remain in source, CI, and the Makefile (the only residual mentions are descriptive prose in CHANGELOG.md).

Gates (run locally against this tree)

  • cargo fmt --all -- --checkpass
  • cargo clippy --all-targets --all-features -- -D warningspass
  • cargo build / cargo build --no-default-features — both build the full surface
  • cargo run -- doctor --help and cargo run -- build --help — both work; all subcommands present in --help
  • make -n build / make -n clippy / make -n test-nextest — expand cleanly, no --no-default-features

Known pre-existing failures (NOT caused by this PR, reproduce identically on main)

  • make test-nextest does not run to completion because deacon::integration_cli::test_debug_logging_with_subcommand fails 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 on main; out of scope here.

🤖 Generated with Claude Code

@github-actions github-actions Bot added ci CI/CD changes build Build system changes labels May 30, 2026
…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>
pofallon and others added 5 commits May 30, 2026 18:29
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>
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>
@pofallon pofallon force-pushed the refactor/remove-mvp-feature-gate branch from 6888d98 to fda271d Compare May 31, 2026 03:03
@pofallon pofallon merged commit 56cfabd into main May 31, 2026
11 checks passed
@pofallon pofallon deleted the refactor/remove-mvp-feature-gate branch May 31, 2026 12:06
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

build Build system changes ci CI/CD changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant