ayechat 0.39.0__tar.gz → 0.40.0__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.
- ayechat-0.40.0/.github/workflows/build-windows-installer.yml +147 -0
- {ayechat-0.39.0/src/ayechat.egg-info → ayechat-0.40.0}/PKG-INFO +1 -1
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/config.py +2 -0
- {ayechat-0.39.0 → ayechat-0.40.0/src/ayechat.egg-info}/PKG-INFO +1 -1
- ayechat-0.39.0/.github/workflows/build-windows-installer.yml +0 -419
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/dependabot.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/message-releases-to-discord.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/pylint.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/python-publish-dev.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/python-publish.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/python-testing.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/test-homebrew.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/test-nix-github.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/test-nix.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/test-windows-installer.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/update-homebrew.yml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.gitignore +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/.pylintrc +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/BUILD.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/DISCLAIMER +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/Formula/aye-chat.rb +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/LICENSE +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/README.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/assets/aye-chat.ico +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/aye-chat.spec +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/ayechat.nix +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/flake.lock +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/flake.nix +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/installer.iss +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/publish_pypi.sh +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/pyproject.toml +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/requirements.txt +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/run_tests.cmd +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/run_tests.sh +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/setup.cfg +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/.gitignore +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/__init__.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/__main__.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/__main_chat__.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/__init__.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/command_handlers.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/commands.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/llm_handler.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/llm_invoker.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/plugin_manager.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/repl.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/tutorial.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/util.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/__init__.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/api.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/ast_chunker.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/auth.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/autodiff_config.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/download_plugins.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/file_processor.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/ignore_patterns.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/__init__.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/index_manager.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/index_manager_executor.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/index_manager_file_ops.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/index_manager_state.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/index_manager_utils.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/json_extractor.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/models.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/offline_llm_manager.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/onnx_manager.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/snapshot/__init__.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/snapshot/base.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/snapshot/file_backend.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/snapshot/git_ref_backend.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/source_collector.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/telemetry.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/vector_db.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/version_checker.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/write_validator.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/__init__.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/at_file_completer.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/auto_detect_mask.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/completer.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/databricks_model.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/local_model.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/offline_llm.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/plugin_base.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/shell_executor.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/slash_completer.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/__init__.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/cli_ui.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/diff_presenter.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/repl_ui.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/streaming_ui.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/ui_utils.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/ayechat.egg-info/SOURCES.txt +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/ayechat.egg-info/dependency_links.txt +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/ayechat.egg-info/entry_points.txt +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/ayechat.egg-info/requires.txt +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/src/ayechat.egg-info/top_level.txt +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/.gitignore +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/config/unittest-env.sh +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/e2e/test_chat_workflow.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_api.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_ast_chunker.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_at_file_completer.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_auth.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_auth_uat_1.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_auto_detect_mask.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_chromadb_corruption_recovery.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_cli.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_command_handlers.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_commands.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_completer_plugin.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_config.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_diff_presenter.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_download_plugins.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_file_processor.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_git_ref_backend.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_index_manager.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_index_manager_executor.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_index_manager_more.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_index_manager_state.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_index_manager_utils.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_llm_handler.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_llm_invoker.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_local_model_plugin.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_offline_llm.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_offline_llm_manager.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_onnx_manager.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_plugin_base.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_plugin_manager.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_presenter.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_rag_context_retrieval.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_repl.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_service.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_shell_executor_plugin.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_slash_completer.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_snapshot.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_source_collector.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_streaming_ui.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_telemetry.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_tutorial.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_ui_utils.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_util.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_vector_db.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_version_checker.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_write_validator.py +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/api_tests.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/auth_tests.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/demo_tests.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/download_plugins_tests.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/plugin_tests.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/service_tests.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/snapshot_tests.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/source_collector_tests.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/ui_tests.md +0 -0
- {ayechat-0.39.0 → ayechat-0.40.0}/version_info.txt +0 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
name: Build Windows Installer
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
version:
|
|
9
|
+
description: 'Version to build (e.g., 0.29.1)'
|
|
10
|
+
required: false
|
|
11
|
+
default: ''
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
build:
|
|
15
|
+
runs-on: windows-latest
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout code
|
|
19
|
+
uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Set up Python
|
|
22
|
+
uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: '3.12'
|
|
25
|
+
|
|
26
|
+
- name: Determine version
|
|
27
|
+
id: version
|
|
28
|
+
shell: bash
|
|
29
|
+
run: |
|
|
30
|
+
if [ -n "${{ github.event.inputs.version }}" ]; then
|
|
31
|
+
VERSION="${{ github.event.inputs.version }}"
|
|
32
|
+
elif [ "${{ github.event_name }}" = "release" ]; then
|
|
33
|
+
# Strip 'v' prefix if present
|
|
34
|
+
VERSION="${GITHUB_REF_NAME#v}"
|
|
35
|
+
else
|
|
36
|
+
VERSION="0.0.0"
|
|
37
|
+
fi
|
|
38
|
+
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
|
|
39
|
+
|
|
40
|
+
# Parse version components and convert to integers to strip leading zeros
|
|
41
|
+
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
|
|
42
|
+
# Default to 0 if empty, and convert to integer to strip leading zeros
|
|
43
|
+
MAJOR=$((MAJOR + 0))
|
|
44
|
+
MINOR=$((MINOR + 0))
|
|
45
|
+
PATCH=$((PATCH + 0))
|
|
46
|
+
NUMERIC_VERSION="${MAJOR}.${MINOR}.${PATCH}.0"
|
|
47
|
+
echo "NUMERIC_VERSION=$NUMERIC_VERSION" >> $GITHUB_OUTPUT
|
|
48
|
+
echo "MAJOR=$MAJOR" >> $GITHUB_OUTPUT
|
|
49
|
+
echo "MINOR=$MINOR" >> $GITHUB_OUTPUT
|
|
50
|
+
echo "PATCH=$PATCH" >> $GITHUB_OUTPUT
|
|
51
|
+
|
|
52
|
+
echo "Building version: $VERSION (numeric: $NUMERIC_VERSION)"
|
|
53
|
+
|
|
54
|
+
- name: Install dependencies
|
|
55
|
+
run: |
|
|
56
|
+
python -m pip install --upgrade pip
|
|
57
|
+
pip install pyinstaller
|
|
58
|
+
pip install -e .
|
|
59
|
+
|
|
60
|
+
- name: Generate version_info.txt
|
|
61
|
+
shell: bash
|
|
62
|
+
run: |
|
|
63
|
+
# Use the pre-parsed integer version components (no leading zeros)
|
|
64
|
+
MAJOR=${{ steps.version.outputs.MAJOR }}
|
|
65
|
+
MINOR=${{ steps.version.outputs.MINOR }}
|
|
66
|
+
PATCH=${{ steps.version.outputs.PATCH }}
|
|
67
|
+
VERSION=${{ steps.version.outputs.VERSION }}
|
|
68
|
+
|
|
69
|
+
cat > version_info.txt << EOF
|
|
70
|
+
# UTF-8
|
|
71
|
+
#
|
|
72
|
+
# Windows version info file for PyInstaller
|
|
73
|
+
# Auto-generated by CI/CD build.
|
|
74
|
+
#
|
|
75
|
+
VSVersionInfo(
|
|
76
|
+
ffi=FixedFileInfo(
|
|
77
|
+
filevers=(${MAJOR}, ${MINOR}, ${PATCH}, 0),
|
|
78
|
+
prodvers=(${MAJOR}, ${MINOR}, ${PATCH}, 0),
|
|
79
|
+
mask=0x3f,
|
|
80
|
+
flags=0x0,
|
|
81
|
+
OS=0x40004,
|
|
82
|
+
fileType=0x1,
|
|
83
|
+
subtype=0x0,
|
|
84
|
+
date=(0, 0)
|
|
85
|
+
),
|
|
86
|
+
kids=[
|
|
87
|
+
StringFileInfo([
|
|
88
|
+
StringTable(
|
|
89
|
+
'040904B0',
|
|
90
|
+
[
|
|
91
|
+
StringStruct('CompanyName', 'Acrotron, Inc.'),
|
|
92
|
+
StringStruct('FileDescription', 'Aye Chat - Terminal-first AI Code Generator'),
|
|
93
|
+
StringStruct('FileVersion', '${VERSION}'),
|
|
94
|
+
StringStruct('InternalName', 'aye'),
|
|
95
|
+
StringStruct('LegalCopyright', 'Copyright (C) 2024-2025 Acrotron, Inc.'),
|
|
96
|
+
StringStruct('OriginalFilename', 'aye.exe'),
|
|
97
|
+
StringStruct('ProductName', 'Aye Chat'),
|
|
98
|
+
StringStruct('ProductVersion', '${VERSION}'),
|
|
99
|
+
]
|
|
100
|
+
)
|
|
101
|
+
]),
|
|
102
|
+
VarFileInfo([VarStruct('Translation', [1033, 1200])])
|
|
103
|
+
]
|
|
104
|
+
)
|
|
105
|
+
EOF
|
|
106
|
+
|
|
107
|
+
echo "Generated version_info.txt:"
|
|
108
|
+
cat version_info.txt
|
|
109
|
+
|
|
110
|
+
- name: Generate frozen version module
|
|
111
|
+
shell: bash
|
|
112
|
+
run: |
|
|
113
|
+
VERSION=${{ steps.version.outputs.VERSION }}
|
|
114
|
+
mkdir -p src/aye
|
|
115
|
+
echo "__version__ = '${VERSION}'" > src/aye/_frozen_version.py
|
|
116
|
+
echo "Generated _frozen_version.py with version: ${VERSION}"
|
|
117
|
+
|
|
118
|
+
- name: Build with PyInstaller
|
|
119
|
+
run: |
|
|
120
|
+
pyinstaller aye-chat.spec --noconfirm
|
|
121
|
+
|
|
122
|
+
- name: Verify build
|
|
123
|
+
run: |
|
|
124
|
+
.\dist\aye-chat\aye.exe --version
|
|
125
|
+
|
|
126
|
+
- name: Install Inno Setup
|
|
127
|
+
run: |
|
|
128
|
+
choco install innosetup -y
|
|
129
|
+
|
|
130
|
+
- name: Build installer
|
|
131
|
+
run: |
|
|
132
|
+
$env:PATH += ";C:\Program Files (x86)\Inno Setup 6"
|
|
133
|
+
iscc installer.iss /DMyAppVersion=${{ steps.version.outputs.VERSION }} /DMyAppNumericVersion=${{ steps.version.outputs.NUMERIC_VERSION }}
|
|
134
|
+
|
|
135
|
+
- name: Upload installer artifact
|
|
136
|
+
uses: actions/upload-artifact@v4
|
|
137
|
+
with:
|
|
138
|
+
name: windows-installer
|
|
139
|
+
path: Output/*.exe
|
|
140
|
+
|
|
141
|
+
- name: Upload to release
|
|
142
|
+
if: github.event_name == 'release'
|
|
143
|
+
uses: softprops/action-gh-release@v1
|
|
144
|
+
with:
|
|
145
|
+
files: Output/*.exe
|
|
146
|
+
env:
|
|
147
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -152,8 +152,10 @@ MODELS = [
|
|
|
152
152
|
{"id": "google/gemini-3-pro-preview", "name": "Google: Gemini 3 Pro Preview", "max_prompt_kb": 340, "max_output_tokens": 24000, "context_target_kb": 250},
|
|
153
153
|
{"id": "anthropic/claude-sonnet-4.5", "name": "Anthropic: Claude Sonnet 4.5", "max_prompt_kb": 340, "max_output_tokens": 24000, "context_target_kb": 250},
|
|
154
154
|
{"id": "openai/gpt-5.1-codex", "name": "OpenAI: GPT-5.1-Codex", "max_prompt_kb": 200, "max_output_tokens": 24000, "context_target_kb": 180},
|
|
155
|
+
{"id": "openai/gpt-5.2-codex", "name": "OpenAI: GPT-5.2-Codex", "max_prompt_kb": 200, "max_output_tokens": 24000, "context_target_kb": 180},
|
|
155
156
|
{"id": "openai/gpt-5.2", "name": "OpenAI: GPT-5.2", "max_prompt_kb": 200, "max_output_tokens": 24000, "context_target_kb": 180},
|
|
156
157
|
{"id": "anthropic/claude-opus-4.5", "name": "Anthropic: Claude Opus 4.5", "max_prompt_kb": 200, "max_output_tokens": 16000, "context_target_kb": 170},
|
|
158
|
+
{"id": "anthropic/claude-opus-4.6", "name": "Anthropic: Claude Opus 4.6", "max_prompt_kb": 200, "max_output_tokens": 16000, "context_target_kb": 170},
|
|
157
159
|
|
|
158
160
|
# Offline models
|
|
159
161
|
{"id": "offline/qwen2.5-coder-7b", "name": "Qwen2.5 Coder 7B (Offline)", "type": "offline", "size_gb": 4.7, "max_prompt_kb": 60, "max_output_tokens": 8000, "context_target_kb": 40},
|
|
@@ -1,419 +0,0 @@
|
|
|
1
|
-
name: Build Windows Installer
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [ "dev" ]
|
|
6
|
-
release:
|
|
7
|
-
types: [published]
|
|
8
|
-
workflow_dispatch:
|
|
9
|
-
inputs:
|
|
10
|
-
version:
|
|
11
|
-
description: 'Version to build (e.g., 0.29.1). Leave empty to use latest tag.'
|
|
12
|
-
required: false
|
|
13
|
-
type: string
|
|
14
|
-
|
|
15
|
-
permissions:
|
|
16
|
-
contents: write
|
|
17
|
-
|
|
18
|
-
jobs:
|
|
19
|
-
build-installer:
|
|
20
|
-
name: Build Windows Installer
|
|
21
|
-
runs-on: windows-latest
|
|
22
|
-
|
|
23
|
-
steps:
|
|
24
|
-
- name: Checkout repository
|
|
25
|
-
uses: actions/checkout@v4
|
|
26
|
-
with:
|
|
27
|
-
fetch-depth: 0 # Needed for setuptools-scm to get version from tags
|
|
28
|
-
|
|
29
|
-
- name: Set up certificate
|
|
30
|
-
run: |
|
|
31
|
-
echo "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" | base64 --decode > /d/Certificate_pkcs12.p12
|
|
32
|
-
shell: bash
|
|
33
|
-
|
|
34
|
-
- name: Set variables
|
|
35
|
-
id: variables
|
|
36
|
-
run: |
|
|
37
|
-
echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
|
|
38
|
-
echo "SM_HOST=${{ secrets.SM_HOST }}" >> "$GITHUB_ENV"
|
|
39
|
-
echo "SM_API_KEY=${{ secrets.SM_API_KEY }}" >> "$GITHUB_ENV"
|
|
40
|
-
echo "SM_CLIENT_CERT_FILE=D:\\Certificate_pkcs12.p12" >> "$GITHUB_ENV"
|
|
41
|
-
echo "SM_CLIENT_CERT_PASSWORD=${{ secrets.SM_CLIENT_CERT_PASSWORD }}" >> "$GITHUB_ENV"
|
|
42
|
-
shell: bash
|
|
43
|
-
|
|
44
|
-
- name: Force reg add to be non-interactive (auto-append /f)
|
|
45
|
-
shell: pwsh
|
|
46
|
-
run: |
|
|
47
|
-
$wrapperDir = Join-Path $env:RUNNER_TEMP "reg-wrapper"
|
|
48
|
-
New-Item -ItemType Directory -Force -Path $wrapperDir | Out-Null
|
|
49
|
-
|
|
50
|
-
$wrapperPath = Join-Path $wrapperDir "reg.cmd"
|
|
51
|
-
|
|
52
|
-
@'
|
|
53
|
-
@echo off
|
|
54
|
-
setlocal EnableExtensions EnableDelayedExpansion
|
|
55
|
-
|
|
56
|
-
rem Wrapper around reg.exe to avoid interactive prompts.
|
|
57
|
-
rem If called as: reg add ... (without /f), append /f.
|
|
58
|
-
|
|
59
|
-
if /I "%~1"=="add" (
|
|
60
|
-
set "all=%*"
|
|
61
|
-
echo !all! | findstr /I /C:" /f" >nul
|
|
62
|
-
if errorlevel 1 (
|
|
63
|
-
"%SystemRoot%\System32\reg.exe" %* /f
|
|
64
|
-
exit /b %errorlevel%
|
|
65
|
-
)
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
"%SystemRoot%\System32\reg.exe" %*
|
|
69
|
-
exit /b %errorlevel%
|
|
70
|
-
'@ | Set-Content -Path $wrapperPath -Encoding ascii
|
|
71
|
-
|
|
72
|
-
"${wrapperDir}" | Out-File -FilePath $env:GITHUB_PATH -Append -Encoding utf8
|
|
73
|
-
Write-Host "Installed reg wrapper at: $wrapperPath"
|
|
74
|
-
Write-Host "Wrapper directory added to PATH: $wrapperDir"
|
|
75
|
-
|
|
76
|
-
- name: Setup Software Trust Manager (new)
|
|
77
|
-
id: stm-setup
|
|
78
|
-
uses: digicert/code-signing-software-trust-action@v1.0.1
|
|
79
|
-
|
|
80
|
-
- name: Check PKCS11 config file
|
|
81
|
-
run: |
|
|
82
|
-
IF EXIST "${{ steps.stm-setup.outputs.PKCS11_CONFIG }}" (
|
|
83
|
-
echo file exists: ${{ steps.stm-setup.outputs.PKCS11_CONFIG }}
|
|
84
|
-
) ELSE (
|
|
85
|
-
echo !! file doesn't exist: ${{ steps.stm-setup.outputs.PKCS11_CONFIG }}
|
|
86
|
-
)
|
|
87
|
-
shell: cmd
|
|
88
|
-
|
|
89
|
-
- name: Find smctl location
|
|
90
|
-
run: where smctl
|
|
91
|
-
shell: cmd
|
|
92
|
-
|
|
93
|
-
- name: Debug certificate setup
|
|
94
|
-
run: |
|
|
95
|
-
echo "Checking if certificate file exists..."
|
|
96
|
-
if [ -f "D:/Certificate_pkcs12.p12" ]; then
|
|
97
|
-
echo "Certificate file exists"
|
|
98
|
-
ls -la D:/Certificate_pkcs12.p12
|
|
99
|
-
echo "Verifying certificate file format..."
|
|
100
|
-
openssl pkcs12 -in D:/Certificate_pkcs12.p12 -info -nokeys -passin pass:${{ secrets.SM_CLIENT_CERT_PASSWORD }} 2>&1 | head -20 || echo "Failed to read certificate - may be wrong password or corrupted file"
|
|
101
|
-
echo "Getting certificate fingerprint (SHA1)..."
|
|
102
|
-
openssl pkcs12 -in D:/Certificate_pkcs12.p12 -passin pass:${{ secrets.SM_CLIENT_CERT_PASSWORD }} -nokeys 2>/dev/null | openssl x509 -fingerprint -sha1 -noout || echo "Failed to get fingerprint"
|
|
103
|
-
else
|
|
104
|
-
echo "Certificate file NOT found!"
|
|
105
|
-
fi
|
|
106
|
-
shell: bash
|
|
107
|
-
|
|
108
|
-
- name: Verify secrets are set
|
|
109
|
-
run: |
|
|
110
|
-
echo Checking required secrets...
|
|
111
|
-
if [ -z "${{ secrets.SM_HOST }}" ]; then echo "ERROR: SM_HOST is not set"; else echo "SM_HOST is set"; fi
|
|
112
|
-
if [ -z "${{ secrets.SM_API_KEY }}" ]; then echo "ERROR: SM_API_KEY is not set"; else echo "SM_API_KEY is set (length: ${#SM_API_KEY})"; fi
|
|
113
|
-
if [ -z "${{ secrets.SM_CLIENT_CERT_PASSWORD }}" ]; then echo "ERROR: SM_CLIENT_CERT_PASSWORD is not set"; else echo "SM_CLIENT_CERT_PASSWORD is set"; fi
|
|
114
|
-
if [ -z "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" ]; then echo "ERROR: SM_CLIENT_CERT_FILE_B64 is not set"; else echo "SM_CLIENT_CERT_FILE_B64 is set"; fi
|
|
115
|
-
if [ -z "${{ secrets.SM_CODE_SIGNING_CERT_SHA1_HASH }}" ]; then echo "ERROR: SM_CODE_SIGNING_CERT_SHA1_HASH is not set"; else echo "SM_CODE_SIGNING_CERT_SHA1_HASH is set"; fi
|
|
116
|
-
if [ -z "${{ secrets.SM_KEYPAIR_ALIAS }}" ]; then echo "ERROR: SM_KEYPAIR_ALIAS is not set"; else echo "SM_KEYPAIR_ALIAS is set"; fi
|
|
117
|
-
shell: bash
|
|
118
|
-
env:
|
|
119
|
-
SM_API_KEY: ${{ secrets.SM_API_KEY }}
|
|
120
|
-
|
|
121
|
-
# - name: Verify Certificate (Debug)
|
|
122
|
-
# run: |
|
|
123
|
-
# smctl keypair ls
|
|
124
|
-
|
|
125
|
-
# - name: Sync Certificates to Windows Store
|
|
126
|
-
# run: smctl windows certsync
|
|
127
|
-
|
|
128
|
-
# - name: Verify Certificate (Debug)
|
|
129
|
-
# run: |
|
|
130
|
-
# smctl keypair ls
|
|
131
|
-
|
|
132
|
-
# - name: Stop for debugging
|
|
133
|
-
# run: exit 1
|
|
134
|
-
|
|
135
|
-
- name: Determine version
|
|
136
|
-
id: version
|
|
137
|
-
shell: pwsh
|
|
138
|
-
run: |
|
|
139
|
-
if ("${{ github.event.inputs.version }}" -ne "") {
|
|
140
|
-
# Manual input - use as-is
|
|
141
|
-
$version = "${{ github.event.inputs.version }}"
|
|
142
|
-
} elseif ("${{ github.event_name }}" -eq "release") {
|
|
143
|
-
# Release event - use tag directly (like python-publish.yml)
|
|
144
|
-
$version = "${{ github.event.release.tag_name }}" -replace '^v', ''
|
|
145
|
-
} else {
|
|
146
|
-
# Dev branch push - generate dev version (like python-publish-dev.yml)
|
|
147
|
-
# Get the latest tag, or use 0.0.0 if no tags exist
|
|
148
|
-
$latestTag = git describe --tags --abbrev=0 2>$null
|
|
149
|
-
if (-not $latestTag) { $latestTag = "0.0.0" }
|
|
150
|
-
$latestTag = $latestTag -replace '^v', ''
|
|
151
|
-
|
|
152
|
-
# Split version into major.minor.patch
|
|
153
|
-
$parts = $latestTag.Split('.')
|
|
154
|
-
$major = if ($parts.Length -gt 0) { $parts[0] } else { 0 }
|
|
155
|
-
$minor = if ($parts.Length -gt 1) { $parts[1] } else { 0 }
|
|
156
|
-
$patch = if ($parts.Length -gt 2) { ($parts[2] -replace '[^0-9].*', '') } else { 0 }
|
|
157
|
-
|
|
158
|
-
# Increment patch version for dev releases
|
|
159
|
-
$nextPatch = $patch + 1
|
|
160
|
-
$nextVersion = "$major.$minor.$nextPatch"
|
|
161
|
-
|
|
162
|
-
# Generate timestamp-based dev version
|
|
163
|
-
$timestamp = Get-Date -Format "yyyyMMddHHmmss"
|
|
164
|
-
$version = "$nextVersion.dev$timestamp"
|
|
165
|
-
|
|
166
|
-
Write-Host "Latest release: $latestTag"
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
# Extract numeric version for Windows VersionInfo (X.X.X.X format)
|
|
170
|
-
# Remove any non-numeric suffix like .devXXX
|
|
171
|
-
$numericVersion = $version -replace '\.dev.*$', ''
|
|
172
|
-
# Ensure we have at least X.X.X format, pad with .0 if needed
|
|
173
|
-
$parts = $numericVersion.Split('.')
|
|
174
|
-
while ($parts.Length -lt 3) { $parts += "0" }
|
|
175
|
-
$numericVersion = ($parts[0..2] -join '.') + ".0"
|
|
176
|
-
|
|
177
|
-
echo "VERSION=$version" >> $env:GITHUB_OUTPUT
|
|
178
|
-
echo "NUMERIC_VERSION=$numericVersion" >> $env:GITHUB_OUTPUT
|
|
179
|
-
echo "Building version: $version (numeric: $numericVersion)"
|
|
180
|
-
|
|
181
|
-
- name: Set up Python
|
|
182
|
-
uses: actions/setup-python@v6
|
|
183
|
-
with:
|
|
184
|
-
python-version: '3.12'
|
|
185
|
-
cache: 'pip'
|
|
186
|
-
|
|
187
|
-
- name: Install dependencies
|
|
188
|
-
run: |
|
|
189
|
-
python -m pip install --upgrade pip
|
|
190
|
-
pip install pyinstaller
|
|
191
|
-
pip install -e .
|
|
192
|
-
|
|
193
|
-
- name: Create frozen version module
|
|
194
|
-
shell: pwsh
|
|
195
|
-
run: |
|
|
196
|
-
$version = "${{ steps.version.outputs.VERSION }}"
|
|
197
|
-
$content = "# Auto-generated by build-windows-installer.yml - DO NOT EDIT`n__version__ = `"$version`""
|
|
198
|
-
$content | Set-Content -Path "src/aye/_frozen_version.py" -Encoding utf8NoBOM
|
|
199
|
-
Write-Host "Created _frozen_version.py with version: $version"
|
|
200
|
-
Get-Content -Path "src/aye/_frozen_version.py"
|
|
201
|
-
|
|
202
|
-
- name: Create version info file
|
|
203
|
-
shell: pwsh
|
|
204
|
-
run: |
|
|
205
|
-
$version = "${{ steps.version.outputs.VERSION }}"
|
|
206
|
-
$parts = $version.Split('.')
|
|
207
|
-
$major = if ($parts.Length -gt 0) { $parts[0] } else { "0" }
|
|
208
|
-
$minor = if ($parts.Length -gt 1) { $parts[1] } else { "0" }
|
|
209
|
-
$patch = if ($parts.Length -gt 2) { $parts[2] -replace '[^0-9].*', '' } else { "0" }
|
|
210
|
-
|
|
211
|
-
$content = @"
|
|
212
|
-
VSVersionInfo(
|
|
213
|
-
ffi=FixedFileInfo(
|
|
214
|
-
filevers=($major, $minor, $patch, 0),
|
|
215
|
-
prodvers=($major, $minor, $patch, 0),
|
|
216
|
-
mask=0x3f,
|
|
217
|
-
flags=0x0,
|
|
218
|
-
OS=0x40004,
|
|
219
|
-
fileType=0x1,
|
|
220
|
-
subtype=0x0,
|
|
221
|
-
date=(0, 0)
|
|
222
|
-
),
|
|
223
|
-
kids=[
|
|
224
|
-
StringFileInfo([
|
|
225
|
-
StringTable(
|
|
226
|
-
'040904B0',
|
|
227
|
-
[
|
|
228
|
-
StringStruct('CompanyName', 'Acrotron, Inc.'),
|
|
229
|
-
StringStruct('FileDescription', 'Aye Chat - Terminal-first AI Code Generator'),
|
|
230
|
-
StringStruct('FileVersion', '$version'),
|
|
231
|
-
StringStruct('InternalName', 'aye'),
|
|
232
|
-
StringStruct('LegalCopyright', 'Copyright (C) 2024-2025 Acrotron, Inc.'),
|
|
233
|
-
StringStruct('OriginalFilename', 'aye.exe'),
|
|
234
|
-
StringStruct('ProductName', 'Aye Chat'),
|
|
235
|
-
StringStruct('ProductVersion', '$version'),
|
|
236
|
-
]
|
|
237
|
-
)
|
|
238
|
-
]),
|
|
239
|
-
VarFileInfo([VarStruct('Translation', [1033, 1200])])
|
|
240
|
-
]
|
|
241
|
-
)
|
|
242
|
-
"@
|
|
243
|
-
|
|
244
|
-
# Write without UTF-8 BOM (PowerShell-only fix)
|
|
245
|
-
$content | Set-Content -Path version_info.txt -Encoding utf8NoBOM
|
|
246
|
-
|
|
247
|
-
Write-Host "version_info.txt written. First 16 bytes:"
|
|
248
|
-
Format-Hex -Path version_info.txt -Count 16
|
|
249
|
-
Write-Host "First line of version_info.txt:"
|
|
250
|
-
Get-Content -Path version_info.txt -TotalCount 1
|
|
251
|
-
|
|
252
|
-
- name: Build with PyInstaller
|
|
253
|
-
run: |
|
|
254
|
-
pyinstaller aye-chat.spec --noconfirm
|
|
255
|
-
|
|
256
|
-
- name: Verify build output
|
|
257
|
-
shell: pwsh
|
|
258
|
-
run: |
|
|
259
|
-
if (!(Test-Path "dist/aye-chat/aye.exe")) {
|
|
260
|
-
Write-Error "Build failed: aye.exe not found"
|
|
261
|
-
exit 1
|
|
262
|
-
}
|
|
263
|
-
Write-Host "Build successful! Contents of dist/aye-chat:"
|
|
264
|
-
Get-ChildItem -Path "dist/aye-chat" -Recurse | Select-Object FullName, Length
|
|
265
|
-
|
|
266
|
-
- name: Test executable
|
|
267
|
-
shell: pwsh
|
|
268
|
-
run: |
|
|
269
|
-
Write-Host "Testing aye.exe --version:"
|
|
270
|
-
& "dist/aye-chat/aye.exe" --version
|
|
271
|
-
|
|
272
|
-
- name: Build installer with Inno Setup
|
|
273
|
-
id: inno-setup
|
|
274
|
-
uses: Minionguyjpro/Inno-Setup-Action@v1.2.7
|
|
275
|
-
with:
|
|
276
|
-
path: installer.iss
|
|
277
|
-
options: /DMyAppVersion=${{ steps.version.outputs.VERSION }} /DMyAppNumericVersion=${{ steps.version.outputs.NUMERIC_VERSION }}
|
|
278
|
-
|
|
279
|
-
- name: Find installer executable
|
|
280
|
-
id: find-installer
|
|
281
|
-
shell: pwsh
|
|
282
|
-
run: |
|
|
283
|
-
$exe = Get-ChildItem -Path Output -Filter *.exe | Select-Object -First 1
|
|
284
|
-
echo "INSTALLER_PATH=$($exe.FullName)" >> $env:GITHUB_OUTPUT
|
|
285
|
-
echo "Found installer: $($exe.FullName)"
|
|
286
|
-
|
|
287
|
-
- name: Add signtool to PATH
|
|
288
|
-
shell: pwsh
|
|
289
|
-
run: |
|
|
290
|
-
$sdkPath = "C:\Program Files (x86)\Windows Kits\10\bin"
|
|
291
|
-
$latestSdk = Get-ChildItem -Path $sdkPath -Directory | Where-Object { $_.Name -match '^\d+\.\d+\.\d+\.\d+$' } | Sort-Object Name -Descending | Select-Object -First 1
|
|
292
|
-
$signtoolPath = Join-Path $latestSdk.FullName "x64"
|
|
293
|
-
echo "Adding to PATH: $signtoolPath"
|
|
294
|
-
echo "$signtoolPath" >> $env:GITHUB_PATH
|
|
295
|
-
|
|
296
|
-
- name: Sign installer with certificate
|
|
297
|
-
if: github.event_name == 'release'
|
|
298
|
-
run: |
|
|
299
|
-
smctl sign --verbose --keypair-alias ${{ secrets.SM_KEYPAIR_ALIAS }} --input "${{ steps.find-installer.outputs.INSTALLER_PATH }}" --config-file ${{ steps.stm-setup.outputs.PKCS11_CONFIG }}
|
|
300
|
-
shell: cmd
|
|
301
|
-
env:
|
|
302
|
-
SM_HOST: ${{ secrets.SM_HOST }}
|
|
303
|
-
SM_API_KEY: ${{ secrets.SM_API_KEY }}
|
|
304
|
-
SM_CLIENT_CERT_FILE: D:\Certificate_pkcs12.p12
|
|
305
|
-
SM_CLIENT_CERT_PASSWORD: ${{ secrets.SM_CLIENT_CERT_PASSWORD }}
|
|
306
|
-
|
|
307
|
-
- name: Upload installer artifact
|
|
308
|
-
uses: actions/upload-artifact@v6
|
|
309
|
-
with:
|
|
310
|
-
name: aye-chat-installer-${{ steps.version.outputs.VERSION }}
|
|
311
|
-
path: Output/*.exe
|
|
312
|
-
if-no-files-found: error
|
|
313
|
-
|
|
314
|
-
- name: Upload to release
|
|
315
|
-
if: github.event_name == 'release'
|
|
316
|
-
uses: softprops/action-gh-release@v2
|
|
317
|
-
with:
|
|
318
|
-
files: Output/*.exe
|
|
319
|
-
env:
|
|
320
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
321
|
-
|
|
322
|
-
# Optional: Create a portable ZIP as well
|
|
323
|
-
build-portable:
|
|
324
|
-
name: Build Portable ZIP
|
|
325
|
-
runs-on: windows-latest
|
|
326
|
-
|
|
327
|
-
steps:
|
|
328
|
-
- name: Checkout repository
|
|
329
|
-
uses: actions/checkout@v4
|
|
330
|
-
with:
|
|
331
|
-
fetch-depth: 0
|
|
332
|
-
|
|
333
|
-
- name: Determine version
|
|
334
|
-
id: version
|
|
335
|
-
shell: pwsh
|
|
336
|
-
run: |
|
|
337
|
-
if ("${{ github.event.inputs.version }}" -ne "") {
|
|
338
|
-
# Manual input - use as-is
|
|
339
|
-
$version = "${{ github.event.inputs.version }}"
|
|
340
|
-
} elseif ("${{ github.event_name }}" -eq "release") {
|
|
341
|
-
# Release event - use tag directly (like python-publish.yml)
|
|
342
|
-
$version = "${{ github.event.release.tag_name }}" -replace '^v', ''
|
|
343
|
-
} else {
|
|
344
|
-
# Dev branch push - generate dev version (like python-publish-dev.yml)
|
|
345
|
-
# Get the latest tag, or use 0.0.0 if no tags exist
|
|
346
|
-
$latestTag = git describe --tags --abbrev=0 2>$null
|
|
347
|
-
if (-not $latestTag) { $latestTag = "0.0.0" }
|
|
348
|
-
$latestTag = $latestTag -replace '^v', ''
|
|
349
|
-
|
|
350
|
-
# Split version into major.minor.patch
|
|
351
|
-
$parts = $latestTag.Split('.')
|
|
352
|
-
$major = if ($parts.Length -gt 0) { $parts[0] } else { 0 }
|
|
353
|
-
$minor = if ($parts.Length -gt 1) { $parts[1] } else { 0 }
|
|
354
|
-
$patch = if ($parts.Length -gt 2) { ($parts[2] -replace '[^0-9].*', '') } else { 0 }
|
|
355
|
-
|
|
356
|
-
# Increment patch version for dev releases
|
|
357
|
-
$nextPatch = $patch + 1
|
|
358
|
-
$nextVersion = "$major.$minor.$nextPatch"
|
|
359
|
-
|
|
360
|
-
# Generate timestamp-based dev version
|
|
361
|
-
$timestamp = Get-Date -Format "yyyyMMddHHmmss"
|
|
362
|
-
$version = "$nextVersion.dev$timestamp"
|
|
363
|
-
|
|
364
|
-
Write-Host "Latest release: $latestTag"
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
# Extract numeric version for Windows VersionInfo (X.X.X.X format)
|
|
368
|
-
# Remove any non-numeric suffix like .devXXX
|
|
369
|
-
$numericVersion = $version -replace '\.dev.*$', ''
|
|
370
|
-
# Ensure we have at least X.X.X format, pad with .0 if needed
|
|
371
|
-
$parts = $numericVersion.Split('.')
|
|
372
|
-
while ($parts.Length -lt 3) { $parts += "0" }
|
|
373
|
-
$numericVersion = ($parts[0..2] -join '.') + ".0"
|
|
374
|
-
|
|
375
|
-
echo "VERSION=$version" >> $env:GITHUB_OUTPUT
|
|
376
|
-
echo "NUMERIC_VERSION=$numericVersion" >> $env:GITHUB_OUTPUT
|
|
377
|
-
echo "Building version: $version (numeric: $numericVersion)"
|
|
378
|
-
|
|
379
|
-
- name: Set up Python
|
|
380
|
-
uses: actions/setup-python@v6
|
|
381
|
-
with:
|
|
382
|
-
python-version: '3.12'
|
|
383
|
-
cache: 'pip'
|
|
384
|
-
|
|
385
|
-
- name: Install dependencies
|
|
386
|
-
run: |
|
|
387
|
-
python -m pip install --upgrade pip
|
|
388
|
-
pip install pyinstaller
|
|
389
|
-
pip install -e .
|
|
390
|
-
|
|
391
|
-
- name: Create frozen version module
|
|
392
|
-
shell: pwsh
|
|
393
|
-
run: |
|
|
394
|
-
$version = "${{ steps.version.outputs.VERSION }}"
|
|
395
|
-
$content = "# Auto-generated by build-windows-installer.yml - DO NOT EDIT`n__version__ = `"$version`""
|
|
396
|
-
$content | Set-Content -Path "src/aye/_frozen_version.py" -Encoding utf8NoBOM
|
|
397
|
-
Write-Host "Created _frozen_version.py with version: $version"
|
|
398
|
-
|
|
399
|
-
- name: Build with PyInstaller
|
|
400
|
-
run: pyinstaller aye-chat.spec --noconfirm
|
|
401
|
-
|
|
402
|
-
- name: Create portable ZIP
|
|
403
|
-
shell: pwsh
|
|
404
|
-
run: |
|
|
405
|
-
Compress-Archive -Path "dist/aye-chat/*" -DestinationPath "aye-chat-portable-win64.zip"
|
|
406
|
-
|
|
407
|
-
- name: Upload portable artifact
|
|
408
|
-
uses: actions/upload-artifact@v6
|
|
409
|
-
with:
|
|
410
|
-
name: aye-chat-portable-${{ steps.version.outputs.VERSION }}
|
|
411
|
-
path: "*.zip"
|
|
412
|
-
if-no-files-found: error
|
|
413
|
-
|
|
414
|
-
- name: Upload to release
|
|
415
|
-
if: github.event_name == 'release'
|
|
416
|
-
uses: softprops/action-gh-release@v2
|
|
417
|
-
with:
|
|
418
|
-
files: "*.zip"
|
|
419
|
-
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|