💻 Développement

feature-flags-manager

Gestion de feature toggles avec LaunchDarkly, OpenFeature et implémentations custom pour le déploiement progressif et l'A/B testing.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- feature-flags-manager --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } feature-flags-manager -Launch"

🚀 Déjà installé ?

claude "/feature-flags-manager"

Ou tapez /feature-flags-manager dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

LaunchDarklyOpenFeaturefeature toggledéploiement progressiffeature management .NETtoggles

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/dev-skills/feature-flags-manager ~/.claude/skills/

Source : dev-skills/feature-flags-manager

📖 Manuel

Feature Flags Manager

Workflow

  1. Choisir l'approche : SDK managé (LaunchDarkly, Unleash) ou custom avec OpenFeature.
  2. Configurer : provider, contexte d'évaluation, fallback values.
  3. Implémenter : évaluation des flags, segmentation, analytics.
  4. Gérer le cycle de vie : nettoyage, audit, monitoring.

OpenFeature (.NET Standard)

Configuration

// Installation : dotnet add package OpenFeature
// + un provider : dotnet add package LaunchDarkly.OpenFeature.ServerProvider

using OpenFeature;
using LaunchDarkly.OpenFeature.ServerProvider;

// Configurer le provider
var ldProvider = new Provider(Configuration.Builder("sdk-key").Build());
await Api.Instance.SetProviderAsync(ldProvider);

// Obtenir le client
var client = Api.Instance.GetClient();

Évaluation des flags

public class PaymentService
{
    private readonly IFeatureClient _featureClient;

    public PaymentService(IFeatureClient featureClient)
    {
        _featureClient = featureClient;
    }

    public async Task<PaymentResult> ProcessPayment(PaymentRequest request)
    {
        var context = EvaluationContext.Builder()
            .Set("userId", request.UserId)
            .Set("country", request.Country)
            .Set("plan", request.Plan)
            .Build();

        // Flag booléen
        var useNewEngine = await _featureClient.GetBooleanValueAsync(
            "new-payment-engine", false, context);

        if (useNewEngine)
            return await ProcessWithNewEngine(request);

        return await ProcessWithLegacyEngine(request);
    }

    public async Task<decimal> CalculateFees(decimal amount)
    {
        // Flag numérique (pourcentage de frais)
        var feePercentage = await _featureClient.GetDoubleValueAsync(
            "payment-fee-percentage", 2.5);

        return amount * (decimal)(feePercentage / 100);
    }

    public async Task<CheckoutConfig> GetCheckoutConfig()
    {
        // Flag JSON (configuration complexe)
        var config = await _featureClient.GetObjectValueAsync(
            "checkout-config",
            new Value(new Structure(new Dictionary<string, Value>
            {
                ["maxRetries"] = new Value(3),
                ["showPromo"] = new Value(false)
            })));

        return MapToCheckoutConfig(config);
    }
}

Microsoft Feature Management (.NET)

Configuration

// dotnet add package Microsoft.FeatureManagement.AspNetCore

builder.Services.AddFeatureManagement()
    .AddFeatureFilter<PercentageFilter>()
    .AddFeatureFilter<TimeWindowFilter>()
    .AddFeatureFilter<TargetingFilter>();

appsettings.json

{
  "FeatureManagement": {
    "NewDashboard": true,
    "BetaFeature": {
      "EnabledFor": [
        {
          "Name": "Targeting",
          "Parameters": {
            "Audience": {
              "Users": ["user1@company.com", "user2@company.com"],
              "Groups": [
                { "Name": "beta-testers", "RolloutPercentage": 100 },
                { "Name": "internal", "RolloutPercentage": 50 }
              ],
              "DefaultRolloutPercentage": 5
            }
          }
        }
      ]
    },
    "HolidayPromo": {
      "EnabledFor": [
        {
          "Name": "TimeWindow",
          "Parameters": {
            "Start": "2025-12-20T00:00:00Z",
            "End": "2025-12-31T23:59:59Z"
          }
        }
      ]
    }
  }
}

Utilisation

[FeatureGate("NewDashboard")]
[ApiController]
public class DashboardController : ControllerBase
{
    private readonly IFeatureManager _featureManager;

    [HttpGet]
    public async Task<IActionResult> GetDashboard()
    {
        if (await _featureManager.IsEnabledAsync("BetaFeature"))
        {
            return Ok(await GetBetaDashboard());
        }

        return Ok(await GetStandardDashboard());
    }
}

// Dans les vues Razor
@if (await FeatureManager.IsEnabledAsync("NewDashboard"))
{
    <NewDashboardComponent />
}

Cycle de vie des flags

PhaseActionResponsable
CréationDéfinir le flag, sa description et sa date d'expirationDev
DéveloppementImplémenter le code derrière le flagDev
RolloutActiver progressivement (1% → 10% → 50% → 100%)Product
StabilisationConfirmer que la fonctionnalité est stableÉquipe
NettoyageSupprimer le flag et le code conditionnelDev

Règles