# contexts: clear current_context on delete; drop dead comment

`e26a233`→[main](/content/gh/entireio/cli/commits/main/index.html)·

toothbrush·1mo ago·3 files·+14 added/-20 removed

- Delete now always clears current_context when the deleted context was active, instead of advancing to the first remaining context. Deleting your active login must never silently switch you to another identity.
- Remove the leftover "legacy cluster_contexts used to live here" note; comments describe today's behavior only.

RemoveCurrentContext relies on Delete's clear and drops its redundant reassignment.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

## Sessions

49c99a4a7077View transcript

[?\
Debug Cluster Context Git Remote LookupClaude Code·Opus 4.8[1m]·1 step](/content/gh/entireio/cli/session/2946988e-fe9b-4ca5-8f30-3c60037a41d9#timeline-49c99a4a7077/index.html)

## Changes

3

- cmd/entire/cli/auth

- Mcontext_store.go+4/-6

- internal/entireclient/contexts

- Mcontexts.go+4/-11

- Mcontexts_test.go+6/-3

```go
29 unmodified lines

30
31
32
33
34
33
34
35
36
37
5 unmodified lines

43
44
45
46
47
48
47
48
49
50
49
50
51

29 unmodified lines

// RemoveCurrentContext deletes the active context from contexts.json and
// its keyring token, advancing current_context to whatever remains. It is
// a no-op (returns nil) when there is no current context. Used by logout.
// its keyring token, clearing current_context. It is a no-op (returns nil)
// when there is no current context. Used by logout.
func RemoveCurrentContext() error {
	// Read-modify-write in a single locked Modify so the context we delete
	// is exactly the one we capture the keychain slot from (separate Load +
5 unmodified lines

return false, nil
	}
	svc, handle = current.KeychainService, current.Handle
	// Delete clears current_context because we're deleting the active
	// one — logged out means logged out, no switch to another identity.
	f.Delete(current.Name)
	// Delete advances current_context to a surviving context; for logout
	// that would silently re-authenticate as another account. Leave no
	// active context — logged out means logged out.
	f.CurrentContext = ""
	return true, nil
}); err != nil {
	return fmt.Errorf("remove current context: %w", err)
}
```

Mcmd/entire/cli/auth/context_store.go+4/-6

```
51 unmodified lines

52
53
54
55
56
57
58
59
60
55
56
57
108 unmodified lines

166
167
168
175
176
169
170
171
172
173
174
175
4 unmodified lines

180
181
182
187
188
189
183
184
185

51 unmodified lines

// Contexts is the list of stored credentials. Order is preserved on
	// disk so list output stays stable across saves.
	Contexts []*Context `json:"contexts,omitempty"`

// NOTE: a legacy "cluster_contexts" map used to live here, binding a
	// cluster host to one context name. It's gone — cluster cores are cached
	// in discovery.ClusterCoresCache and the account is chosen fresh per
	// operation. json.Unmarshal ignores the obsolete key, so an old file
	// loads cleanly; the key drops out on the next write.
}

// FilePath returns $configDir/contexts.json after ensuring the directory
108 unmodified lines

}

// Delete drops the context with the given name. If the deleted context
// was current, the current pointer advances to whatever remains (or empty).
// Delete drops the context with the given name. If it was the current
// context, current_context is cleared — never reassigned to another
// context, so deleting your active login never silently switches you to a
// different identity.
func (f *File) Delete(name string) {
	if f == nil || name == "" {
		return
	}
	if f.CurrentContext == name {
		f.CurrentContext = ""
		if len(f.Contexts) > 0 {
			f.CurrentContext = f.Contexts[0].Name
		}
	}
}
```

Minternal/entireclient/contexts/contexts.go+4/-11

```
139 unmodified lines

140
141
142
143
143
144
145
146
2 unmodified lines

149
150
151
152
153
152
153
154
155
156
157
158
159

139 unmodified lines

}
}

func TestDelete_OfCurrentAdvancesPointer(t *testing.T) {
func TestDelete_OfCurrentClearsCurrent(t *testing.T) {
f := &contexts.File{
	CurrentContext: "first",
	Contexts: []*contexts.Context{
2 unmodified lines
	},
}
f.Delete("first")
if f.CurrentContext != "second" {
				
t.Errorf("after deleting current, CurrentContext = %q, want next remaining (%q)", f.CurrentContext, "second")
if f.CurrentContext != "" {
				
t.Errorf("after deleting current, CurrentContext = %q, want empty (no fallback to another identity)", f.CurrentContext)
}
if f.Find("second") == nil {
				
t.Error("Delete dropped the unrelated remaining context")
}
}
```

Minternal/entireclient/contexts/contexts_test.go+6/-3

```
