Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
5aecf8c
feat: add kimi pinned project research collector
777genius Oct 25, 2026
fc2302e
Merge reviewed nested collector selection fix into kimi research
777genius Oct 25, 2026
ac3a7e5
test: observe Kimi native project trust and named MCP servers
777genius Oct 25, 2026
717f041
fix: admit the observed Kimi Code 2.3.2 project path
777genius Oct 26, 2026
1d80da0
test(kimi): exercise installed project lifecycle through native API
777genius Oct 26, 2026
7c43e77
merge: align Kimi lifecycle with current program runtime gates
777genius Oct 26, 2026
71651af
test: preserve native validation contracts and close errors
777genius Oct 26, 2026
ccc6e97
fix(kimi): complete selected project version preflight and bounded na…
777genius Oct 26, 2026
e9f0099
test(kimi): independently validate installed native package authority
777genius Oct 26, 2026
725ea29
Merge current program CI scheduling into Kimi project qualification
777genius Oct 26, 2026
fbc75d2
test(kimi): validate current state schema in native project proof
777genius Oct 27, 2026
389206f
test(project): use native absolute fixture paths on Windows
777genius Oct 27, 2026
a4a211d
test(kimi): use context-aware HTTP request and listener in native con…
777genius Oct 27, 2026
b8593f5
docs(kimi): plan finite private collector failure diagnostics
777genius Oct 27, 2026
55f5d84
test(kimi): expose only finite private failure stages
777genius Oct 27, 2026
5a3ab87
docs: plan genuine Kimi observer host marker handoff
777genius Oct 27, 2026
705fa42
test: forward genuine hosted markers to Kimi observer
777genius Oct 27, 2026
cef30c1
docs: plan nonmutating Kimi installed profile context
777genius Oct 27, 2026
b7235fb
test: reuse held existing profile for Kimi observers
777genius Oct 27, 2026
6d419a2
docs: plan exact Kimi observer identity role parity
777genius Oct 27, 2026
499a694
test: preserve Kimi observer identity role parity
777genius Oct 27, 2026
02e645b
docs: plan actual Kimi snapshot seam and finite refusal
777genius Oct 27, 2026
1c0dcd1
test: exercise Kimi snapshot adapter and finite context refusal
777genius Oct 27, 2026
ccb529d
docs: restore reviewed private Kimi fixture root plan
777genius Oct 27, 2026
91a3c54
test: author exact private Kimi fixture root before baselines
777genius Oct 27, 2026
cb0fd25
docs: plan exact Kimi native skill and turn expectations
codex Oct 27, 2026
33b5d73
test: bind Kimi native user skills to exact plugin namespace
codex Oct 27, 2026
659278e
test: require the Kimi fresh-session first turn identity
codex Oct 27, 2026
03d7c24
docs: record exact Kimi expectation source and check closure
codex Oct 27, 2026
4b42010
test(kimi): validate the exact repeated-add direct result
codex Oct 27, 2026
a58aba7
test(kimi): retain finite facts at approval refusal
codex Oct 27, 2026
29f93ab
Merge commit 'a412ba5e137fdcb7e004393229b323211ed746e1' into fix/kimi…
codex Oct 27, 2026
b2bb2b7
docs(kimi): record current-base inert validation
codex Oct 27, 2026
970b8d6
docs(kimi): approve explicit scoped repair selection plan
codex Oct 27, 2026
e113f00
test(kimi): reproduce intact project repair selection loss
codex Oct 27, 2026
f4aa9ad
docs(kimi): approve finite approval polling refusal diagnostic
codex Oct 27, 2026
8311c8e
test(kimi): retain finite approval polling refusal cause
codex Oct 27, 2026
25673dc
docs(kimi): record reviewed poll refusal diagnostic validation
codex Oct 27, 2026
a87dd94
docs(kimi): record reviewed session cache metadata plan
777genius Oct 27, 2026
f09fbb1
fix(kimi): retain explicitly scoped MCP selection during repair
777genius Oct 27, 2026
20921c0
test(kimi): admit canonical session cache metadata without widening t…
777genius Oct 27, 2026
30f5dfe
test(kimi): keep inert cache request helper compatible with Go 1.22
777genius Oct 27, 2026
c1a3720
merge(kimi): compose reviewed scoped selection and provider capture f…
777genius Oct 27, 2026
9e9779f
docs(kimi): record reviewed composed corrections and actual validation
777genius Oct 27, 2026
22aa3e4
docs(kimi): freeze finite native completion amendment
777genius Oct 27, 2026
19f64f9
test(kimi): verify finite native history and completion evidence
777genius Oct 27, 2026
9a642d1
test(kimi): close native completion reader parity gaps
777genius Oct 27, 2026
569d252
test(kimi): enforce exact byte and numeric completion bounds
777genius Oct 27, 2026
5d8229b
test(kimi): use tagged metadata contract dispatch
777genius Oct 27, 2026
eb69a29
docs(kimi): record finite completion reviews and measured gates
777genius Oct 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
208 changes: 208 additions & 0 deletions cli/cmd/agentplugins/devin_project_version_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
package main

import (
"context"
"errors"
"fmt"
"path/filepath"
"reflect"
"strings"
"testing"

"github.com/777genius/plugin-kit-ai/cli/internal/agentpluginscli"
"github.com/777genius/plugin-kit-ai/install/integrationctl/agentplugins/domain"
)

// Plain discovery has no version and no Cascade profile. Only the explicitly
// selected inert callback can supply the observed current Devin version.
type devinProjectVersionDetector struct {
executable string
targeted [][]domain.ClientID
broad int
probeError error
}

func (d *devinProjectVersionDetector) Detect(context.Context) ([]domain.DetectedClient, error) {
return []domain.DetectedClient{{ClientID: domain.ClientWindsurf, ExecutablePath: d.executable, Status: domain.DetectionDetected}}, nil
}

func (d *devinProjectVersionDetector) DetectWithVersionProbe(ctx context.Context) ([]domain.DetectedClient, error) {
d.broad++
rows, err := d.Detect(ctx)
if err != nil {
return rows, err
}
return rows, fmt.Errorf("fixture refuses broad version execution")
}

func (d *devinProjectVersionDetector) DetectTargetsWithVersionProbe(ctx context.Context, targets []domain.ClientID) ([]domain.DetectedClient, error) {
d.targeted = append(d.targeted, append([]domain.ClientID(nil), targets...))
if d.probeError != nil {
return nil, d.probeError
}
clients, err := d.Detect(ctx)
if err != nil {
return nil, err
}
clients[0].Version = "3000.11.205"
return clients, nil
}

func (d *devinProjectVersionDetector) assertCalls(t *testing.T, before, added int) {
t.Helper()
if d.broad != 0 || len(d.targeted) != before+added {
t.Fatalf("Devin version execution differs: broad=%d targeted=%v, want %d new selected calls", d.broad, d.targeted, added)
}
for _, targets := range d.targeted {
if !reflect.DeepEqual(targets, []domain.ClientID{domain.ClientWindsurf}) {
t.Fatalf("unselected client reached Devin version execution: %v", targets)
}
}
}

func configureDevinVersionJourney(app agentpluginscli.App, detector *devinProjectVersionDetector) agentpluginscli.App {
app.Detector = detector
compose := app.ForScope
app.ForScope = func(scope domain.InstallScope, root string) (agentpluginscli.App, error) {
selected, err := compose(scope, root)
if err != nil {
return selected, err
}
return configureDevinVersionJourney(selected, detector), nil
}
return app
}

func devinVersionOwned(t *testing.T, f devinProjectJourney, skill string, saved bool) (domain.Installation, domain.ClientBinding) {
t.Helper()
state := f.state(t, f.a)
receipts := 0
if saved {
receipts = 1
}
if len(state.Installations) != 1 || len(state.Installations[0].Clients) != 1 || len(state.EnvironmentReceipts) != receipts {
t.Fatalf("Devin version lifecycle lost exact local/saved ownership: %+v", state)
}
installation := state.Installations[0]
for _, binding := range installation.Clients {
if binding.ClientID != "windsurf" || binding.Scope != "project" || binding.NativeProfileRoot != f.devinRoot(f.a) || binding.Activation != domain.ActivationPrepared || binding.Verification != domain.VerificationInstalled {
t.Fatalf("version observation changed Devin project authority: %+v", binding)
}
for _, root := range []string{binding.TargetLocator, f.devinRoot(f.a)} {
if projectJourneyRead(t, filepath.Join(root, "skills", "docs", "SKILL.md")) != skill {
t.Fatal("Devin managed/native selected bytes differ")
}
}
return installation, binding
}
t.Fatal("Devin project binding missing")
return domain.Installation{}, domain.ClientBinding{}
}

func TestProjectDevinEmptyVersionSelectedLifecycle(t *testing.T) {
for _, saved := range []bool{false, true} {
name := "direct-local"
if saved {
name = "saved-tls-zip"
}
t.Run(name, func(t *testing.T) {
transport := newProjectJourneyTransport(t, "zip")
devinProjectCommitSource(t, transport, projectJourneySkill, "https://managed.test/v1")
f := newDevinProjectJourney(t, transport)
detector := &devinProjectVersionDetector{executable: filepath.Join(f.home, ".devin", "devin")}
f.app = configureDevinVersionJourney(f.app, detector)
userBefore := securityFixtureTree(t, f.devinRoot(""))
add := []string{"add", transport.repo, "--no-save", "--target", "devin"}
selector := "docs"
if saved {
add = []string{"add", transport.endpoint, "--alias", "docs", "--target", "windsurf"}
}
for _, root := range []string{f.a, f.b} {
before := len(detector.targeted)
f.run(t, root, add...)
detector.assertCalls(t, before, 1)
}
installation, binding := devinVersionOwned(t, f, projectJourneySkill, saved)
if !saved {
selector = installation.InstallationID
}
// This source uses remote MCP configuration and allocates no plugin
// data receipt. Preserve an existing unrelated data member instead.
dataPath := filepath.Join(f.namespace(f.a), "plugin-data", "foreign", "keep.txt")
projectJourneyWrite(t, dataPath, "retained unrelated data\n")
bBefore := securityFixtureTree(t, f.b)
preserved := func() {
t.Helper()
if !reflect.DeepEqual(userBefore, securityFixtureTree(t, f.devinRoot(""))) || !reflect.DeepEqual(bBefore, securityFixtureTree(t, f.b)) {
t.Fatal("version-assisted A lifecycle changed original user or project B")
}
if projectJourneyRead(t, dataPath) != "retained unrelated data\n" {
t.Fatal("version-assisted Devin lifecycle changed unrelated persistent data")
}
}
if saved {
before := len(detector.targeted)
state := projectJourneyRead(t, filepath.Join(f.namespace(f.a), "state-v2.json"))
f.run(t, f.a, "deps", "sync", "--locked", "--yes")
detector.assertCalls(t, before, 0)
if state != projectJourneyRead(t, filepath.Join(f.namespace(f.a), "state-v2.json")) {
t.Fatal("unchanged Devin reconciliation changed ownership state")
}
}
for _, args := range [][]string{{"list"}, {"info", installation.InstallationID}, {"doctor"}} {
before := len(detector.targeted)
f.run(t, f.a, args...)
detector.assertCalls(t, before, 0)
}
for _, args := range [][]string{{"update", selector, "--target", "windsurf", "--dry-run"}, {"repair", installation.InstallationID, "--target", "windsurf", "--dry-run"}} {
before, snapshot := len(detector.targeted), securityFixtureTree(t, f.a)
_, err := f.execute(f.a, args...)
if err != nil && !strings.Contains(err.Error(), "explicitly selected primary") {
t.Fatal(err)
}
detector.assertCalls(t, before, 0)
if !reflect.DeepEqual(snapshot, securityFixtureTree(t, f.a)) {
t.Fatal("Devin dry-run changed project authority")
}
}
before := len(detector.targeted)
f.run(t, f.a, "repair", installation.InstallationID, "--target", "windsurf")
detector.assertCalls(t, before, 1)
devinVersionOwned(t, f, projectJourneySkill, saved)
preserved()
devinProjectCommitSource(t, transport, projectJourneyAdvancedSkill, "https://managed.test/v2")
before = len(detector.targeted)
f.run(t, f.a, "update", selector, "--target", "windsurf")
detector.assertCalls(t, before, 1)
updated, current := devinVersionOwned(t, f, projectJourneyAdvancedSkill, saved)
if updated.Source.TreeDigest == installation.Source.TreeDigest || current.ClientBindingID != binding.ClientBindingID || current.TargetLocator != binding.TargetLocator {
t.Fatal("Devin update lost source or selected binding identity")
}
if !reflect.DeepEqual(installation.DataReceipts, updated.DataReceipts) {
t.Fatal("remote MCP update changed the existing data receipt set")
}
preserved()
before = len(detector.targeted)
f.run(t, f.a, "remove", selector, "--target", "windsurf")
detector.assertCalls(t, before, 0)
projectJourneyAbsent(t, binding.TargetLocator, filepath.Join(f.devinRoot(f.a), "skills", "docs"))
preserved()
})
}
}

func TestProjectDevinEmptyVersionFailedObservationPreservesScopes(t *testing.T) {
transport := newProjectJourneyTransport(t, "zip")
devinProjectCommitSource(t, transport, projectJourneySkill, "https://managed.test/v1")
f := newDevinProjectJourney(t, transport)
detector := &devinProjectVersionDetector{executable: filepath.Join(f.home, ".devin", "devin"), probeError: errors.New("inert selected Devin version failure")}
f.app = configureDevinVersionJourney(f.app, detector)
a, b, user := securityFixtureTree(t, f.a), securityFixtureTree(t, f.b), securityFixtureTree(t, f.devinRoot(""))
if _, err := f.execute(f.a, "add", transport.repo, "--no-save", "--target", "windsurf"); err == nil || !strings.Contains(err.Error(), "inert selected Devin version failure") {
t.Fatalf("failed selected version was not surfaced: %v", err)
}
detector.assertCalls(t, 0, 1)
if !reflect.DeepEqual(a, securityFixtureTree(t, f.a)) || !reflect.DeepEqual(b, securityFixtureTree(t, f.b)) || !reflect.DeepEqual(user, securityFixtureTree(t, f.devinRoot(""))) {
t.Fatal("failed selected Devin version changed project or original-user authority")
}
}
89 changes: 89 additions & 0 deletions cli/cmd/agentplugins/project_kimi_intact_repair_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package main

import (
"encoding/json"
"os"
"path/filepath"
"reflect"
"strings"
"testing"

"github.com/777genius/plugin-kit-ai/install/integrationctl/agentplugins/domain"
)

// Exercise the public App with an intact recorded artifact. The existing
// damaged-pin repair regression deliberately takes a different selection path.
func TestProjectKimiPublicIntactRepairPreservesMCPSelection(t *testing.T) {
transport := newProjectJourneyTransport(t, "zip")
journey := newProjectJourney(t, transport)
user := filepath.Join(journey.home, ".kimi-code")
journey.app = configureProjectKimiJourney(journey.app, user, filepath.Join(journey.home, "kimi"))
for _, project := range []string{journey.a, journey.b} {
if err := os.Mkdir(filepath.Join(project, ".git"), 0700); err != nil {
t.Fatal(err)
}
projectJourneyWrite(t, filepath.Join(project, ".kimi-code", "mcp.json"), kimiIntactForeign)
journey.run(t, project, "add", transport.repo, "--target", "kimi", "--no-save")
}
projectJourneyWrite(t, filepath.Join(user, "mcp.json"), kimiIntactForeign)
installation, binding := projectKimiVersionOwned(t, journey, projectJourneySkill, false)
projectJourneyDataMarker(t, journey, journey.a, installation)
beforeUser, beforeB := securityFixtureTree(t, user), securityFixtureTree(t, journey.b)
mcp := filepath.Join(journey.a, ".kimi-code", "mcp.json")
skill := filepath.Join(journey.a, ".kimi-code", "skills", "docs", "SKILL.md")
beforeMCP, beforeSkill := projectJourneyRead(t, mcp), projectJourneyRead(t, skill)
output := journey.run(t, journey.a, "repair", installation.InstallationID, "--target", "kimi")
projectKimiIntactRepairSelection(t, output, installation.InstallationID)
if projectJourneyRead(t, mcp) != beforeMCP || projectJourneyRead(t, skill) != beforeSkill {
t.Fatal("intact public repair changed native skill or MCP bytes")
}
if strings.Contains(output, "not_in_recorded_delivery") || strings.Contains(output, "managed_component_removal_planned") {
t.Fatal("intact public repair discarded recorded project MCP selection")
}
after, repaired := projectKimiVersionOwned(t, journey, projectJourneySkill, false)
if after.InstallationID != installation.InstallationID || !reflect.DeepEqual(after.Source, installation.Source) || !reflect.DeepEqual(after.Package, installation.Package) || repaired.ClientBindingID != binding.ClientBindingID || repaired.PhysicalArtifact != binding.PhysicalArtifact || repaired.DataReceiptID != binding.DataReceiptID || !reflect.DeepEqual(repaired.NativeObjects, binding.NativeObjects) {
t.Fatal("intact repair changed held installation, binding, data or native ownership")
}
if !reflect.DeepEqual(beforeUser, securityFixtureTree(t, user)) || !reflect.DeepEqual(beforeB, securityFixtureTree(t, journey.b)) {
t.Fatal("intact repair changed original user or B")
}
for _, receipt := range installation.DataReceipts {
if projectJourneyRead(t, filepath.Join(receipt.Locator, "keep.txt")) != "retained environment data\n" {
t.Fatal("intact repair changed retained data")
}
}
}

func projectKimiIntactRepairSelection(t *testing.T, output, installationID string) {
t.Helper()
var envelope struct {
Data struct {
Targets []struct {
Target string `json:"target"`
Output struct {
Result struct {
InstallationID string `json:"installation_id"`
Plan domain.DeliveryPlan `json:"plan"`
} `json:"result"`
} `json:"output"`
} `json:"targets"`
} `json:"data"`
}
// The journey helper appends diagnostic stderr after the JSON stdout.
if err := json.NewDecoder(strings.NewReader(output)).Decode(&envelope); err != nil || len(envelope.Data.Targets) != 1 {
t.Fatal("public repair did not return one target result", err)
}
target := envelope.Data.Targets[0]
plan := target.Output.Result.Plan
if target.Target != "kimi" || target.Output.Result.InstallationID != installationID || plan.Scope != domain.ScopeProject || plan.ClientID != domain.ClientKimi {
t.Fatal("public repair changed explicit selected identity")
}
for _, component := range plan.Components {
if component.Kind == domain.ComponentMCPServer && component.Name == "docs" && component.Support == domain.SupportNative && component.Reason == "" {
return
}
}
t.Fatal("public repair did not preserve the recorded native MCP component")
}

const kimiIntactForeign = `{"mcpServers":{"foreign":{"transport":"http","url":"https://foreign.test/mcp","enabled":false}},"policy":"keep"}`
Loading
Loading