Migrate ckconfig to the vanity module path

This commit is contained in:
2026-11-04 03:52:46 +00:00
parent f0121ad466
commit 92a327db97
36 changed files with 113 additions and 58 deletions

View File

@@ -19,13 +19,12 @@ defines the shared visibility policy.
| Module | Package | Provides |
| --- | --- | --- |
| `go.maximumdirect.net/commandkit` | `commandkit` | Typed commands, bindings, execution reporting and outcomes, help, and version. |
| `gitea.maximumdirect.net/eric/CommandKit/integrations/ckconfig` | `ckconfig` | ConfigKit-backed `config` scopes, including configuration source evidence. |
| `go.maximumdirect.net/ckconfig` | `ckconfig` | ConfigKit-backed `config` scopes, including configuration source evidence. |
| `gitea.maximumdirect.net/eric/CommandKit/integrations/ckprompt` | `ckprompt` | PromptKit engine configuration/comparison, five catalogs, named inspection, requirements discovery, concrete request validation, and native smoke tests. |
Importing an integration does not install commands. The integrations currently
use the old core module identity and cannot be composed with the new core path.
The planned matched releases are `go.maximumdirect.net/ckconfig v0.2.0` and
`go.maximumdirect.net/ckprompt v0.2.0`, using core v0.3.0. See the
Importing an integration does not install commands. The ckconfig v0.2.0
candidate uses core v0.3.0; ckprompt still uses the old core identity and cannot
be composed with the new core path until its planned v0.2.0 release. See the
[consumer guide](docs/consumers/guide.md#module-selection) for migration details.
## Examples

View File

@@ -12,16 +12,15 @@ installed at the application root, not as group children.
| Import | Use when |
| --- | --- |
| `go.maximumdirect.net/commandkit` | The application needs typed command declarations and common CLI behavior. |
| `gitea.maximumdirect.net/eric/CommandKit/integrations/ckconfig` | The application wants ConfigKit-backed configuration scopes and reports. |
| `go.maximumdirect.net/ckconfig` | The application wants ConfigKit-backed configuration scopes and reports. |
| `gitea.maximumdirect.net/eric/CommandKit/integrations/ckprompt` | The application wants PromptKit engine configuration/comparison, five catalogs, named inspection, requirements discovery, request validation, or native smoke testing. |
The integration paths in the table are their current source identities; they
use the old core path and do not compose with `go.maximumdirect.net/commandkit`.
For the new core v0.3.0 identity, the planned matched releases are
`go.maximumdirect.net/ckconfig v0.2.0` and `go.maximumdirect.net/ckprompt v0.2.0`.
Update application imports and dependency versions together when those releases
are available. Old and new core paths have distinct Go type identities.
Install the new core with `go get go.maximumdirect.net/commandkit@v0.3.0`.
The ckconfig v0.2.0 candidate uses core v0.3.0. The ckprompt source still uses
the old core and ckconfig identities; its planned matched v0.2.0 release will
use the new paths. Update application imports and dependency versions together.
Old and new core paths have distinct Go type identities. Install core with
`go get go.maximumdirect.net/commandkit@v0.3.0` and the matching integration
with `go get go.maximumdirect.net/ckconfig@v0.2.0` once it is published.
The two integrations are independent optional imports. `ckprompt` uses the
public scope and error contracts from `ckconfig`; importing it does not add the

View File

@@ -100,8 +100,8 @@ evidence, not build dependencies. Implemented contracts belong in CommandKit
under their canonical owners.
The root module does not traverse nested modules. During the vanity-path
migration, integrations still import the old core identity and cannot compose
with the migrated root until their own module migrations are complete. After
migration, ckprompt still imports the old core and ckconfig identities and
cannot compose with the migrated modules until its own migration is complete. After
the matched migrations, during development use a
local workspace for all three modules; it is ignored and must not be committed.
If a local `go.work` already exists, preserve it and add these module directories:

View File

@@ -6,9 +6,10 @@ own the optional ConfigKit and PromptKit integrations. The
[architecture policy](../policy/architecture.md) owns normative boundaries;
this page inventories the implemented owners.
The core module now declares `go.maximumdirect.net/commandkit`. The integration
modules retain their old module and core import identities until their planned
matched releases; Go treats those identities as distinct.
The core and ckconfig modules declare `go.maximumdirect.net/commandkit` and
`go.maximumdirect.net/ckconfig`. Ckprompt retains the old module and import
identities until its planned matched release; Go treats those identities as
distinct.
## Root `commandkit`

View File

@@ -1,6 +1,6 @@
# CommandKit vanity migration and dependency alignment plan
Status: Stages 1–2 complete; Stages 3–7 are not started.
Status: Stages 1–3 complete; Stages 4–7 are not started.
This plan is for the Luna coding agent implementing the
[feature roadmap](integration-dependency-alignment.md). Follow the stages in
@@ -176,7 +176,12 @@ sums is part of Stage 3, not a new completion gate for core publication.
## Stage 3: Migrate ckconfig and prepare its independent candidate
**Status:** not started.
**Completed.** Ckconfig declares `go.maximumdirect.net/ckconfig`, imports the
new core identity, and downloaded `go.maximumdirect.net/commandkit v0.3.0`
with authentic sums. The resolved graph retains ConfigKit v0.8.0 and selects
both the older ReleaseKit v0.4.1 and vanity ReleaseKit v0.9.0 tool modules;
module-local attribution and current guidance reflect those selections. The
v0.2.0 release note is prepared; independent suite validation follows.
1. In `integrations/ckconfig`, migrate the module declaration to
`go.maximumdirect.net/ckconfig`. Update all owned imports, tests, and the

View File

@@ -26,8 +26,8 @@ and try completing `core-example report d` or `core-example ws gr`.
Compatible integration factories also return `commandkit.Command` and can be
passed directly to `New` beside `commandkit.Alias` or flag-alias declarations.
The current integrations still use the old core identity; the planned matched
vanity-path releases will use the new core identity. For a
The ckconfig candidate uses the new core identity; ckprompt will use it in its
planned matched release. For a
command-only `[]commandkit.Command`, convert its elements into a
`[]commandkit.Declaration` before appending routing rules; Go cannot expand the
command slice as `...commandkit.Declaration`. The

View File

@@ -7,9 +7,8 @@ itself.
## Module
The module path is
`gitea.maximumdirect.net/eric/CommandKit/integrations/ckconfig`. Its first
release is prepared as `v0.1.0`. It uses the core `commandkit` package and
The module path is `go.maximumdirect.net/ckconfig`. Version v0.2.0 uses
`go.maximumdirect.net/commandkit v0.3.0` and
ConfigKit; it does not import PromptKit. See the
[consumer guide](https://gitea.maximumdirect.net/eric/CommandKit/src/branch/main/docs/consumers/guide.md#configkit-scopes)
for exact callback and lifetime contracts.

View File

@@ -10,8 +10,8 @@ import (
"strings"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
type adapterSettings struct {

View File

@@ -7,8 +7,8 @@ import (
"strings"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
func TestComparisonCapabilitiesAreIndependentAndCaptured(t *testing.T) {

View File

@@ -6,8 +6,8 @@ import (
"strings"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
func TestComparisonSelectionInheritsFieldsIndependently(t *testing.T) {

View File

@@ -8,8 +8,8 @@ import (
"strings"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
func TestComparisonPreparesEqualSelectionsWithSeparateTypedInputs(t *testing.T) {

View File

@@ -1,6 +1,6 @@
package ckconfig
import commandkit "gitea.maximumdirect.net/eric/CommandKit"
import commandkit "go.maximumdirect.net/commandkit"
func completionChoices(values ...string) commandkit.CompletionHint {
choices := make([]commandkit.CompletionChoice, len(values))

View File

@@ -7,8 +7,8 @@ import (
"strings"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
func TestCompletionUsesInstalledScopeCapabilitiesWithoutAcquisition(t *testing.T) {

View File

@@ -7,8 +7,8 @@ import (
"io"
"strconv"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
// FromConfigKit adapts a typed ConfigKit loader to all five native

View File

@@ -4,8 +4,8 @@ import (
"context"
"io"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
// Selection carries the configuration and overlay choices supplied for a

View File

@@ -9,8 +9,8 @@ import (
"strings"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
func TestWithScopeErrorCopiesAndRetainsCauses(t *testing.T) {

View File

@@ -4,7 +4,7 @@ import (
"errors"
"fmt"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
commandkit "go.maximumdirect.net/commandkit"
)
func runConfigDiff[I, S any](invocation commandkit.Invocation, plan *configOperationPlan[I, S], state S) commandkit.Outcome {

View File

@@ -9,8 +9,8 @@ import (
"strings"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
"go.yaml.in/yaml/v4"
)

View File

@@ -1,4 +1,5 @@
// Package ckconfig provides CommandKit's optional ConfigKit integration. Its
// Package ckconfig, provided by go.maximumdirect.net/ckconfig, provides
// CommandKit's optional ConfigKit integration. Its
// canonical Command declaration installs the standard config command family
// through the core commandkit package. Applications can install CommandKit
// RoutingRule declarations alongside it through commandkit.New or

View File

@@ -153,16 +153,29 @@ License and notices: [MIT](licenses/MIT.txt) |
## ReleaseKit
Selected module: `gitea.maximumdirect.net/eric/ReleaseKit` at `v0.4.2` (transitive Go tool requirement; not a runtime import).
Selected module: `gitea.maximumdirect.net/eric/ReleaseKit` at `v0.4.1` (transitive Go tool requirement; not a runtime import).
Copyright (C) 2026 Eric Rakestraw
SPDX-License-Identifier: LGPL-3.0-or-later
License and notices: [LGPL v3.0](../../LICENSE) |
[LICENSE](https://gitea.maximumdirect.net/eric/ReleaseKit/src/commit/7d033c5ca1c95aec7db9690293638a0a1ac887b8/LICENSE).
[LICENSE](https://gitea.maximumdirect.net/eric/ReleaseKit/src/commit/2d5a8110c61e31daf8698766114ae305d0e0e469/LICENSE).
[Source](https://gitea.maximumdirect.net/eric/ReleaseKit/src/commit/7d033c5ca1c95aec7db9690293638a0a1ac887b8).
[Source](https://gitea.maximumdirect.net/eric/ReleaseKit/src/commit/2d5a8110c61e31daf8698766114ae305d0e0e469).
## ReleaseKit (vanity module)
Selected module: `go.maximumdirect.net/releasekit` at `v0.9.0` (transitive Go tool requirement; not a runtime import).
Copyright (C) 2026 Eric Rakestraw
SPDX-License-Identifier: LGPL-3.0-or-later
License and notices: [LGPL v3.0](../../LICENSE) |
[LICENSE](https://forge.maximumdirect.net/base-layer/releasekit/src/commit/2180aa868ec2caa95fc8279fd59d5f0ebac41bd4/LICENSE).
[Source](https://forge.maximumdirect.net/base-layer/releasekit/src/commit/2180aa868ec2caa95fc8279fd59d5f0ebac41bd4).
## Goldmark

View File

@@ -0,0 +1,35 @@
# CommandKit ckconfig v0.2.0
## Summary
CommandKit ckconfig v0.2.0 moves the integration to
`go.maximumdirect.net/ckconfig` and uses `go.maximumdirect.net/commandkit v0.3.0`
with ConfigKit v0.8.0. It adopts core's invocation reporting and completion
contracts while retaining ConfigKit-owned inspection and comparison behavior.
## Migration
Replace imports of `gitea.maximumdirect.net/eric/CommandKit/integrations/ckconfig`
with `go.maximumdirect.net/ckconfig`, and update core imports to
`go.maximumdirect.net/commandkit`. Select ckconfig v0.2.0 and core v0.3.0
as a matched set. Old and new core paths have distinct Go type identities.
Applications also using PromptKit should move to the forthcoming matched
`go.maximumdirect.net/ckprompt v0.2.0` release.
Handlers use `Invocation.Reporter()` for output and categorized messages;
terminal failures carry an explanation and optional cause. The integration
submits provider diagnostics through the invocation reporter, respecting shared
reporting flags. Update callers that used `Invocation.Streams`,
`Outcome.Diagnostics`, or the old error-first failure API as described in the
[core migration guide](https://forge.maximumdirect.net/base-layer/commandkit/src/tag/v0.3.0/docs/consumers/guide.md#invocation-reporting).
The standard config commands also provide completion hints for applicable
selectors and file paths when the application installs core's completion command.
Go 1.26.0 remains the consumer minimum. Importing ckconfig does not install
commands; pass its declarations to `commandkit.New` or `App.Register`.
See the [module README](https://forge.maximumdirect.net/base-layer/commandkit/src/tag/integrations/ckconfig/v0.2.0/integrations/ckconfig/README.md)
and [consumer guide](https://forge.maximumdirect.net/base-layer/commandkit/src/tag/integrations/ckconfig/v0.2.0/docs/consumers/guide.md#configkit-scopes).
[COPYRIGHT](https://forge.maximumdirect.net/base-layer/commandkit/src/tag/integrations/ckconfig/v0.2.0/integrations/ckconfig/COPYRIGHT) |
[LICENSE](https://forge.maximumdirect.net/base-layer/commandkit/src/tag/integrations/ckconfig/v0.2.0/integrations/ckconfig/LICENSE) |
[ATTRIBUTION](https://forge.maximumdirect.net/base-layer/commandkit/src/tag/integrations/ckconfig/v0.2.0/integrations/ckconfig/docs/oss/attribution.md)

View File

@@ -1,5 +1,8 @@
# Simple consumer
This example imports `go.maximumdirect.net/ckconfig` and
`go.maximumdirect.net/commandkit`; use ckconfig v0.2.0 with core v0.3.0.
Run the maintained example with:
```sh

View File

@@ -7,9 +7,9 @@ import (
"os"
"strconv"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
"gitea.maximumdirect.net/eric/CommandKit/integrations/ckconfig"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
"go.maximumdirect.net/ckconfig"
commandkit "go.maximumdirect.net/commandkit"
)
type appConfiguration struct {

View File

@@ -7,8 +7,8 @@ import (
"strings"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
"gitea.maximumdirect.net/eric/CommandKit/integrations/ckconfig"
"go.maximumdirect.net/ckconfig"
commandkit "go.maximumdirect.net/commandkit"
"go.yaml.in/yaml/v4"
)

View File

@@ -5,8 +5,8 @@ import (
"fmt"
"io"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
type explanationReport struct {

View File

@@ -9,8 +9,8 @@ import (
"sort"
"strings"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
type scopeMetadata struct {

View File

@@ -9,8 +9,8 @@ import (
"strings"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
func TestScopeDiscoveryIsOrderedAndDoesNotUseSuiteFactories(t *testing.T) {

View File

@@ -1,9 +1,8 @@
module gitea.maximumdirect.net/eric/CommandKit/integrations/ckconfig
module go.maximumdirect.net/ckconfig
go 1.26.0
require (
gitea.maximumdirect.net/eric/CommandKit v0.2.0
gitea.maximumdirect.net/eric/ConfigKit v0.8.0
go.yaml.in/yaml/v4 v4.0.0-rc.6
)
@@ -12,4 +11,5 @@ require (
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/spf13/cobra v1.10.1 // indirect
github.com/spf13/pflag v1.0.9 // indirect
go.maximumdirect.net/commandkit v0.3.0
)

View File

@@ -1,5 +1,3 @@
gitea.maximumdirect.net/eric/CommandKit v0.2.0 h1:UNBjSq6XDZHdPqvZLOL3N5R1E1ol0jnfldgradU7eqw=
gitea.maximumdirect.net/eric/CommandKit v0.2.0/go.mod h1:47DQ6Mo/yZqUVn5PAFRmPck91Zhf1jfaHDMoEZvUzsQ=
gitea.maximumdirect.net/eric/ConfigKit v0.8.0 h1:xCIhYnOHjw7rFvB+vIremPKGeROOxKTomnUEUipuQno=
gitea.maximumdirect.net/eric/ConfigKit v0.8.0/go.mod h1:C82sbyKHYMV1OwaD2GJanFrwTfcZfjlW2JsGze5b0kA=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
@@ -10,6 +8,8 @@ github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
go.maximumdirect.net/commandkit v0.3.0 h1:RCmg2GS8uzlLSJCIqarpn1uFDec0W3ylNNRRPT6kUFE=
go.maximumdirect.net/commandkit v0.3.0/go.mod h1:ZS98DewKNVBygKVDoh5MFD09CnPlP37dS9pVsID5Eoc=
go.yaml.in/yaml/v4 v4.0.0-rc.6 h1:1h7H1ohdUh93/FyE4YaDa1Zh64K6VVbjF4K6WUxMtH4=
go.yaml.in/yaml/v4 v4.0.0-rc.6/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

View File

@@ -4,8 +4,8 @@ import (
"fmt"
"strings"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
)
type configCommandInput[I, S any] struct {

View File

@@ -4,7 +4,7 @@ import (
"fmt"
"io"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
commandkit "go.maximumdirect.net/commandkit"
)
func runConfigOperation[I, S any](invocation commandkit.Invocation, operation Operation, input *configCommandInput[I, S]) commandkit.Outcome {

View File

@@ -6,7 +6,7 @@ import (
"io"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
commandkit "go.maximumdirect.net/commandkit"
)
func TestBufferedReportCancellationBeforeDelivery(t *testing.T) {

View File

@@ -7,7 +7,7 @@ import (
"strconv"
"unicode"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
commandkit "go.maximumdirect.net/commandkit"
)
type effectiveDocument struct {

View File

@@ -6,8 +6,8 @@ import (
"io"
"strconv"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
"go.yaml.in/yaml/v4"
)

View File

@@ -8,8 +8,8 @@ import (
"strings"
"testing"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
configkit "gitea.maximumdirect.net/eric/ConfigKit"
commandkit "go.maximumdirect.net/commandkit"
"go.yaml.in/yaml/v4"
)

View File

@@ -6,7 +6,7 @@ import (
"io"
"strings"
commandkit "gitea.maximumdirect.net/eric/CommandKit"
commandkit "go.maximumdirect.net/commandkit"
"go.yaml.in/yaml/v4"
)