mirror of
https://github.com/Minidoracat/mcp-feedback-enhanced.git
synced 2025-07-27 10:42:25 +08:00
104 lines
3.0 KiB
Python
104 lines
3.0 KiB
Python
![]() |
#!/usr/bin/env python3
|
|||
|
"""
|
|||
|
本地發布腳本
|
|||
|
用法:
|
|||
|
python scripts/release.py patch # 2.0.0 -> 2.0.1
|
|||
|
python scripts/release.py minor # 2.0.0 -> 2.1.0
|
|||
|
python scripts/release.py major # 2.0.0 -> 3.0.0
|
|||
|
"""
|
|||
|
|
|||
|
import subprocess
|
|||
|
import sys
|
|||
|
import re
|
|||
|
from pathlib import Path
|
|||
|
|
|||
|
def run_cmd(cmd, check=True):
|
|||
|
"""執行命令並返回結果"""
|
|||
|
print(f"🔨 執行: {cmd}")
|
|||
|
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
|
|||
|
if check and result.returncode != 0:
|
|||
|
print(f"❌ 錯誤: {result.stderr}")
|
|||
|
sys.exit(1)
|
|||
|
return result
|
|||
|
|
|||
|
def get_current_version():
|
|||
|
"""從 pyproject.toml 獲取當前版本"""
|
|||
|
pyproject_path = Path("pyproject.toml")
|
|||
|
content = pyproject_path.read_text(encoding="utf-8")
|
|||
|
match = re.search(r'version = "([^"]+)"', content)
|
|||
|
if match:
|
|||
|
return match.group(1)
|
|||
|
raise ValueError("無法找到版本號")
|
|||
|
|
|||
|
def bump_version(version_type):
|
|||
|
"""更新版本號"""
|
|||
|
if version_type not in ['patch', 'minor', 'major']:
|
|||
|
print("❌ 版本類型必須是: patch, minor, major")
|
|||
|
sys.exit(1)
|
|||
|
|
|||
|
current = get_current_version()
|
|||
|
print(f"📦 當前版本: {current}")
|
|||
|
|
|||
|
# 使用 bump2version
|
|||
|
run_cmd(f"uv run bump2version {version_type}")
|
|||
|
|
|||
|
new_version = get_current_version()
|
|||
|
print(f"🎉 新版本: {new_version}")
|
|||
|
|
|||
|
return current, new_version
|
|||
|
|
|||
|
def main():
|
|||
|
if len(sys.argv) != 2:
|
|||
|
print(__doc__)
|
|||
|
sys.exit(1)
|
|||
|
|
|||
|
version_type = sys.argv[1]
|
|||
|
|
|||
|
print("🚀 開始發布流程...")
|
|||
|
|
|||
|
# 檢查是否有未提交的變更
|
|||
|
result = run_cmd("git status --porcelain", check=False)
|
|||
|
if result.stdout.strip():
|
|||
|
print("⚠️ 有未提交的變更,請先提交或暫存")
|
|||
|
print(result.stdout)
|
|||
|
choice = input("是否繼續? (y/N): ")
|
|||
|
if choice.lower() != 'y':
|
|||
|
sys.exit(1)
|
|||
|
|
|||
|
# 更新版本
|
|||
|
old_version, new_version = bump_version(version_type)
|
|||
|
|
|||
|
# 建置套件
|
|||
|
print("📦 建置套件...")
|
|||
|
run_cmd("uv build")
|
|||
|
|
|||
|
# 檢查套件
|
|||
|
print("🔍 檢查套件...")
|
|||
|
run_cmd("uv run twine check dist/*")
|
|||
|
|
|||
|
# 提交變更
|
|||
|
print("💾 提交版本更新...")
|
|||
|
run_cmd("git add .")
|
|||
|
run_cmd(f'git commit -m "🔖 Release v{new_version}"')
|
|||
|
run_cmd(f'git tag "v{new_version}"')
|
|||
|
|
|||
|
# 詢問是否發布
|
|||
|
print(f"\n✅ 準備發布版本 {old_version} -> {new_version}")
|
|||
|
choice = input("是否發布到 PyPI? (y/N): ")
|
|||
|
|
|||
|
if choice.lower() == 'y':
|
|||
|
print("🚀 發布到 PyPI...")
|
|||
|
run_cmd("uv run twine upload dist/*")
|
|||
|
|
|||
|
print("📤 推送到 GitHub...")
|
|||
|
run_cmd("git push origin main")
|
|||
|
run_cmd(f'git push origin "v{new_version}"')
|
|||
|
|
|||
|
print(f"🎉 發布完成!版本 v{new_version} 已上線")
|
|||
|
print(f"📦 安裝命令: uvx mcp-feedback-enhanced")
|
|||
|
else:
|
|||
|
print("⏸️ 發布已取消,版本已更新但未發布")
|
|||
|
print("💡 您可以稍後手動發布: uv run twine upload dist/*")
|
|||
|
|
|||
|
if __name__ == "__main__":
|
|||
|
main()
|