Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
177 commits
Select commit Hold shift + click to select a range
6801685
fix(input): apply persisted key mapping at runtime with hot reload
zhantss Sep 20, 2026
5c098c6
test(input): cover key-to-HID without hardware; document fake-connect…
zhantss Sep 20, 2026
c9fbed6
chore: keep local design mockups out of version control
zhantss Sep 20, 2026
443c842
build(deps): add headless UI test dependencies
zhantss Sep 20, 2026
8edbfc1
feat(ui): add a data-driven icon registry and vector icon control
zhantss Sep 20, 2026
b654e4a
feat(ui): add key-mapping canvas colour resources for all three schemes
zhantss Sep 20, 2026
983ff05
feat(input): restrict key mapping to bindable keys
zhantss Sep 20, 2026
3de7bed
perf(ui): preload the icon table and controller SVG at startup
zhantss Sep 20, 2026
3324dc8
refactor(ui): replace the key-mapping list model with the 26-row canv…
zhantss Sep 20, 2026
71098c3
feat(ui): rebuild the key mapping window around the NS2 controller
zhantss Sep 20, 2026
c33ebd2
test(ui): add a headless render and key-mapping regression suite
zhantss Sep 20, 2026
c41fd49
style: restore the trailing newline dropped from EasyCon2.Avalonia.cs…
zhantss Sep 20, 2026
33920ee
fix(ui): stop the shoulder arcs on the controller SVG from filling a …
zhantss Sep 20, 2026
e871f6f
test(ui): keep the headless screenshot tests out of CI and record the…
zhantss Sep 20, 2026
1e1b5e6
fix(ci): mark csv FFI test as non-Windows only
zhantss Sep 22, 2026
bde041f
Merge pull request #62 from zhantss/dev
ca1e Sep 22, 2026
ac7e16c
refactor: land the architecture review fix wave
ca1e Sep 27, 2026
5fb9bfb
fix(vm): allow wide frame slots on desktop
axechaso Sep 28, 2026
7ec5735
fix(modules): keep auto-loaded root libs visible
axechaso Sep 28, 2026
5a35964
fix(ffi): resolve relative libraries from declaring module
axechaso Sep 28, 2026
16935b7
Merge pull request #63 from axechaso/fix/pc-wide-slots
ca1e Sep 28, 2026
c3a5ccc
fix(gui): allow LSP startup without an open file
axechaso Sep 28, 2026
60d0340
fix(script): preserve root library visibility and cache semantics
axechaso Sep 28, 2026
604b199
fix(gui): run editor text with the current script session
axechaso Sep 28, 2026
0c3b3b8
fix(script): replace cross-block CSE uses before removal
axechaso Sep 28, 2026
bfc7713
fix(vm): allow wide frame slots on desktop
axechaso Sep 28, 2026
e06ad11
style: normalize compiler source formatting
axechaso Sep 28, 2026
4a86670
fix(ffi): resolve relative libraries from declaration files
axechaso Sep 28, 2026
a4d7bed
feat: add worktree sorting and script save shortcuts
axechaso Sep 29, 2026
f08dd97
fix(ci): handle robocopy success exit codes
axechaso Sep 29, 2026
58f6e34
test: wait for queued HID reports to drain
axechaso Sep 29, 2026
80a3da5
test: capture HID reports synchronously
axechaso Sep 29, 2026
bb35871
fix: use platform stopwatch frequency for sleeps
axechaso Sep 29, 2026
878be91
test: allow scheduling slack in HID report loop
axechaso Sep 29, 2026
feebcfe
test: widen HID report window for CI scheduling
axechaso Sep 29, 2026
2998c73
Merge upstream/dev while retaining module visibility and FFI cache fixes
axechaso Sep 29, 2026
f12cde9
fix(ui): repair worktree and save regressions
axechaso Sep 29, 2026
2834320
Merge pull request #65 from axechaso/feat/worktree-sort-ctrls
ca1e Sep 29, 2026
7c10f8a
fix(vpad): exit with main window; global key capture via SDL raw input
ca1e Sep 29, 2026
bf37607
fix(agent): rebuild frame injection, alignment guards and context ass…
ca1e Sep 30, 2026
98b3a4f
refactor(core): converge host assembly into a single composition root
ca1e Sep 30, 2026
451f7cb
fix(ui): make log panel text copyable on macOS
SlenderData Oct 1, 2026
590d34d
fix(device): de-assert RTS before DTR after opening serial port
SlenderData Oct 1, 2026
ab98311
feat(vm): converge on v3 fixed-length encoding and ECSC v2 container
ca1e Oct 6, 2026
f1666aa
refactor(ui): merge Avalonia.Core into GUI project and adopt feature-…
ca1e Oct 7, 2026
8692b23
chore(pack): restore 更新说明.txt and ship it in the windows-x64 package
ca1e Oct 7, 2026
5d7473a
Merge pull request #66 from SlenderData/dev
ca1e Oct 7, 2026
3175d29
Merge pull request #67 from SlenderData/fix/serial-dtr-rts-order
ca1e Oct 7, 2026
94e17a0
feat(agent): move agent core into EasyCon.Core LLM and add CLI agent …
ca1e Oct 7, 2026
fb6fcd8
feat(flow): node-graph orchestration (flow.json) — engine, service, C…
ca1e Oct 7, 2026
91d90fe
feat(script): module import rules v3 — same-dir visibility, .eci inte…
ca1e Oct 9, 2026
423c4d4
refactor(agent): enforce tool-port boundary, move runtime tools into …
ca1e Oct 9, 2026
fe2513f
feat(flow): device bridge — GUI owns devices, canvas & agent share th…
ca1e Oct 10, 2026
9b28c22
feat:接入 QQ 图片通知
xiaoyuQaQ95 Oct 10, 2026
bdfa528
refactor:将 QQ 图片通知整合到推送设置
xiaoyuQaQ95 Oct 10, 2026
471f41d
refactor:将 QQ 图片通知统一为推送配置项
xiaoyuQaQ95 Oct 10, 2026
62ec72e
refactor:将 QQ 推送名称改为 qq bot
xiaoyuQaQ95 Oct 10, 2026
73ed03f
fix:修复 QQ 图片上传与取消派发
xiaoyuQaQ95 Oct 10, 2026
c87b596
fix:修复 QQ 推送积压与配置迁移
xiaoyuQaQ95 Oct 10, 2026
80309a6
fix:兼容 QQ 图片上传的两种分片编号
xiaoyuQaQ95 Oct 10, 2026
0e36e82
feat:添加 qq bot 图文使用教程及平台链接
xiaoyuQaQ95 Oct 10, 2026
0461e5e
fix:统一 QQ 开放平台链接的下划线
xiaoyuQaQ95 Oct 10, 2026
c617dfb
fix:补全 QQ 开放平台链接的无障碍名称
xiaoyuQaQ95 Oct 10, 2026
7082485
fix:修复 QQ 密钥保存及取消验证状态
xiaoyuQaQ95 Oct 10, 2026
7945f9c
fix:修复 QQ 配置迁移重试与教程主题同步
xiaoyuQaQ95 Oct 10, 2026
e759cf8
fix:保留 QQ 配置迁移重试时的推送标识
xiaoyuQaQ95 Oct 10, 2026
ee3158d
feat:将 qq bot 推送适配 dev 项目结构
xiaoyuQaQ95 Oct 10, 2026
b63dd84
fix:恢复推送配置读取失败时的数据保护
xiaoyuQaQ95 Oct 10, 2026
20a089c
refactor(vm): register-window frame model — Dalvik-style per-function…
ca1e Oct 10, 2026
abb9bf4
fix(net): preserve RGB channels in NET_IMAGE
axechaso Oct 11, 2026
8cb8de5
style: remove final newlines to pass format gate
axechaso Oct 11, 2026
f65be1e
Merge pull request #73 from axechaso/fix/net-image-rgb-issue70
ca1e Oct 11, 2026
204b11a
refactor(core,ui): avalonia MVVM architecture overhaul — services, po…
ca1e Oct 11, 2026
29dd649
fix(ui): localize texts missed by language switch (check-update, capt…
ca1e Oct 11, 2026
5e6583a
feat: 添加游戏音频源
xiaoyuQaQ95 Oct 10, 2026
d8924a6
fix: 修复游戏音频源生命周期竞态
xiaoyuQaQ95 Oct 10, 2026
bb134a8
fix: 修复音频采集异常与连接竞态
xiaoyuQaQ95 Oct 10, 2026
f35c374
fix: 修复音频源跨平台门控与测试分层
xiaoyuQaQ95 Oct 11, 2026
badad9e
merge: 将 qq bot 适配最新 dev 组合根
xiaoyuQaQ95 Oct 11, 2026
301c7a1
fix(script): guard pooled slot reuse when emission order diverges fro…
ca1e Oct 11, 2026
8b15c9e
Merge pull request #72 from XiaoyuBook/codex/easycon-audio-source
ca1e Oct 12, 2026
a5b2891
merge: 同步最新 dev 到 qq bot PR
xiaoyuQaQ95 Oct 12, 2026
f5a529c
style: 修复组合根格式换行
xiaoyuQaQ95 Oct 12, 2026
d8a33d8
fix: 修复 QQ 配置迁移和读取保护
xiaoyuQaQ95 Oct 12, 2026
845bd1f
Merge pull request #69 from XiaoyuBook/qq-image-notifications
ca1e Oct 12, 2026
4519769
feat(script,core,vm): std-owned utilities, PTR-typed NET handles, CTC…
ca1e Oct 11, 2026
c74b912
feat(script,core,vm): YOLO26 检测、分类链路(NORM/标签表)、PP-OCR det 找框、L3 降级桌面专属契约
ca1e Oct 12, 2026
aa90750
chore(deps,test): 批量升级依赖;det 真模型用例改示例脚本并收紧 Explicit
ca1e Oct 12, 2026
5379202
style: dotnet format 修复 Capabilities 测试文件末尾换行
ca1e Oct 12, 2026
4995ebe
bump to v1.7.0-rc1
ca1e Oct 12, 2026
e7cc5e6
fix(vm): allocate argument windows per function
axechaso Oct 12, 2026
f2a750b
test(vm): require real multi-argument calls in VM regressions
axechaso Oct 12, 2026
1786f88
Merge pull request #75 from axechaso/fix/function-argument-register-w…
ca1e Oct 13, 2026
8fba657
docs: 清理文档债(AGENTS.md 档位与悬空清单、VM2.md §3.4/§8 残留、测试过时注释)
ca1e Oct 13, 2026
78d294b
feat(ocr): PP-OCRv6 支持——模型约定名解析 + std 数字窗口参数化
ca1e Oct 13, 2026
baac929
fix(vm): apply compact values and enforce P0 ABI budget gates
axechaso Oct 14, 2026
ca0d992
test: normalize interpolated ECS file paths on Windows
axechaso Oct 14, 2026
d00b928
Merge pull request #76 from axechaso/fix/cvm-budget-p0
ca1e Oct 15, 2026
f4b074a
feat: add independent Maa input and capture host foundation
axechaso Oct 16, 2026
e0cdf02
fix: keep capture reads off the thread pool and await HID writes
axechaso Oct 16, 2026
17bbac6
test: confirm fresh HID output for every source combination
axechaso Oct 16, 2026
e6b4662
fix: enumerate and select AVFoundation cameras on macOS
axechaso Oct 17, 2026
bcd7c7d
feat: add Maa P2 vision compatibility and fix P1 acceptance regressions
axechaso Oct 18, 2026
7d5dc4c
feat(ocr): 宝可梦盒子识别脚本项目 + std rec 行高参数化 + SSA 全局提升修复
ca1e Oct 18, 2026
2a6f867
Merge pull request #78 from axechaso/feat/maa-host-p1
ca1e Oct 18, 2026
3f5f832
feat(device): pokeldn 固件自动识别连接(实验性)
ca1e Oct 18, 2026
8f65689
fix: close Maa P2 resource and connection acceptance gaps
axechaso Oct 19, 2026
87b2468
feat:添加声音标签截取与编辑工具
xiaoyuQaQ95 Oct 12, 2026
01f8bce
feat:添加声音标签实时匹配测试
xiaoyuQaQ95 Oct 12, 2026
d1e5bc3
feat:接入 ECS 音频回看与等待
xiaoyuQaQ95 Oct 12, 2026
f4132d5
fix:修正音频等待截止时的积压误报
xiaoyuQaQ95 Oct 12, 2026
fb7e1b0
fix:按脚本时限结束音频等待
xiaoyuQaQ95 Oct 12, 2026
c8d1ea5
feat:为声音标签试听显示播放位置
xiaoyuQaQ95 Oct 12, 2026
7a10753
feat:支持读取音频等待最高分并补全示例
xiaoyuQaQ95 Oct 13, 2026
8ede766
feat:优化声音标签录制与暂停定位试听
xiaoyuQaQ95 Oct 13, 2026
13713d8
fix:修正测试路径转义并统一文件末尾格式
xiaoyuQaQ95 Oct 13, 2026
c3362d3
fix:修正音频导入与重连隔离问题
XiaoyuBook Oct 13, 2026
75a7fd9
docs:补全声音标签的 ECS 接入与排错说明
XiaoyuBook Oct 13, 2026
b56a1af
feat:按脚本位置自动创建声音标签目录
XiaoyuBook Oct 13, 2026
44910f2
fix:修正声音标签保存目录层级
XiaoyuBook Oct 13, 2026
c3a0c6f
feat:改为后台声音标签加载与累计评分
XiaoyuBook Oct 19, 2026
8050efc
fix:统一音频匹配整数评分
XiaoyuBook Oct 19, 2026
a4ed2c6
fix:完成音频分支与新宿主集成
XiaoyuBook Oct 19, 2026
1960490
Merge pull request #77 from XiaoyuBook/codex/audio-label-editor
ca1e Oct 19, 2026
d76e569
Merge pull request #80 from axechaso/fix/maa-p2-acceptance-20261019
ca1e Oct 19, 2026
715b5a1
fix(ci): require complete M18 evidence before upload
axechaso Oct 19, 2026
85c0dba
Merge pull request #81 from axechaso/fix/maa-m18-evidence-20261019
ca1e Oct 20, 2026
0c63ebf
fix: gate invalid compiles and export ECX from GUI
axechaso Oct 23, 2026
eb8b8dd
Merge pull request #82 from axechaso/fix/maa-m18-evidence-20261019
ca1e Oct 24, 2026
39e6a72
feat(drawing-board): port the Splatoon drawing board to the Avalonia GUI
SlenderData Oct 24, 2026
6e92b86
fix(drawing-board): stop immediately and wait for the draw to exit
SlenderData Oct 24, 2026
ccd2fe0
fix(drawing-board): abort drawing when the window is closed
SlenderData Oct 24, 2026
528d060
fix(drawing-board): stop drawing a lone dot in column 0 as a full row
SlenderData Oct 24, 2026
d946088
fix(drawing-board): reject images that are not 320x120
SlenderData Oct 24, 2026
d41374d
fix(drawing-board): re-enable Start and report the reason on draw errors
SlenderData Oct 24, 2026
c9abd39
fix(drawing-board): map preview clicks to canvas coordinates by size
SlenderData Oct 24, 2026
17b1812
fix(drawing-board): estimate time by summing the actual key sequence
SlenderData Oct 24, 2026
92d3244
fix(drawing-board): treat transparent pixels as white
SlenderData Oct 24, 2026
fe2be55
fix(drawing-board): validate input parameters
SlenderData Oct 24, 2026
84959f0
feat(drawing-board): take exclusive input through the script run lease
SlenderData Oct 25, 2026
d0ab744
feat(drawing-board): add a progress bar with elapsed and remaining time
SlenderData Oct 25, 2026
ae66bec
refactor(drawing-board): stop mutating scan results while drawing
SlenderData Oct 25, 2026
e5c55ac
refactor(drawing-board): rewrite the ported algorithm with readable n…
SlenderData Oct 25, 2026
7e04311
perf(drawing-board): decode the loaded image only once
SlenderData Oct 25, 2026
a6b082a
feat(drawing-board): localize the drawing board
SlenderData Oct 25, 2026
98ae65d
feat(drawing-board): make the window usable on small screens
SlenderData Oct 25, 2026
d5f72e7
fix(drawing-board): own dialogs by the drawing board window
SlenderData Oct 25, 2026
9142c3d
feat(drawing-board): scale the preview with the window in both direct…
SlenderData Oct 25, 2026
547b6fc
feat(drawing-board): adjustable threshold with a binarized preview
SlenderData Oct 25, 2026
57eeefc
feat(drawing-board): fit pictures of any size onto the canvas
SlenderData Oct 25, 2026
5700cc0
test(drawing-board): fix a flaky dialog ownership test
SlenderData Oct 25, 2026
f4a564c
feat(drawing-board): optional Floyd-Steinberg dithering
SlenderData Oct 25, 2026
23971cb
feat(drawing-board): choose among several dithering algorithms
SlenderData Oct 25, 2026
b414109
feat(drawing-board): rotate and flip the source picture
SlenderData Oct 25, 2026
c5e27e8
feat(drawing-board): show the time estimate automatically
SlenderData Oct 25, 2026
379d770
feat(drawing-board): add an eraser mode for pre-filled canvases
SlenderData Oct 25, 2026
1bb0987
feat(drawing-board): save the previewed picture as PNG
SlenderData Oct 26, 2026
0278fb0
feat(drawing-board): drag-and-drop, more formats and cover framing
SlenderData Oct 26, 2026
7a1e3f8
refactor(drawing-board): split oversized drawing board files
SlenderData Oct 26, 2026
9441a99
feat(drawing-board): pause/resume, live progress preview and region s…
SlenderData Oct 26, 2026
050eb84
feat(drawing-board): pixel-art scaling, tone controls, speck removal …
SlenderData Oct 27, 2026
0d2d93e
fix(drawing-board): stop outline mode from framing the canvas when in…
SlenderData Oct 27, 2026
335a4bb
fix(drawing-board): apply invert as the last processing step
SlenderData Oct 27, 2026
a54a24e
fix(drawing-board): keep the picture visible outside a selected region
SlenderData Oct 27, 2026
81a7fbe
feat(drawing-board): reorganize the window into a toolbar and setting…
SlenderData Oct 27, 2026
52031d7
feat(drawing-board): reset-all button, drop hint and leaner status row
SlenderData Oct 27, 2026
6391bc4
docs: add a user guide for the Splatoon drawing board
SlenderData Oct 27, 2026
6400706
docs: polish the drawing board user guide wording
SlenderData Oct 27, 2026
73636d8
feat(drawing-board): home the cursor before drawing and learn real ti…
SlenderData Oct 27, 2026
6384fcf
docs(drawing-board): document homing, learned overhead and threading …
SlenderData Oct 27, 2026
7fa6b67
feat(drawing-board): keep the computer awake while drawing
SlenderData Oct 27, 2026
8787f0b
Merge pull request #83 from SlenderData/feat/splatoon-drawing-board
ca1e Oct 30, 2026
3d41140
feat(device): extend pokeldn pad support to ESP32-S3 service
yciu Oct 30, 2026
2653860
Merge pull request #84 from yciu/feat/pokeldn-pad-upstream
ca1e Nov 1, 2026
f83f6a1
refactor(device): separate serial protocols from bridge endpoints
yciu Nov 1, 2026
82555df
Merge pull request #85 from yciu/codex/generic-device-connections
ca1e Nov 1, 2026
1d742f2
feat(cli): scaffold script projects with safe file creation
ca1e Nov 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 0 additions & 2 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ indent_style = space
tab_width = 4

# 新行首选项
end_of_line = crlf
insert_final_newline = false

#### .NET 编码约定 ####
Expand Down Expand Up @@ -253,7 +252,6 @@ dotnet_naming_style.begins_with_underline.capitalization = camel_case
csharp_style_prefer_primary_constructors = true:suggestion

[*.{cs,vb}]
end_of_line = crlf
dotnet_style_qualification_for_field = false:silent
dotnet_style_qualification_for_property = false:silent
dotnet_style_qualification_for_method = false:silent
Expand Down
190 changes: 184 additions & 6 deletions .github/workflows/ci-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ env:
DOTNET_VERSION: '10.0.x'
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_NOLOGO: 1
ECSVM_REQUIRE_CC: 1

jobs:
# ========================================
Expand All @@ -47,29 +48,35 @@ jobs:
runs-on: windows-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.workflow_run.head_sha || github.event.pull_request.head.sha || github.sha }}

- name: 安装 .NET SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: ${{ env.DOTNET_VERSION }}

- name: 检查代码格式
run: dotnet format --verbosity diagnostic
run: dotnet format --verify-no-changes --verbosity diagnostic

# ========================================
# 2. 构建 + 测试 (Debug)
# ========================================
build-and-test:
runs-on: windows-latest
needs: format
env:
EASYCON_CONNECTION_RENDER_DIR: ${{ github.workspace }}/acceptance-connection
EASYCON_CONNECTION_RESULTS_DIR: ${{ github.workspace }}/TestResultsConnection
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.workflow_run.head_sha || github.event.pull_request.head.sha || github.sha }}

- name: 安装 .NET SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
ref: ${{ github.event.workflow_run.head_branch }}

- name: 缓存 NuGet 包
uses: actions/cache@v4
Expand All @@ -81,13 +88,184 @@ jobs:
- name: 还原 NuGet 包
run: dotnet restore

- name: 构建 ecs-vm(无 C 工具链则跳过)
- name: 构建 ecs-vm 普通与 budget 档(必须有 C99 工具链)
shell: bash
run: sh ci/build-vm.sh
run: sh ci/build-vm.sh budget

- name: Build (Debug)
run: dotnet build --no-restore --configuration Debug

- name: 安装并强制执行真实 Maa OCR 试点测试
shell: pwsh
run: ./ci/prepare-maa-ocr.ps1 -Configuration Debug

- name: 运行 EasyCon 测试
shell: cmd
run: ci\test.bat Debug
run: dotnet test EasyCon2.slnx --no-build -c Debug --logger trx --results-directory TestResults

- name: Maa 原生宿主无硬件自检
run: dotnet run --no-build -c Debug --project src/EasyCon2.CLI -- maa doctor | Tee-Object maa-runtime.json

- name: 上传宿主与测试验收记录
if: always()
uses: actions/upload-artifact@v6
with:
name: host-p1-tests
path: |
TestResults/*.trx
maa-runtime.json

- name: 串行运行真实窗口保存快捷键回归
run: >-
dotnet test test/EasyCon2.Avalonia.UiTests/EasyCon2.Avalonia.UiTests.csproj
--configuration Debug --no-build
--filter "FullyQualifiedName~MainWindowSaveTests.CtrlS_SavesLatestEditorTextFromTheFocusedEditor"

- name: 验证连接区证据完整性门禁的回归用例
shell: pwsh
run: ./ci/test-connection-evidence.ps1

- name: 串行运行连接区 M18 渲染与交互回归
run: >-
dotnet test test/EasyCon2.Avalonia.UiTests/EasyCon2.Avalonia.UiTests.csproj
--configuration Debug --no-build
--filter "FullyQualifiedName~MainWindowSaveTests.ConnectionPanels_Render"
--logger "trx;LogFileName=connection-m18.trx"
--results-directory "${{ env.EASYCON_CONNECTION_RESULTS_DIR }}"

- name: 上传前校验完整 M18 证据
id: connection-evidence
if: always()
shell: pwsh
run: >-
./ci/verify-connection-evidence.ps1
-RenderDirectory $env:EASYCON_CONNECTION_RENDER_DIR
-TrxPath (Join-Path $env:EASYCON_CONNECTION_RESULTS_DIR 'connection-m18.trx')

- name: 上传完整 M18 截图、结构化记录与测试结果
uses: actions/upload-artifact@v6
if: ${{ always() && steps.connection-evidence.outcome == 'success' }}
with:
name: connection-m18
if-no-files-found: error
path: |
${{ env.EASYCON_CONNECTION_RENDER_DIR }}/*.png
${{ env.EASYCON_CONNECTION_RENDER_DIR }}/*.json
${{ env.EASYCON_CONNECTION_RESULTS_DIR }}/connection-m18.trx

- name: 发布 Windows 验收包
shell: pwsh
run: |
dotnet publish src/EasyCon2.CLI -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o dist/p2-win-x64
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
dotnet publish src/EasyCon2.Avalonia -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o dist/p2-win-x64
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
Copy-Item .ci-maa-ocr dist/p2-win-x64/maa-ocr-pilot -Recurse
if (Test-Path assets/fw) { Copy-Item assets/fw dist/p2-win-x64/Firmware -Recurse }
& dist/p2-win-x64/EasyCon2.CLI.exe maa doctor --ocr-profile dist/p2-win-x64/maa-ocr-pilot/ocr-profile.json | Tee-Object dist/p2-win-x64/maa-runtime.json
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
git rev-parse HEAD | Set-Content dist/p2-win-x64/COMMIT.txt
Compress-Archive dist/p2-win-x64/* dist/EasyCon2-p2-win-x64.zip
- uses: actions/upload-artifact@v6
with:
name: easycon2-p2-win-x64
path: dist/EasyCon2-p2-win-x64.zip
retention-days: 30

native-abi:
runs-on: ubuntu-latest
needs: format
strategy:
fail-fast: false
matrix:
bits: [64, 32]
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.workflow_run.head_sha || github.event.pull_request.head.sha || github.sha }}
- uses: actions/setup-dotnet@v5
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: 安装 32 位 C 运行库与工具链
if: matrix.bits == 32
run: sudo apt-get update && sudo apt-get install -y gcc-multilib
- name: 指定实际 C 编译器
shell: bash
run: |
if [ "${{ matrix.bits }}" = "32" ]; then
chmod +x ci/cc32.sh
echo "ECSVM_CC=$PWD/ci/cc32.sh" >> "$GITHUB_ENV"
else
echo "ECSVM_CC=/usr/bin/gcc" >> "$GITHUB_ENV"
fi
- name: 普通与 budget 构建及容量门禁
run: sh ci/build-vm.sh budget | tee vm-budget-${{ matrix.bits }}.txt
- name: 执行 C# 与 C VM 差分及 P0 ABI 回归
run: >-
dotnet test test/EasyCon.Tests/EasyCon.Tests.csproj -c Release
--filter "FullyQualifiedName~Bytecode"
--logger "trx;LogFileName=native-${{ matrix.bits }}.trx"
--results-directory TestResults
- name: 上传原生验收记录
if: always()
uses: actions/upload-artifact@v6
with:
name: cvm-p0-${{ matrix.bits }}
path: |
vm-budget-*.txt
TestResults/*.trx

build-macos:
if: github.event_name != 'workflow_run'
runs-on: macos-14
needs: format
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- uses: actions/setup-dotnet@v5
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props') }}
restore-keys: ${{ runner.os }}-nuget-
- name: 检查 AVFoundation 真实枚举入口(无设备可返回空列表,不请求权限)
shell: bash
run: |
set -o pipefail
dotnet run --project src/EasyCon2.CLI -c Release -- video --list | tee macos-video-sources.txt
- name: 安装并强制执行真实 Maa OCR 试点测试
shell: pwsh
run: ./ci/prepare-maa-ocr.ps1
- name: 运行 P1 选源和 P2 原生识别回归
shell: bash
run: |
dotnet test test/EasyCon.Tests -c Release --filter "FullyQualifiedName~MaaVisionTests|FullyQualifiedName~MaaOcrTests|FullyQualifiedName~HostProfileRegressionTests" --logger trx --results-directory TestResults
- name: 打包 macOS .app
shell: bash
env:
CI: "true"
run: bash ci/macos-app.sh
- name: 检查发布包的枚举入口并打包
shell: bash
run: |
set -o pipefail
dist/publish/EasyCon.app/Contents/MacOS/ezcon video --list | tee macos-published-video-sources.txt
cp -R .ci-maa-ocr dist/publish/EasyCon.app/Contents/MacOS/maa-ocr-pilot
dist/publish/EasyCon.app/Contents/MacOS/ezcon maa doctor --ocr-profile dist/publish/EasyCon.app/Contents/MacOS/maa-ocr-pilot/ocr-profile.json | tee macos-published-maa-runtime.json
git rev-parse HEAD > dist/publish/EasyCon.app/Contents/MacOS/COMMIT.txt
version="$(git rev-parse --short HEAD)"
ditto -c -k --sequesterRsrc --keepParent dist/publish/EasyCon.app "dist/EasyCon2-${version}-macos-arm64.zip"
- uses: actions/upload-artifact@v6
if: always()
with:
name: easycon2-macos-arm64
path: |
dist/*.zip
macos-video-sources.txt
macos-published-video-sources.txt
macos-published-maa-runtime.json
TestResults/*.trx
if-no-files-found: error
retention-days: 30
31 changes: 28 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ env:
DOTNET_VERSION: '10.0.x'
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_NOLOGO: 1
ECSVM_REQUIRE_CC: 1

jobs:
# ========================================
Expand Down Expand Up @@ -74,10 +75,24 @@ jobs:
- name: 还原 NuGet 包
run: dotnet restore

- name: 运行 EasyCon 测试
- name: 构建 ecs-vm 普通与 budget 档
shell: bash
run: sh ci/build-vm.sh budget

- name: 安装并强制执行真实 Maa OCR 试点测试
shell: pwsh
run: ./ci/prepare-maa-ocr.ps1

- name: 运行 EasyCon 全量测试
shell: cmd
run: ci\test.bat

- name: 串行运行真实窗口保存快捷键回归
run: >-
dotnet test test/EasyCon2.Avalonia.UiTests/EasyCon2.Avalonia.UiTests.csproj
--configuration Release --no-build
--filter "FullyQualifiedName~MainWindowSaveTests.CtrlS_SavesLatestEditorTextFromTheFocusedEditor"

- name: 发布 EasyCon2
shell: cmd
run: ci\windows-x64.bat
Expand Down Expand Up @@ -113,9 +128,19 @@ jobs:
- name: 还原 NuGet 包
run: dotnet restore

- name: 构建 ecs-vm(无 C 工具链则跳过)
- name: 构建 ecs-vm 普通与 budget 档
shell: bash
run: sh ci/build-vm.sh
run: sh ci/build-vm.sh budget

# macOS 自带 /usr/bin/clang:CvmRunner 能现场编译 ecs-vm,
# 使托管解释器 ↔ C VM 的差分对拍(Cvm/Corpus/Fuzz/FullChain/Abi)真正执行。
# 这是双端语义漂移的唯一机械防线,勿移除。
- name: 安装并强制执行真实 Maa OCR 试点测试
shell: pwsh
run: ./ci/prepare-maa-ocr.ps1

- name: 运行 EasyCon 测试(含 C VM 差分对拍)
run: dotnet test EasyCon2.slnx -c Release

- name: 打包 macOS .app
shell: bash
Expand Down
22 changes: 22 additions & 0 deletions .github/workflows/format-fix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ concurrency:

jobs:
format-fix:
if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
runs-on: windows-latest
permissions:
contents: write
Expand Down Expand Up @@ -55,3 +56,24 @@ jobs:
git add .
git commit -m "style: auto-fix dotnet format [skip ci]"
git push

format-fork-check:
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
runs-on: windows-latest
permissions:
contents: read

steps:
- uses: actions/checkout@v6
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
ref: ${{ github.event.pull_request.head.sha }}
persist-credentials: false

- name: 安装 .NET SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'

- name: 检查 fork PR 代码格式
run: dotnet format EasyCon2.slnx --verify-no-changes --verbosity diagnostic
Loading
Loading