功能标志清理工具

一个自动化清理代码中功能标志的工具,通过替换标志调用为最终值来减少技术债务并提高代码可维护性。

  • by hbg
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 hbg/mcp-flag-sweeper

使用说明

Flag Sweeper 🚩

问题

功能标志对于现代软件开发至关重要,但它们会造成隐藏的技术债务危机:

  • 🏴‍☠️ 死旗 在生产代码中保留数月/数年
  • 🔀 分支复杂性 使代码更难理解和维护
  • 🐛 Bug风险 从过时的条件逻辑
  • 🚀 性能开销 不必要的运行时检查
  • 😤 开发人员沮丧 导航被污染的代码库

现实: 大多数功能标志应该是临时的,但手动清理既费时又容易出错。

解决方案

一个模型上下文协议(MCP)服务器,它使用Polyglot Piranha自动清理代码库中的特征标志。根据中定义的标志状态将特征标志调用转换为最终值 flags.json.

🎯 愿景: 连接到实时功能标志系统(LaunchDarkly、Split.io、自定义实验MCP),以自动识别并安全地从代码库中删除稳定标志。

✨ 这有什么作用

之前(特色旗帜地狱):

if isFeatureEnabled("beta_ui") {
    renderBetaUI()
} else {
    renderOldUI()
}

if client.GetString("new_checkout") == "true" {
    processNewCheckout()
} else {
    processLegacyCheckout()
}

之后(干净、可维护的代码):

if true {
    renderBetaUI()
} else {
    renderOldUI()
}

if false {
    processNewCheckout()
} else {
    processLegacyCheckout()
}

下一步:让你的编译器/优化器完全删除死分支!

🚀 快速开始

  1. 安装依赖项:

    pip install fastmcp polyglot-piranha
    
  2. 在游标中配置: 增添 ~/.cursor/mcp.json:

    {
      "mcpServers": {
        "mcp-piranha": {
          "command": "python3",
          "args": ["-m", "mcp-piranha"],
          "cwd": "/path/to/your/project",
          "env": {
            "PYTHONPATH": "/path/to/your/project"
          }
        }
      }
    }
    
  3. 创建 flags.json 在您的项目中:

    {
      "functions": [
        "isFeatureEnabled",
        "client.GetString",
        "isEnabled",
        "getFlag",
        "is_feature_enabled"
      ],
      "flags": {
        "beta_ui": {
          "value": true,
          "description": "Enables the new beta user interface",
          "replace_with": true
        },
        "new_checkout": {
          "value": false,
          "description": "New payment processing flow",
          "replace_with": false
        }
      }
    }
    

🛠️ MCP工具

list_flags

从以下位置加载和解析功能标志 flags.json 在您的项目目录中。

参数:

  • working_directory (可选):要搜索的目录 flags.json

退货:

  • flags:旗帜名称列表
  • flag_details:详细的标志信息
  • global_patterns:检测功能模式
  • source_file:加载的路径 flags.json

apply_rewrite

通过将特征标志调用替换为其最终值来转换代码。

参数:

  • code:要转换的源代码
  • language:编程语言(go、java、python等)
  • flag_name (可选):要清理的特定标志
  • rules (可选):自定义食人鱼规则
  • edges (可选):自定义规则边

退货:

  • transformed_code:转换后的代码
  • message:状态消息

📝 flags.json 格式

用于定义特征标志和检测模式的JSON格式:

{
  "functions": ["function1", "function2", "function3"],
  "flags": {
    "flag_name": {
      "value": true,
      "description": "Flag description",
      "replace_with": true
    }
  }
}

格式详细信息

函数数组:

  • 要检测的函数名数组
  • 示例: "isFeatureEnabled", "client.GetString", "isEnabled"
  • 支持任何将标志名称作为字符串参数的函数

标记对象:

  • 以标志名称作为键的对象
  • 每个标志包含:
    • value:当前状态(真/假)
    • description:人类可读的描述
    • replace_with:清理时要更换什么

示例

{
  "functions": [
    "isFeatureEnabled",
    "client.GetString",
    "isEnabled",
    "getFlag",
    "is_feature_enabled",
    "get_flag",
    "flag_manager.is_feature_enabled",
    "config.getBoolean",
    "settings.isEnabled"
  ],
  "flags": {
    "beta_ui": {
      "value": true,
      "description": "Enables the new beta user interface with modern design elements",
      "replace_with": true
    },
    "new_checkout_flow": {
      "value": false,
      "description": "New payment processing flow with improved UX",
      "replace_with": false
    },
    "feature_flag": {
      "value": true,
      "description": "Generic feature flag for testing purposes",
      "replace_with": true
    },
    "legacy_auth": {
      "value": false,
      "description": "Legacy authentication system (deprecated)",
      "replace_with": false
    },
    "debug_mode": {
      "value": true,
      "description": "Enables debug logging and additional error information",
      "replace_with": true
    }
  }
}

🔧 运作原理

  1. 模式检测:使用全局函数模式查找特征标志调用
  2. 灵活匹配:支持各种功能签名:
    • isFeatureEnabled("flag_name")
    • isFeatureEnabled("flag_name", arg2)
    • isFeatureEnabled(arg1, "flag_name")
    • isFeatureEnabled(arg1, "flag_name", arg3)
  3. 规则生成:为每个函数模式创建食人鱼规则
  4. 代码转换:将标志调用替换为其最终值

🧪 测试

在中运行测试 tests/ 目录:

python3 tests/test_multilayered.py

📁 项目结构

mcp-piranha/
├── src/
│   ├── __init__.py
│   └── server.py          # Main MCP server
├── tests/
│   ├── test_multilayered.py
│   └── test_*.py          # Additional test files
├── __main__.py            # Entry point
├── flags.json             # Feature flag definitions
├── motivation.png         # The problem we're solving
└── README.md

🎯 支持的语言

  • 去 - isFeatureEnabled(), client.GetString(),自定义图案
  • Java - config.getBoolean(), featureManager.isEnabled()
  • python - is_feature_enabled(), get_flag()
  • JavaScript/TypeScript -各种标志检查模式
  • C -基于配置的标志模式
  • 还有更多 -可通过Polyglot Piranha的规则系统进行扩展

🔍 现实世界影响

降低代码复杂度

之前: 导航嵌套标志条件

if is_feature_enabled("new_dashboard"):
    if is_feature_enabled("advanced_analytics"):
        render_advanced_dashboard()
    else:
        render_basic_new_dashboard()
else:
    render_legacy_dashboard()

之后: 清晰的线性逻辑

if true:
    if true:
        render_advanced_dashboard()
    else:
        render_basic_new_dashboard()
else:
    render_legacy_dashboard()

性能优势

  • ❌ 运行时标志评估 (数据库/API调用)
  • ✅ 编译时间常数 (运行时开销为零)
  • 🚀 死代码消除 由编译器/打包器

🔮 未来愿景:企业整合

graph LR
    A[Feature Flag System<br/>LaunchDarkly/Split.io] --> B[Safety Analysis<br/>Rollout % / Stability]
    B --> C[MCP Piranha<br/>Code Transformation]
    C --> D[Clean Codebase<br/>Zero Technical Debt]

马上就来:

  • 🔌 直播旗系统集成 -直接连接到LaunchDarkly、Split.io、Unleash
  • 🛡️ 安全性分析 -仅删除95%以上推出和30天以上稳定性的标志
  • 🔄 自动化工作流程 -CI/CD与审批流程的集成
  • 📊 影响分析 -应用前预览更改
  • 🎯 批量操作 -安全地清理整个代码库

🚨 故障排除

  • “未应用任何转换”:检查一下 flags.json 存在并包含该标志
  • “连接已关闭”:重新启动Claude Code或MCP服务器
  • “树保姆查询无效”:确保函数模式是有效的标识符

💡 为什么这很重要

“功能标志是一个强大的工具,但如果没有适当的清理,它们就会成为随着时间的推移而加剧的技术债务。这个项目自动化了去除标志这一乏味但关键的任务,保持代码库的清洁和可维护性。”

目标: 使功能标志清理变得如此简单和安全,使其成为每个开发工作流程的标准部分。