diff --git a/docs/roadmap/implementation.md b/docs/roadmap/implementation.md index fd101a8..a1e3cee 100644 --- a/docs/roadmap/implementation.md +++ b/docs/roadmap/implementation.md @@ -1,6 +1,6 @@ # PromptKit v0.18.0 implementation plan -Status: Stages 1–3 complete; Stages 4–7 remain. +Status: Stages 1–4 complete; Stages 5–7 remain. ## Authority and execution @@ -148,6 +148,8 @@ fixture bundle choices. Existing assertions can still fail until Stage 4. ## Stage 4: Refresh adapter expectations and bundle coverage +**Complete.** The ckprompt package suite passes with native normalized reports, and bundled profile and source evidence reach command output. + 1. Adjust configuration path expectations to the new list indexes and returned native normalized values/history. With the bundle enabled, derive relevant records/paths from the returned view rather than assuming application records diff --git a/integrations/ckprompt/adapters_test.go b/integrations/ckprompt/adapters_test.go index 6b38871..58d6c1c 100644 --- a/integrations/ckprompt/adapters_test.go +++ b/integrations/ckprompt/adapters_test.go @@ -15,6 +15,7 @@ import ( commandkit "go.maximumdirect.net/commandkit" configkit "go.maximumdirect.net/configkit" promptkit "go.maximumdirect.net/promptkit" + "go.yaml.in/yaml/v4" ) const adapterPrompt = `prompts: @@ -288,7 +289,7 @@ func TestConfigScopeUsesNativeInspectionFacetsAndInvocationValues(t *testing.T) t.Fatalf("scope acquisition = (%#v, %v), calls=%d", acquired, err, loaderCalls) } var effective bytes.Buffer - if err := acquired.Value.Effective.WriteEffective(&effective); err != nil || !strings.Contains(effective.String(), "briefing:") { + if err := acquired.Value.Effective.WriteEffective(&effective); err != nil || !strings.Contains(effective.String(), "id: briefing") { t.Fatalf("native effective report = %q, %v", effective.String(), err) } if sources := acquired.Value.Sources.Sources(); len(sources) == 0 || sources[0].ID == "" { @@ -299,6 +300,59 @@ func TestConfigScopeUsesNativeInspectionFacetsAndInvocationValues(t *testing.T) } } +func TestBundledRecordsAndSourcesReachCommandOutput(t *testing.T) { + engine := bundledEngine(t) + ctx := context.Background() + profiles, err := engine.ListProfiles(ctx) + if err != nil || len(profiles) == 0 { + t.Fatalf("native bundled profiles = %v, %v", profiles, err) + } + inspection, err := engine.InspectConfiguration() + if err != nil { + t.Fatal(err) + } + sources := inspection.Sources() + if len(sources) == 0 || sources[0].ID == "" { + t.Fatalf("native bundled sources = %#v", sources) + } + load := func(context.Context, ckconfig.Selection, struct{}, struct{}) (*promptkit.Engine, error) { + return engine, nil + } + app, err := commandkit.New(commandkit.Identity{Name: "bundle"}, Command(FromEngine(load)), ckconfig.Command(ckconfig.Suite[struct{}, struct{}]{Scopes: []ckconfig.Scope[struct{}, struct{}]{ConfigScope(load)}})) + if err != nil { + t.Fatal(err) + } + var out bytes.Buffer + result := app.Execute(ctx, []string{"promptkit", "list", "profiles", "--format", "yaml"}, commandkit.Streams{Out: &out, Err: io.Discard}) + var gotProfiles []string + if result.Kind != commandkit.OutcomeSuccess { + t.Fatalf("profile catalog = %#v: %s", result, out.String()) + } + if err := yaml.Unmarshal(out.Bytes(), &gotProfiles); err != nil || !slices.Contains(gotProfiles, profiles[0]) { + t.Fatalf("bundled profile %q missing from catalog %q: %v", profiles[0], out.String(), err) + } + out.Reset() + result = app.Execute(ctx, []string{"config", "sources", "--scope", "promptkit", "--format", "yaml"}, commandkit.Streams{Out: &out, Err: io.Discard}) + var report struct { + Sources []struct { + ID string `yaml:"id"` + Label string `yaml:"label"` + } `yaml:"sources"` + } + if result.Kind != commandkit.OutcomeSuccess { + t.Fatalf("source report = %#v: %s", result, out.String()) + } + if err := yaml.Unmarshal(out.Bytes(), &report); err != nil { + t.Fatal(err) + } + for _, source := range report.Sources { + if source.ID == sources[0].ID && source.Label == sources[0].Label { + return + } + } + t.Fatalf("bundled source %#v missing from report %q", sources[0], out.String()) +} + func TestConfigScopeRetainsNilLoaderIssueAfterCapabilitiesAreCleared(t *testing.T) { scope := ConfigScope[int, int](nil) if scope.Acquire != nil {