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()
}*下一步:让你的编译器/优化器完全删除死分支!*
🚀 快速开始
- 安装依赖项:
pip install fastmcp polyglot-piranha- 在游标中配置:
增添 ~/.cursor/mcp.json:
{
"mcpServers": {
"mcp-piranha": {
"command": "python3",
"args": ["-m", "mcp-piranha"],
"cwd": "/path/to/your/project",
"env": {
"PYTHONPATH": "/path/to/your/project"
}
}
}
}- 创建
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
}
}
}🔧 运作原理
- 模式检测:使用全局函数模式查找特征标志调用
- 灵活匹配:支持各种功能签名:
- isFeatureEnabled("flag_name") - isFeatureEnabled("flag_name", arg2) - isFeatureEnabled(arg1, "flag_name") - isFeatureEnabled(arg1, "flag_name", arg3)
- 规则生成:为每个函数模式创建食人鱼规则
- 代码转换:将标志调用替换为其最终值
🧪 测试
在中运行测试 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
LaunchDarkly/Split.io] --> B[Safety Analysis
Rollout % / Stability]
B --> C[MCP Piranha
Code Transformation]
C --> D[Clean Codebase
Zero Technical Debt]马上就来:
- 🔌 直播旗系统集成 -直接连接到LaunchDarkly、Split.io、Unleash
- 🛡️ 安全性分析 -仅删除95%以上推出和30天以上稳定性的标志
- 🔄 自动化工作流程 -CI/CD与审批流程的集成
- 📊 影响分析 -应用前预览更改
- 🎯 批量操作 -安全地清理整个代码库
🚨 故障排除
- “未应用任何转换”:检查一下
flags.json存在并包含该标志 - “连接已关闭”:重新启动Claude Code或MCP服务器
- “树保姆查询无效”:确保函数模式是有效的标识符
💡 为什么这很重要
“功能标志是一个强大的工具,但如果没有适当的清理,它们就会成为随着时间的推移而加剧的技术债务。这个项目自动化了去除标志这一乏味但关键的任务,保持代码库的清洁和可维护性。”
目标: 使功能标志清理变得如此简单和安全,使其成为每个开发工作流程的标准部分。
