The OpenTofu provider was removed, and where it went
cmd/terraform-provider-cargoship, internal/tofuprovider, test/e2e/tofu, example/terragrunt, docs/tofu and the Release mage namespace used to live here. choice-tofu-provider-layout records why: one module rather than two, because the linker never loads a package the import graph does not reach, so the CLI paid nothing for a provider it did not import. That page also named the one trigger that would make a separate repository right – a registry listing – because the OpenTofu registry validates a repository against {owner}/terraform-provider-{name} and no tag or directory inside colonel-byte/cargoship substitutes for it.
That trigger was pulled. The provider now lives in colonel-byte/terraform-provider-cargoship, which consumes this module as a library – the phases an apply runs are the same ones the CLI runs, which was always the premise – and released v0.1.1 carrying the zips, SHA256SUMS and per-platform manifest the registry protocol parses, signed with both the GPG key that signs cargoship’s rpm and deb and the cosign key that signs its archives.
This file is kept, at the name the removal plan had, for two reasons. The page was published, so the name is a URL somebody may still hold; and a reader who finds tofu in go.mod and no provider should not have to work out whether something was lost.
What stayed, and is not the provider’s
zarf-dev/zarfingo.modhas nothing to do with any of this. It is a library dependency for package formats, architecture detection and OCI handling, and predates both the provider and the collection that left before it.pkg/action.NewRefreshstays. It is the read-only half of an apply – connect, detect, gather facts, disconnect – and it exists so that “which phases are safe to run without changing a host” is decided once. The CLI does not expose it; the provider consumes it from here, and refresh is still generated from it.cluster.Host.ConfiguredAddresswas added for the provider’saddressattribute and is now also what a run receipt identifies a host by.pkg/action.KubeConfigOptions.NoWrite,KubeConfig.BytesandKubeConfig.Configwere added so the provider could have the credentials without writing~/.kube/config.cargoship kube-config --no-writeis not the same thing.test/microvmand the roottestpackage stay, and are importable rather than internal, because the provider’s end-to-end suite consumes both from the other repository. That export was #920;CARGOSHIP_E2E_EXAMPLE_ROOT, which lets that suite read the generated distro definitions out of a cargoship checkout rather than carrying a copy, was #941.cmd/cargoship/deps_test.gokeeps its guard onhashicorp/terraform-plugin. The two entries naming the provider’s own packages went with them, and what the test protects did not: a provider-shaped dependency reaching the CLI costs an air-gapped operator megabytes they carry by hand, and the only symptom is a larger binary, which no check reads.
The decision records went with it
choice-tofu-provider-layout, on why it was a package of this module and what would move it; choice-tofu-secrets, on why the kubeconfig is withheld unless asked for; choice-tofu-host-removal, on why a removal is a marker rather than a deletion; choice-tofu-e2e, on why the suite drives the shipped module; and design-tofu-provider-install, the install path’s design notes.
What was given up on purpose
The ghcr.io OCI mirror went with the Release namespace. mage release:tofuProvider assembled an image index an OpenTofu provider mirror serves and pushed it to ghcr.io, and release-tofu-provider.yaml ran it on the CLI’s v* tag. The new repository releases the same artifact shape on its own tags, so keeping the target here would have published a second copy of a provider this repository no longer builds. An operator whose .tofurc points an oci_mirror at ghcr.io/colonel-byte/tofu-providers needs to repoint it at the new repository’s releases; nothing here serves that path any more.