feedback-one 2.6.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. feedback_one-2.6.2/.bumpversion.cfg +15 -0
  2. feedback_one-2.6.2/.github/workflows/auto-publish.yml +102 -0
  3. feedback_one-2.6.2/.github/workflows/build-and-release.yml +148 -0
  4. feedback_one-2.6.2/.github/workflows/build-desktop.yml +364 -0
  5. feedback_one-2.6.2/.github/workflows/publish.yml +551 -0
  6. feedback_one-2.6.2/.gitignore +87 -0
  7. feedback_one-2.6.2/.pre-commit-config.yaml +103 -0
  8. feedback_one-2.6.2/.python-version +1 -0
  9. feedback_one-2.6.2/LICENSE +24 -0
  10. feedback_one-2.6.2/Makefile +196 -0
  11. feedback_one-2.6.2/PKG-INFO +455 -0
  12. feedback_one-2.6.2/README.md +416 -0
  13. feedback_one-2.6.2/README.zh-CN.md +416 -0
  14. feedback_one-2.6.2/README.zh-TW.md +417 -0
  15. feedback_one-2.6.2/RELEASE_NOTES/CHANGELOG.en.md +403 -0
  16. feedback_one-2.6.2/RELEASE_NOTES/CHANGELOG.md +367 -0
  17. feedback_one-2.6.2/RELEASE_NOTES/CHANGELOG.zh-CN.md +427 -0
  18. feedback_one-2.6.2/RELEASE_NOTES/CHANGELOG.zh-TW.md +427 -0
  19. feedback_one-2.6.2/RELEASE_NOTES/README.md +66 -0
  20. feedback_one-2.6.2/RELEASE_NOTES/SIMPLIFIED_WORKFLOW.md +147 -0
  21. feedback_one-2.6.2/RELEASE_NOTES/template.md +24 -0
  22. feedback_one-2.6.2/debug_websocket.html +184 -0
  23. feedback_one-2.6.2/docs/DESKTOP_BUILD.md +244 -0
  24. feedback_one-2.6.2/docs/DESKTOP_BUILD_IMPROVEMENTS.md +224 -0
  25. feedback_one-2.6.2/docs/WORKFLOWS.md +159 -0
  26. feedback_one-2.6.2/docs/architecture/README.md +90 -0
  27. feedback_one-2.6.2/docs/architecture/api-reference.md +908 -0
  28. feedback_one-2.6.2/docs/architecture/component-details.md +1373 -0
  29. feedback_one-2.6.2/docs/architecture/deployment-guide.md +642 -0
  30. feedback_one-2.6.2/docs/architecture/interaction-flows.md +848 -0
  31. feedback_one-2.6.2/docs/architecture/system-overview.md +594 -0
  32. feedback_one-2.6.2/docs/en/cache-management.md +142 -0
  33. feedback_one-2.6.2/docs/en/images/desktop1.png +0 -0
  34. feedback_one-2.6.2/docs/en/images/ssh-remote-connect-url.png +0 -0
  35. feedback_one-2.6.2/docs/en/images/ssh-remote-debug-port.png +0 -0
  36. feedback_one-2.6.2/docs/en/images/ssh-remote-port-setting.png +0 -0
  37. feedback_one-2.6.2/docs/en/images/web1.png +0 -0
  38. feedback_one-2.6.2/docs/en/images/web2.jpeg +0 -0
  39. feedback_one-2.6.2/docs/en/ssh-remote/browser-launch-issues.md +117 -0
  40. feedback_one-2.6.2/docs/zh-CN/cache-management.md +142 -0
  41. feedback_one-2.6.2/docs/zh-CN/images/desktop1.png +0 -0
  42. feedback_one-2.6.2/docs/zh-CN/images/ssh-remote-connect-url.png +0 -0
  43. feedback_one-2.6.2/docs/zh-CN/images/ssh-remote-debug-port.png +0 -0
  44. feedback_one-2.6.2/docs/zh-CN/images/ssh-remote-port-setting.png +0 -0
  45. feedback_one-2.6.2/docs/zh-CN/images/web1.png +0 -0
  46. feedback_one-2.6.2/docs/zh-CN/images/web2.jpeg +0 -0
  47. feedback_one-2.6.2/docs/zh-CN/ssh-remote/browser-launch-issues.md +115 -0
  48. feedback_one-2.6.2/docs/zh-TW/cache-management.md +142 -0
  49. feedback_one-2.6.2/docs/zh-TW/images/desktop1.png +0 -0
  50. feedback_one-2.6.2/docs/zh-TW/images/ssh-remote-connect-url.png +0 -0
  51. feedback_one-2.6.2/docs/zh-TW/images/ssh-remote-debug-port.png +0 -0
  52. feedback_one-2.6.2/docs/zh-TW/images/ssh-remote-port-setting.png +0 -0
  53. feedback_one-2.6.2/docs/zh-TW/images/web1.png +0 -0
  54. feedback_one-2.6.2/docs/zh-TW/images/web2.jpeg +0 -0
  55. feedback_one-2.6.2/docs/zh-TW/ssh-remote/browser-launch-issues.md +103 -0
  56. feedback_one-2.6.2/examples/mcp-config-desktop.json +16 -0
  57. feedback_one-2.6.2/examples/mcp-config-web.json +16 -0
  58. feedback_one-2.6.2/highlights.txt +1 -0
  59. feedback_one-2.6.2/pyproject.toml +315 -0
  60. feedback_one-2.6.2/pytest.ini +43 -0
  61. feedback_one-2.6.2/release_body.md +35 -0
  62. feedback_one-2.6.2/scripts/build_desktop.py +437 -0
  63. feedback_one-2.6.2/scripts/cleanup_cache.py +313 -0
  64. feedback_one-2.6.2/scripts/release.py +109 -0
  65. feedback_one-2.6.2/scripts/validate_message_codes.py +202 -0
  66. feedback_one-2.6.2/scripts/validate_workflows.py +215 -0
  67. feedback_one-2.6.2/src/mcp_feedback_enhanced/__init__.py +52 -0
  68. feedback_one-2.6.2/src/mcp_feedback_enhanced/__main__.py +419 -0
  69. feedback_one-2.6.2/src/mcp_feedback_enhanced/debug.py +79 -0
  70. feedback_one-2.6.2/src/mcp_feedback_enhanced/desktop_app/__init__.py +30 -0
  71. feedback_one-2.6.2/src/mcp_feedback_enhanced/desktop_app/desktop_app.py +336 -0
  72. feedback_one-2.6.2/src/mcp_feedback_enhanced/desktop_release/__init__.py +1 -0
  73. feedback_one-2.6.2/src/mcp_feedback_enhanced/desktop_release/mcp-feedback-enhanced-desktop-linux +0 -0
  74. feedback_one-2.6.2/src/mcp_feedback_enhanced/desktop_release/mcp-feedback-enhanced-desktop-macos-arm64 +0 -0
  75. feedback_one-2.6.2/src/mcp_feedback_enhanced/desktop_release/mcp-feedback-enhanced-desktop-macos-intel +0 -0
  76. feedback_one-2.6.2/src/mcp_feedback_enhanced/desktop_release/mcp-feedback-enhanced-desktop.exe +0 -0
  77. feedback_one-2.6.2/src/mcp_feedback_enhanced/i18n.py +379 -0
  78. feedback_one-2.6.2/src/mcp_feedback_enhanced/py.typed +0 -0
  79. feedback_one-2.6.2/src/mcp_feedback_enhanced/server.py +674 -0
  80. feedback_one-2.6.2/src/mcp_feedback_enhanced/utils/__init__.py +28 -0
  81. feedback_one-2.6.2/src/mcp_feedback_enhanced/utils/error_handler.py +449 -0
  82. feedback_one-2.6.2/src/mcp_feedback_enhanced/utils/memory_monitor.py +519 -0
  83. feedback_one-2.6.2/src/mcp_feedback_enhanced/utils/resource_manager.py +801 -0
  84. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/__init__.py +26 -0
  85. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/constants/__init__.py +8 -0
  86. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/constants/message_codes.py +173 -0
  87. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/locales/en/translation.json +644 -0
  88. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/locales/zh-CN/translation.json +630 -0
  89. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/locales/zh-TW/translation.json +649 -0
  90. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/main.py +1236 -0
  91. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/models/__init__.py +13 -0
  92. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/models/feedback_result.py +16 -0
  93. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/models/feedback_session.py +1108 -0
  94. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/routes/__init__.py +12 -0
  95. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/routes/main_routes.py +698 -0
  96. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/css/audio-management.css +545 -0
  97. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/css/notification-settings.css +152 -0
  98. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/css/prompt-management.css +566 -0
  99. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/css/session-management.css +1428 -0
  100. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/css/styles.css +2203 -0
  101. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/favicon.ico +0 -0
  102. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/icon-192.png +0 -0
  103. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/icon.svg +16 -0
  104. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/index.html +158 -0
  105. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/app.js +2213 -0
  106. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/i18n.js +376 -0
  107. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/audio/audio-manager.js +610 -0
  108. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/audio/audio-settings-ui.js +732 -0
  109. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/connection-monitor.js +435 -0
  110. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/constants/message-codes.js +168 -0
  111. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/file-upload-manager.js +555 -0
  112. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/image-handler.js +199 -0
  113. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/logger.js +404 -0
  114. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/notification/notification-manager.js +360 -0
  115. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/notification/notification-settings.js +344 -0
  116. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/prompt/prompt-input-buttons.js +427 -0
  117. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/prompt/prompt-manager.js +414 -0
  118. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/prompt/prompt-modal.js +458 -0
  119. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/prompt/prompt-settings-ui.js +524 -0
  120. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/session/session-data-manager.js +1040 -0
  121. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/session/session-details-modal.js +594 -0
  122. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/session/session-ui-renderer.js +817 -0
  123. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/session-manager.js +1059 -0
  124. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/settings-manager.js +1002 -0
  125. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/tab-manager.js +235 -0
  126. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/textarea-height-manager.js +267 -0
  127. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/ui-manager.js +568 -0
  128. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/utils/dom-utils.js +392 -0
  129. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/utils/status-utils.js +403 -0
  130. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/utils/time-utils.js +440 -0
  131. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/utils.js +472 -0
  132. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/modules/websocket-manager.js +625 -0
  133. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/vendor/marked.min.js +6 -0
  134. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/static/js/vendor/purify.min.js +3 -0
  135. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/templates/components/image-upload.html +43 -0
  136. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/templates/components/settings-card.html +58 -0
  137. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/templates/components/status-indicator.html +31 -0
  138. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/templates/components/toggle-switch.html +19 -0
  139. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/templates/feedback.html +1360 -0
  140. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/templates/index.html +330 -0
  141. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/utils/__init__.py +13 -0
  142. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/utils/browser.py +152 -0
  143. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/utils/compression_config.py +190 -0
  144. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/utils/compression_monitor.py +314 -0
  145. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/utils/network.py +66 -0
  146. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/utils/port_manager.py +332 -0
  147. feedback_one-2.6.2/src/mcp_feedback_enhanced/web/utils/session_cleanup_manager.py +525 -0
  148. feedback_one-2.6.2/src-tauri/.cargo/config.toml +11 -0
  149. feedback_one-2.6.2/src-tauri/Cargo.toml +60 -0
  150. feedback_one-2.6.2/src-tauri/build.rs +3 -0
  151. feedback_one-2.6.2/src-tauri/generate_icons.py +102 -0
  152. feedback_one-2.6.2/src-tauri/icons/128x128.png +0 -0
  153. feedback_one-2.6.2/src-tauri/icons/128x128@2x.png +0 -0
  154. feedback_one-2.6.2/src-tauri/icons/256x256.png +0 -0
  155. feedback_one-2.6.2/src-tauri/icons/32x32.png +0 -0
  156. feedback_one-2.6.2/src-tauri/icons/icon.icns +0 -0
  157. feedback_one-2.6.2/src-tauri/icons/icon.ico +0 -0
  158. feedback_one-2.6.2/src-tauri/pyproject.toml +39 -0
  159. feedback_one-2.6.2/src-tauri/python/mcp_feedback_enhanced_desktop/__init__.py +30 -0
  160. feedback_one-2.6.2/src-tauri/python/mcp_feedback_enhanced_desktop/desktop_app.py +334 -0
  161. feedback_one-2.6.2/src-tauri/src/lib.rs +132 -0
  162. feedback_one-2.6.2/src-tauri/src/main.rs +79 -0
  163. feedback_one-2.6.2/src-tauri/tauri.conf.json +70 -0
  164. feedback_one-2.6.2/tests/__init__.py +6 -0
  165. feedback_one-2.6.2/tests/conftest.py +122 -0
  166. feedback_one-2.6.2/tests/fixtures/__init__.py +5 -0
  167. feedback_one-2.6.2/tests/helpers/__init__.py +5 -0
  168. feedback_one-2.6.2/tests/helpers/manual_tooltip_test.html +288 -0
  169. feedback_one-2.6.2/tests/helpers/mcp_client.py +245 -0
  170. feedback_one-2.6.2/tests/integration/__init__.py +5 -0
  171. feedback_one-2.6.2/tests/unit/__init__.py +5 -0
@@ -0,0 +1,15 @@
1
+ [bumpversion]
2
+ current_version = 2.6.2
3
+ commit = False
4
+ tag = False
5
+ allow_dirty = True
6
+ parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)
7
+ serialize = {major}.{minor}.{patch}
8
+
9
+ [bumpversion:file:pyproject.toml]
10
+ search = version = "{current_version}"
11
+ replace = version = "{new_version}"
12
+
13
+ [bumpversion:file:src/mcp_feedback_enhanced/__init__.py]
14
+ search = __version__ = "{current_version}"
15
+ replace = __version__ = "{new_version}"
@@ -0,0 +1,102 @@
1
+ name: Auto Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ jobs:
8
+ publish:
9
+ if: github.actor != 'github-actions[bot]'
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: write
13
+
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ with:
17
+ token: ${{ secrets.GITHUB_TOKEN }}
18
+ fetch-depth: 0
19
+
20
+ - name: Set up Python
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: '3.11'
24
+
25
+ - name: Bump version
26
+ id: bump
27
+ run: |
28
+ CURRENT=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
29
+ echo "Current version: $CURRENT"
30
+
31
+ MAJOR=$(echo "$CURRENT" | cut -d. -f1)
32
+ MINOR=$(echo "$CURRENT" | cut -d. -f2)
33
+ PATCH=$(echo "$CURRENT" | cut -d. -f3)
34
+
35
+ if [ "$PATCH" -ge 9 ]; then
36
+ MINOR=$((MINOR + 1))
37
+ PATCH=0
38
+ else
39
+ PATCH=$((PATCH + 1))
40
+ fi
41
+
42
+ NEW_VERSION="$MAJOR.$MINOR.$PATCH"
43
+ echo "New version: $NEW_VERSION"
44
+ echo "new_version=$NEW_VERSION" >> "$GITHUB_OUTPUT"
45
+
46
+ sed -i "s/^version = \"$CURRENT\"/version = \"$NEW_VERSION\"/" pyproject.toml
47
+ sed -i "s/^current_version = .*/current_version = $NEW_VERSION/" .bumpversion.cfg
48
+ sed -i "s/__version__ = \".*\"/__version__ = \"$NEW_VERSION\"/" src/mcp_feedback_enhanced/__init__.py
49
+
50
+ - name: Commit version bump
51
+ run: |
52
+ git config user.name "github-actions[bot]"
53
+ git config user.email "github-actions[bot]@users.noreply.github.com"
54
+ git add pyproject.toml .bumpversion.cfg src/mcp_feedback_enhanced/__init__.py
55
+ git commit -m "chore: bump version to ${{ steps.bump.outputs.new_version }} [skip ci]"
56
+ git pull --rebase origin main
57
+ git push
58
+
59
+ - name: Build package
60
+ run: |
61
+ python -m pip install --upgrade build
62
+ python -m build
63
+
64
+ - name: Publish to PyPI
65
+ env:
66
+ TWINE_USERNAME: __token__
67
+ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
68
+ run: |
69
+ python -m pip install --upgrade twine
70
+ twine upload dist/*
71
+
72
+ - name: Create GitHub Release
73
+ env:
74
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
75
+ run: |
76
+ NEW_VERSION="${{ steps.bump.outputs.new_version }}"
77
+ TAG="v${NEW_VERSION}"
78
+ LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
79
+ if [ -n "$LAST_TAG" ]; then
80
+ NOTES=$(git log "${LAST_TAG}..HEAD" --pretty=format:"- %s" --no-merges | grep -v "\[skip ci\]" | grep -v "^- chore: bump version" || true)
81
+ else
82
+ NOTES=$(git log --pretty=format:"- %s" --no-merges -20 | grep -v "\[skip ci\]" | grep -v "^- chore: bump version" || true)
83
+ fi
84
+ [ -z "$NOTES" ] && NOTES="- Version bump to ${NEW_VERSION}"
85
+ {
86
+ echo "## feedback-one ${TAG}"
87
+ echo ""
88
+ echo "📦 [PyPI](https://pypi.org/project/feedback-one/${NEW_VERSION}/)"
89
+ echo ""
90
+ echo "### 使用方式"
91
+ echo '```json'
92
+ echo '{"command": "uvx", "args": ["feedback-one@latest"]}'
93
+ echo '```'
94
+ echo ""
95
+ echo "### 變更內容"
96
+ echo "${NOTES}"
97
+ } > /tmp/release-notes.md
98
+ git tag "$TAG"
99
+ git push origin "$TAG"
100
+ gh release create "$TAG" dist/* \
101
+ --title "feedback-one ${TAG}" \
102
+ --notes-file /tmp/release-notes.md
@@ -0,0 +1,148 @@
1
+ name: Build Desktop & Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version_type:
7
+ description: 'Version bump type (ignored if custom_version is provided)'
8
+ required: false
9
+ default: 'patch'
10
+ type: choice
11
+ options:
12
+ - patch # 2.0.0 -> 2.0.1 (bug fixes, security patches, documentation updates)
13
+ - minor # 2.0.0 -> 2.1.0 (new features, enhancements, backward-compatible changes)
14
+ - major # 2.0.0 -> 3.0.0 (breaking changes, architecture refactoring, API changes)
15
+ custom_version:
16
+ description: 'Custom version number (e.g., 2.5.0) - overrides version_type if provided'
17
+ required: false
18
+ type: string
19
+ platforms:
20
+ description: '選擇要構建的平台'
21
+ required: true
22
+ default: 'all'
23
+ type: choice
24
+ options:
25
+ - all
26
+ - windows
27
+ - macos
28
+ - linux
29
+ skip_release:
30
+ description: '只構建桌面應用,不進行發佈'
31
+ required: false
32
+ default: false
33
+ type: boolean
34
+
35
+ jobs:
36
+ # 第一步:構建桌面應用
37
+ build-desktop:
38
+ name: Build Desktop Applications
39
+ uses: ./.github/workflows/build-desktop.yml
40
+ with:
41
+ platforms: ${{ github.event.inputs.platforms }}
42
+ upload_artifacts: true
43
+
44
+ # 第二步:等待構建完成並檢查結果
45
+ check-build:
46
+ name: Check Build Results
47
+ needs: build-desktop
48
+ runs-on: ubuntu-latest
49
+ outputs:
50
+ can_release: ${{ steps.check.outputs.can_release }}
51
+ build_run_id: ${{ steps.check.outputs.build_run_id }}
52
+
53
+ steps:
54
+ - name: Check build results
55
+ id: check
56
+ run: |
57
+ echo "🔍 檢查桌面應用構建結果..."
58
+
59
+ # 檢查構建是否成功
60
+ if [ "${{ needs.build-desktop.result }}" = "success" ]; then
61
+ echo "✅ 桌面應用構建成功"
62
+ echo "can_release=true" >> $GITHUB_OUTPUT
63
+ echo "build_run_id=${{ github.run_id }}" >> $GITHUB_OUTPUT
64
+ else
65
+ echo "❌ 桌面應用構建失敗"
66
+ echo "can_release=false" >> $GITHUB_OUTPUT
67
+ exit 1
68
+ fi
69
+
70
+ - name: Generate summary
71
+ run: |
72
+ echo "## 🖥️ 桌面應用構建完成" >> $GITHUB_STEP_SUMMARY
73
+ echo "" >> $GITHUB_STEP_SUMMARY
74
+ echo "### ✅ 構建結果" >> $GITHUB_STEP_SUMMARY
75
+ echo "" >> $GITHUB_STEP_SUMMARY
76
+ echo "- **狀態**: 成功 ✅" >> $GITHUB_STEP_SUMMARY
77
+ echo "- **平台**: ${{ github.event.inputs.platforms }}" >> $GITHUB_STEP_SUMMARY
78
+ echo "- **Run ID**: ${{ github.run_id }}" >> $GITHUB_STEP_SUMMARY
79
+ echo "" >> $GITHUB_STEP_SUMMARY
80
+
81
+ if [ "${{ github.event.inputs.skip_release }}" = "true" ]; then
82
+ echo "### ⏭️ 跳過發佈" >> $GITHUB_STEP_SUMMARY
83
+ echo "" >> $GITHUB_STEP_SUMMARY
84
+ echo "根據設置,已跳過自動發佈。" >> $GITHUB_STEP_SUMMARY
85
+ echo "如需發佈,請手動運行 [Auto Release to PyPI](../../actions/workflows/publish.yml) 工作流程。" >> $GITHUB_STEP_SUMMARY
86
+ else
87
+ echo "### 🚀 準備發佈" >> $GITHUB_STEP_SUMMARY
88
+ echo "" >> $GITHUB_STEP_SUMMARY
89
+ echo "桌面應用構建成功,正在準備自動發佈..." >> $GITHUB_STEP_SUMMARY
90
+ fi
91
+
92
+ # 第三步:自動發佈(如果沒有跳過)
93
+ release:
94
+ name: Auto Release to PyPI
95
+ needs: [build-desktop, check-build]
96
+ if: ${{ needs.check-build.outputs.can_release == 'true' && github.event.inputs.skip_release != 'true' }}
97
+ uses: ./.github/workflows/publish.yml
98
+ with:
99
+ version_type: ${{ github.event.inputs.version_type }}
100
+ custom_version: ${{ github.event.inputs.custom_version }}
101
+ include_desktop: true
102
+ desktop_build_run_id: ${{ needs.check-build.outputs.build_run_id }}
103
+ secrets: inherit
104
+
105
+ # 最終摘要
106
+ summary:
107
+ name: Workflow Summary
108
+ needs: [build-desktop, check-build, release]
109
+ runs-on: ubuntu-latest
110
+ if: always()
111
+
112
+ steps:
113
+ - name: Generate final summary
114
+ run: |
115
+ echo "## 🎯 構建和發佈摘要" >> $GITHUB_STEP_SUMMARY
116
+ echo "" >> $GITHUB_STEP_SUMMARY
117
+
118
+ # 桌面構建狀態
119
+ echo "### 🖥️ 桌面應用構建" >> $GITHUB_STEP_SUMMARY
120
+ if [ "${{ needs.build-desktop.result }}" = "success" ]; then
121
+ echo "- ✅ **成功** - 所有選定平台構建完成" >> $GITHUB_STEP_SUMMARY
122
+ else
123
+ echo "- ❌ **失敗** - 構建過程中出現錯誤" >> $GITHUB_STEP_SUMMARY
124
+ fi
125
+
126
+ # 發佈狀態
127
+ echo "" >> $GITHUB_STEP_SUMMARY
128
+ echo "### 📦 發佈狀態" >> $GITHUB_STEP_SUMMARY
129
+ if [ "${{ github.event.inputs.skip_release }}" = "true" ]; then
130
+ echo "- ⏭️ **已跳過** - 根據用戶設置跳過發佈" >> $GITHUB_STEP_SUMMARY
131
+ elif [ "${{ needs.release.result }}" = "success" ]; then
132
+ echo "- ✅ **成功** - 已發佈到 PyPI 和 GitHub Releases" >> $GITHUB_STEP_SUMMARY
133
+ elif [ "${{ needs.release.result }}" = "failure" ]; then
134
+ echo "- ❌ **失敗** - 發佈過程中出現錯誤" >> $GITHUB_STEP_SUMMARY
135
+ elif [ "${{ needs.release.result }}" = "skipped" ]; then
136
+ echo "- ⏭️ **已跳過** - 由於桌面構建失敗而跳過" >> $GITHUB_STEP_SUMMARY
137
+ else
138
+ echo "- ⏳ **進行中** - 發佈正在進行中" >> $GITHUB_STEP_SUMMARY
139
+ fi
140
+
141
+ echo "" >> $GITHUB_STEP_SUMMARY
142
+ echo "### 🔗 相關鏈接" >> $GITHUB_STEP_SUMMARY
143
+ echo "- [桌面構建工作流程](../../actions/workflows/build-desktop.yml)" >> $GITHUB_STEP_SUMMARY
144
+ echo "- [發佈工作流程](../../actions/workflows/publish.yml)" >> $GITHUB_STEP_SUMMARY
145
+ if [ "${{ needs.release.result }}" = "success" ]; then
146
+ echo "- [PyPI 頁面](https://pypi.org/project/feedback-one/)" >> $GITHUB_STEP_SUMMARY
147
+ echo "- [GitHub Releases](../../releases)" >> $GITHUB_STEP_SUMMARY
148
+ fi
@@ -0,0 +1,364 @@
1
+ name: Build Desktop Applications
2
+
3
+ on:
4
+ workflow_dispatch: # 手動觸發
5
+ inputs:
6
+ platforms:
7
+ description: '選擇要構建的平台'
8
+ required: true
9
+ default: 'all'
10
+ type: choice
11
+ options:
12
+ - all
13
+ - windows
14
+ - macos
15
+ - linux
16
+ upload_artifacts:
17
+ description: '是否上傳構建產物'
18
+ required: true
19
+ default: true
20
+ type: boolean
21
+
22
+ push:
23
+ paths:
24
+ - 'src-tauri/**' # 桌面應用代碼變更時自動觸發
25
+ - 'scripts/build_desktop.py'
26
+ branches:
27
+ - main
28
+
29
+ pull_request:
30
+ paths:
31
+ - 'src-tauri/**'
32
+ - 'scripts/build_desktop.py'
33
+
34
+ env:
35
+ CARGO_TERM_COLOR: always
36
+
37
+ jobs:
38
+ # 多平台桌面應用構建
39
+ build-desktop:
40
+ strategy:
41
+ fail-fast: false # 允許部分平台失敗
42
+ matrix:
43
+ include:
44
+ - os: windows-latest
45
+ target: x86_64-pc-windows-msvc
46
+ binary: feedback-one-desktop.exe
47
+ name: windows
48
+ - os: macos-latest
49
+ target: x86_64-apple-darwin
50
+ binary: feedback-one-desktop
51
+ name: macos-intel
52
+ - os: macos-latest
53
+ target: aarch64-apple-darwin
54
+ binary: feedback-one-desktop
55
+ name: macos-arm64
56
+ - os: ubuntu-latest
57
+ target: x86_64-unknown-linux-gnu
58
+ binary: feedback-one-desktop
59
+ name: linux
60
+
61
+ runs-on: ${{ matrix.os }}
62
+
63
+ steps:
64
+ - name: Check if platform should be built
65
+ id: check_platform
66
+ shell: bash
67
+ run: |
68
+ SHOULD_BUILD="false"
69
+ PLATFORM_INPUT="${{ github.event.inputs.platforms }}"
70
+ MATRIX_NAME="${{ matrix.name }}"
71
+
72
+ # 檢查是否應該構建此平台
73
+ if [ "$PLATFORM_INPUT" = "all" ] || [ "$PLATFORM_INPUT" = "" ]; then
74
+ SHOULD_BUILD="true"
75
+ elif [ "$PLATFORM_INPUT" = "windows" ] && [ "$MATRIX_NAME" = "windows" ]; then
76
+ SHOULD_BUILD="true"
77
+ elif [ "$PLATFORM_INPUT" = "macos" ] && ([ "$MATRIX_NAME" = "macos-intel" ] || [ "$MATRIX_NAME" = "macos-arm64" ]); then
78
+ SHOULD_BUILD="true"
79
+ elif [ "$PLATFORM_INPUT" = "linux" ] && [ "$MATRIX_NAME" = "linux" ]; then
80
+ SHOULD_BUILD="true"
81
+ fi
82
+
83
+ echo "should_build=$SHOULD_BUILD" >> $GITHUB_OUTPUT
84
+ echo "Platform: $MATRIX_NAME, Input: $PLATFORM_INPUT, Should build: $SHOULD_BUILD"
85
+
86
+ - name: Checkout code
87
+ if: steps.check_platform.outputs.should_build == 'true'
88
+ uses: actions/checkout@v4
89
+
90
+ - name: Install Rust
91
+ if: steps.check_platform.outputs.should_build == 'true'
92
+ uses: dtolnay/rust-toolchain@stable
93
+ with:
94
+ targets: ${{ matrix.target }}
95
+
96
+ - name: Install uv
97
+ if: steps.check_platform.outputs.should_build == 'true'
98
+ uses: astral-sh/setup-uv@v4
99
+ with:
100
+ version: "latest"
101
+
102
+ - name: Set up Python
103
+ if: steps.check_platform.outputs.should_build == 'true'
104
+ run: uv python install
105
+
106
+ - name: Install dependencies
107
+ if: steps.check_platform.outputs.should_build == 'true'
108
+ run: uv sync --dev
109
+
110
+ - name: Cache Rust dependencies
111
+ if: steps.check_platform.outputs.should_build == 'true'
112
+ uses: actions/cache@v4
113
+ with:
114
+ path: |
115
+ ~/.cargo/registry
116
+ ~/.cargo/git
117
+ src-tauri/target
118
+ key: ${{ runner.os }}-cargo-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }}
119
+ restore-keys: |
120
+ ${{ runner.os }}-cargo-${{ matrix.target }}-
121
+ ${{ runner.os }}-cargo-
122
+
123
+ - name: Install platform-specific dependencies (Linux)
124
+ if: ${{ steps.check_platform.outputs.should_build == 'true' && matrix.os == 'ubuntu-latest' }}
125
+ run: |
126
+ sudo apt-get update
127
+ # 安裝基本依賴
128
+ sudo apt-get install -y \
129
+ libwebkit2gtk-4.1-dev \
130
+ librsvg2-dev \
131
+ patchelf \
132
+ libgtk-3-dev
133
+
134
+ # 嘗試安裝 ayatana-appindicator,如果失敗則使用傳統的 appindicator
135
+ if ! sudo apt-get install -y libayatana-appindicator3-dev; then
136
+ echo "⚠️ libayatana-appindicator3-dev 安裝失敗,嘗試使用 libappindicator3-dev"
137
+ sudo apt-get install -y libappindicator3-dev
138
+ fi
139
+
140
+ - name: Build desktop application for ${{ matrix.name }}
141
+ if: steps.check_platform.outputs.should_build == 'true'
142
+ run: |
143
+ cd src-tauri
144
+ echo "🔨 開始構建 ${{ matrix.name }} (${{ matrix.target }})..."
145
+ cargo build --release --target ${{ matrix.target }} --bin feedback-one-desktop
146
+ echo "✅ 構建完成"
147
+
148
+ - name: Verify build output
149
+ if: steps.check_platform.outputs.should_build == 'true'
150
+ run: |
151
+ echo "🔍 檢查構建產物..."
152
+ BINARY_PATH="src-tauri/target/${{ matrix.target }}/release/${{ matrix.binary }}"
153
+
154
+ if [ -f "$BINARY_PATH" ]; then
155
+ echo "✅ 找到二進制文件: $BINARY_PATH"
156
+ ls -la "$BINARY_PATH"
157
+
158
+ # 檢查文件大小
159
+ FILE_SIZE=$(stat -f%z "$BINARY_PATH" 2>/dev/null || stat -c%s "$BINARY_PATH" 2>/dev/null || echo "unknown")
160
+ echo "📏 文件大小: $FILE_SIZE bytes"
161
+
162
+ # 檢查文件類型 (僅在 Linux/macOS)
163
+ if [ "${{ matrix.os }}" != "windows-latest" ]; then
164
+ file "$BINARY_PATH" || echo "無法檢查文件類型"
165
+ fi
166
+ else
167
+ echo "❌ ${{ matrix.name }} 二進制文件不存在: $BINARY_PATH"
168
+ echo "🔍 檢查目標目錄內容:"
169
+ ls -la "src-tauri/target/${{ matrix.target }}/release/" || echo "目標目錄不存在"
170
+ exit 1
171
+ fi
172
+ shell: bash
173
+
174
+ - name: Upload desktop binary
175
+ if: ${{ steps.check_platform.outputs.should_build == 'true' && github.event.inputs.upload_artifacts != 'false' }}
176
+ uses: actions/upload-artifact@v4
177
+ with:
178
+ name: desktop-${{ matrix.name }}
179
+ path: src-tauri/target/${{ matrix.target }}/release/${{ matrix.binary }}
180
+ retention-days: 30 # 保留 30 天
181
+ compression-level: 6
182
+ if-no-files-found: error # 如果沒有找到文件則失敗
183
+
184
+ # 構建摘要和驗證
185
+ build-summary:
186
+ needs: build-desktop
187
+ runs-on: ubuntu-latest
188
+ if: always()
189
+ outputs:
190
+ build_success: ${{ steps.check_results.outputs.success }}
191
+ platforms_built: ${{ steps.check_results.outputs.platforms }}
192
+
193
+ steps:
194
+ - name: Check build results
195
+ id: check_results
196
+ run: |
197
+ echo "🔍 檢查構建結果..."
198
+
199
+ # 檢查構建狀態
200
+ BUILD_SUCCESS="false"
201
+ PLATFORMS_BUILT=""
202
+
203
+ if [ "${{ needs.build-desktop.result }}" = "success" ]; then
204
+ BUILD_SUCCESS="true"
205
+ PLATFORMS_BUILT="windows,macos-intel,macos-arm64,linux"
206
+ echo "✅ 所有平台構建成功"
207
+ else
208
+ echo "❌ 構建失敗或部分失敗"
209
+ fi
210
+
211
+ echo "success=$BUILD_SUCCESS" >> $GITHUB_OUTPUT
212
+ echo "platforms=$PLATFORMS_BUILT" >> $GITHUB_OUTPUT
213
+
214
+ - name: Generate build summary
215
+ run: |
216
+ echo "## 🖥️ 桌面應用構建摘要" >> $GITHUB_STEP_SUMMARY
217
+ echo "" >> $GITHUB_STEP_SUMMARY
218
+ echo "### 構建結果" >> $GITHUB_STEP_SUMMARY
219
+ echo "" >> $GITHUB_STEP_SUMMARY
220
+
221
+ # 檢查各平台構建狀態
222
+ if [ "${{ needs.build-desktop.result }}" = "success" ]; then
223
+ echo "✅ **所有平台構建成功**" >> $GITHUB_STEP_SUMMARY
224
+ echo "" >> $GITHUB_STEP_SUMMARY
225
+ echo "| 平台 | 狀態 | 產物名稱 |" >> $GITHUB_STEP_SUMMARY
226
+ echo "|------|------|----------|" >> $GITHUB_STEP_SUMMARY
227
+ echo "| Windows x64 | ✅ 成功 | \`desktop-windows\` |" >> $GITHUB_STEP_SUMMARY
228
+ echo "| macOS Intel | ✅ 成功 | \`desktop-macos-intel\` |" >> $GITHUB_STEP_SUMMARY
229
+ echo "| macOS ARM64 | ✅ 成功 | \`desktop-macos-arm64\` |" >> $GITHUB_STEP_SUMMARY
230
+ echo "| Linux x64 | ✅ 成功 | \`desktop-linux\` |" >> $GITHUB_STEP_SUMMARY
231
+ elif [ "${{ needs.build-desktop.result }}" = "failure" ]; then
232
+ echo "❌ **部分平台構建失敗**" >> $GITHUB_STEP_SUMMARY
233
+ echo "" >> $GITHUB_STEP_SUMMARY
234
+ echo "請檢查各平台的構建日誌以了解失敗原因。" >> $GITHUB_STEP_SUMMARY
235
+ else
236
+ echo "⚠️ **構建狀態**: ${{ needs.build-desktop.result }}" >> $GITHUB_STEP_SUMMARY
237
+ fi
238
+
239
+ echo "" >> $GITHUB_STEP_SUMMARY
240
+ echo "### 📦 產物信息" >> $GITHUB_STEP_SUMMARY
241
+ echo "" >> $GITHUB_STEP_SUMMARY
242
+ echo "- **保留期限**: 30 天" >> $GITHUB_STEP_SUMMARY
243
+ echo "- **下載位置**: GitHub Actions Artifacts" >> $GITHUB_STEP_SUMMARY
244
+ echo "- **使用方式**: 在發佈工作流程中自動下載" >> $GITHUB_STEP_SUMMARY
245
+ echo "" >> $GITHUB_STEP_SUMMARY
246
+ echo "### 🚀 下一步" >> $GITHUB_STEP_SUMMARY
247
+ echo "" >> $GITHUB_STEP_SUMMARY
248
+
249
+ if [ "${{ needs.build-desktop.result }}" = "success" ]; then
250
+ echo "✅ **可以進行發佈**" >> $GITHUB_STEP_SUMMARY
251
+ echo "" >> $GITHUB_STEP_SUMMARY
252
+ echo "1. 前往 [Auto Release to PyPI](../../actions/workflows/publish.yml)" >> $GITHUB_STEP_SUMMARY
253
+ echo "2. 點擊 'Run workflow'" >> $GITHUB_STEP_SUMMARY
254
+ echo "3. 設置 'include_desktop' 為 true" >> $GITHUB_STEP_SUMMARY
255
+ echo "4. 可選:指定此次構建的 Run ID: \`${{ github.run_id }}\`" >> $GITHUB_STEP_SUMMARY
256
+ else
257
+ echo "❌ **請修復構建問題後重新運行**" >> $GITHUB_STEP_SUMMARY
258
+ echo "" >> $GITHUB_STEP_SUMMARY
259
+ echo "- 檢查構建日誌中的錯誤信息" >> $GITHUB_STEP_SUMMARY
260
+ echo "- 修復問題後重新觸發此工作流程" >> $GITHUB_STEP_SUMMARY
261
+ echo "- 確保所有平台都能成功構建後再進行發佈" >> $GITHUB_STEP_SUMMARY
262
+ fi
263
+
264
+ # 新增:將構建的二進制文件提交到 Git
265
+ commit-binaries:
266
+ name: 提交桌面二進制文件到 Git
267
+ runs-on: ubuntu-latest
268
+ needs: [build-desktop, build-summary]
269
+ if: needs.build-desktop.result == 'success'
270
+ permissions:
271
+ contents: write
272
+
273
+ steps:
274
+ - uses: actions/checkout@v4
275
+ with:
276
+ token: ${{ secrets.GITHUB_TOKEN }}
277
+ fetch-depth: 0
278
+
279
+ - name: Configure Git
280
+ run: |
281
+ git config --local user.email "action@github.com"
282
+ git config --local user.name "GitHub Action"
283
+
284
+ - name: Download all desktop artifacts
285
+ uses: actions/download-artifact@v4
286
+ with:
287
+ path: desktop-artifacts
288
+
289
+ - name: Prepare desktop binaries for commit
290
+ run: |
291
+ echo "📦 準備桌面二進制文件以提交到 Git..."
292
+
293
+ # 創建桌面應用目錄
294
+ mkdir -p src/mcp_feedback_enhanced/desktop_release
295
+
296
+ # 確保 __init__.py 存在
297
+ if [ ! -f "src/mcp_feedback_enhanced/desktop_release/__init__.py" ]; then
298
+ echo '"""桌面應用程式二進制檔案"""' > src/mcp_feedback_enhanced/desktop_release/__init__.py
299
+ fi
300
+
301
+ # 定義平台映射
302
+ declare -A PLATFORM_MAP=(
303
+ ["desktop-windows"]="feedback-one-desktop.exe"
304
+ ["desktop-macos-intel"]="feedback-one-desktop-macos-intel"
305
+ ["desktop-macos-arm64"]="feedback-one-desktop-macos-arm64"
306
+ ["desktop-linux"]="feedback-one-desktop-linux"
307
+ )
308
+
309
+ # 複製並重命名二進制文件
310
+ COPIED_COUNT=0
311
+
312
+ for platform_dir in desktop-windows desktop-macos-intel desktop-macos-arm64 desktop-linux; do
313
+ echo "🔍 處理平台: $platform_dir"
314
+
315
+ # 查找該平台的二進制文件
316
+ BINARY_FILE=""
317
+ if [ -d "desktop-artifacts/$platform_dir" ]; then
318
+ BINARY_FILE=$(find "desktop-artifacts/$platform_dir" -name "feedback-one-desktop*" -type f | head -1)
319
+ fi
320
+
321
+ if [ -n "$BINARY_FILE" ] && [ -f "$BINARY_FILE" ]; then
322
+ TARGET_NAME="${PLATFORM_MAP[$platform_dir]}"
323
+ cp "$BINARY_FILE" "src/mcp_feedback_enhanced/desktop_release/$TARGET_NAME"
324
+
325
+ # 設置執行權限(非 Windows)
326
+ if [[ "$TARGET_NAME" != *.exe ]]; then
327
+ chmod +x "src/mcp_feedback_enhanced/desktop_release/$TARGET_NAME"
328
+ fi
329
+
330
+ echo "✅ $platform_dir: $BINARY_FILE -> $TARGET_NAME"
331
+ COPIED_COUNT=$((COPIED_COUNT + 1))
332
+ else
333
+ echo "⚠️ $platform_dir: 未找到二進制文件"
334
+ fi
335
+ done
336
+
337
+ echo ""
338
+ echo "📊 複製結果統計:"
339
+ echo " 成功複製: $COPIED_COUNT/4 個平台"
340
+
341
+ # 顯示最終文件列表
342
+ echo ""
343
+ echo "📦 最終的桌面應用二進制文件:"
344
+ ls -la src/mcp_feedback_enhanced/desktop_release/
345
+
346
+ - name: Commit desktop binaries
347
+ run: |
348
+ echo "📝 提交桌面二進制文件到 Git..."
349
+
350
+ # 檢查是否有變更
351
+ if [ -n "$(git status --porcelain src/mcp_feedback_enhanced/desktop_release/)" ]; then
352
+ # 添加桌面二進制文件
353
+ git add src/mcp_feedback_enhanced/desktop_release/
354
+
355
+ # 提交變更
356
+ git commit -m "🖥️ 更新桌面應用二進制文件 - 自動構建多平台版本 (Run ${{ github.run_id }})"
357
+
358
+ # 推送到遠程倉庫
359
+ git push origin main
360
+
361
+ echo "✅ 桌面二進制文件已成功提交並推送到 Git"
362
+ else
363
+ echo "ℹ️ 沒有檢測到桌面二進制文件的變更,跳過提交"
364
+ fi