Skip to content

Commit 1491adb

Browse files
committed
refactor: simplify feature flag handling by removing meta feature flags
1 parent c5b38c3 commit 1491adb

4 files changed

Lines changed: 15 additions & 38 deletions

File tree

internal/ghmcp/server.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -344,12 +344,9 @@ func RunStdioServer(cfg StdioServerConfig) error {
344344

345345
// createFeatureChecker returns a FeatureFlagChecker that resolves features
346346
// using the centralized ResolveFeatureFlags function. For the local server,
347-
// features are resolved once at startup from --features CLI flag and meta flags.
347+
// features are resolved once at startup from --features CLI flag and insiders mode.
348348
func createFeatureChecker(enabledFeatures []string, insidersMode bool) inventory.FeatureFlagChecker {
349-
featureSet := github.ResolveFeatureFlags(
350-
enabledFeatures,
351-
github.MetaFeatureFlagsForInsiders(insidersMode)...,
352-
)
349+
featureSet := github.ResolveFeatureFlags(enabledFeatures, insidersMode)
353350
return func(_ context.Context, flagName string) (bool, error) {
354351
return featureSet[flagName], nil
355352
}

pkg/github/feature_flags.go

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ const FeatureFlagCSVOutput = "csv_output"
1111
// FeatureFlagIFCLabels is the feature flag name for IFC security labels in tool results.
1212
const FeatureFlagIFCLabels = "ifc_labels"
1313

14-
// MetaFeatureFlagInsiders is the meta feature flag name for insiders mode.
15-
const MetaFeatureFlagInsiders = "insiders"
16-
1714
// AllowedFeatureFlags is the allowlist of feature flags that can be enabled
1815
// by users via --features CLI flag or X-MCP-Features HTTP header.
1916
// Only flags in this list are accepted; unknown flags are silently ignored.
@@ -35,41 +32,25 @@ var InsidersFeatureFlags = []string{
3532
FeatureFlagIFCLabels,
3633
}
3734

38-
// MetaFeatureFlags maps meta feature flags to the concrete feature flags they enable.
39-
var MetaFeatureFlags = map[string][]string{
40-
MetaFeatureFlagInsiders: InsidersFeatureFlags,
41-
}
42-
4335
// FeatureFlags defines runtime feature toggles that adjust tool behavior.
4436
type FeatureFlags struct {
4537
LockdownMode bool
46-
47-
// Deprecated: insiders is resolved into concrete feature flags.
48-
InsidersMode bool
49-
}
50-
51-
// MetaFeatureFlagsForInsiders returns the meta feature flags enabled by insiders mode.
52-
func MetaFeatureFlagsForInsiders(enabled bool) []string {
53-
if !enabled {
54-
return nil
55-
}
56-
return []string{MetaFeatureFlagInsiders}
5738
}
5839

5940
// ResolveFeatureFlags computes the effective set of enabled feature flags by:
6041
// 1. Taking explicitly enabled features validated against AllowedFeatureFlags
61-
// 2. Adding concrete features expanded from enabled meta feature flags
42+
// 2. Adding features enabled by insiders mode from InsidersFeatureFlags
6243
//
6344
// Returns a set (map) for O(1) lookup by the feature checker.
64-
func ResolveFeatureFlags(enabledFeatures []string, enabledMetaFeatures ...string) map[string]bool {
45+
func ResolveFeatureFlags(enabledFeatures []string, insidersMode bool) map[string]bool {
6546
effective := make(map[string]bool)
6647
for _, f := range enabledFeatures {
6748
if slices.Contains(AllowedFeatureFlags, f) {
6849
effective[f] = true
6950
}
7051
}
71-
for _, metaFeature := range enabledMetaFeatures {
72-
for _, f := range MetaFeatureFlags[metaFeature] {
52+
if insidersMode {
53+
for _, f := range InsidersFeatureFlags {
7354
effective[f] = true
7455
}
7556
}

pkg/github/feature_flags_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ func TestResolveFeatureFlags(t *testing.T) {
140140
tests := []struct {
141141
name string
142142
enabledFeatures []string
143-
metaFeatures []string
143+
insidersMode bool
144144
expectedFlags []string
145145
unexpectedFlags []string
146146
}{
@@ -156,15 +156,15 @@ func TestResolveFeatureFlags(t *testing.T) {
156156
expectedFlags: []string{MCPAppsFeatureFlag},
157157
},
158158
{
159-
name: "insiders meta feature enables insiders flags",
159+
name: "insiders mode enables insiders flags",
160160
enabledFeatures: nil,
161-
metaFeatures: []string{MetaFeatureFlagInsiders},
161+
insidersMode: true,
162162
expectedFlags: InsidersFeatureFlags,
163163
},
164164
{
165-
name: "insiders meta feature enables internal-only flags",
165+
name: "insiders mode enables internal-only flags",
166166
enabledFeatures: nil,
167-
metaFeatures: []string{MetaFeatureFlagInsiders},
167+
insidersMode: true,
168168
expectedFlags: []string{FeatureFlagIFCLabels},
169169
},
170170
{
@@ -187,15 +187,15 @@ func TestResolveFeatureFlags(t *testing.T) {
187187
{
188188
name: "explicit plus insiders deduplicates",
189189
enabledFeatures: []string{MCPAppsFeatureFlag},
190-
metaFeatures: []string{MetaFeatureFlagInsiders},
190+
insidersMode: true,
191191
expectedFlags: InsidersFeatureFlags,
192192
},
193193
}
194194

195195
for _, tt := range tests {
196196
t.Run(tt.name, func(t *testing.T) {
197197
t.Parallel()
198-
result := ResolveFeatureFlags(tt.enabledFeatures, tt.metaFeatures...)
198+
result := ResolveFeatureFlags(tt.enabledFeatures, tt.insidersMode)
199199
for _, flag := range tt.expectedFlags {
200200
assert.True(t, result[flag], "expected flag %q to be enabled", flag)
201201
}

pkg/http/server.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,16 +232,15 @@ func initGlobalToolScopeMap(t translations.TranslationHelperFunc) error {
232232
}
233233

234234
// createHTTPFeatureChecker creates a feature checker that resolves static CLI
235-
// features plus per-request header features and meta features.
235+
// features plus per-request header features and insiders mode.
236236
func createHTTPFeatureChecker(enabledFeatures []string, insidersMode bool) inventory.FeatureFlagChecker {
237237
return func(ctx context.Context, flag string) (bool, error) {
238238
headerFeatures := ghcontext.GetHeaderFeatures(ctx)
239239
features := make([]string, 0, len(enabledFeatures)+len(headerFeatures))
240240
features = append(features, enabledFeatures...)
241241
features = append(features, headerFeatures...)
242242

243-
metaFeatures := github.MetaFeatureFlagsForInsiders(insidersMode || ghcontext.IsInsidersMode(ctx))
244-
effective := github.ResolveFeatureFlags(features, metaFeatures...)
243+
effective := github.ResolveFeatureFlags(features, insidersMode || ghcontext.IsInsidersMode(ctx))
245244
return effective[flag], nil
246245
}
247246
}

0 commit comments

Comments
 (0)