Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
203 commits
Select commit Hold shift + click to select a range
d9ede8e
refactor(ocr): replace mxnet/cnocr backend with onnxruntime
Joxos Aug 14, 2026
b0196e1
chore(tooling): migrate to uv and ruff, upgrade web dependencies
Joxos Aug 14, 2026
ff263d4
refactor(webui): replace pywebio GUI with FastAPI REST + WebSocket API
Joxos Aug 14, 2026
c8e4493
feat(shell): replace Electron with Tauri 2 and Vue 3 SPA
Joxos Aug 14, 2026
c0d366e
feat(webui): restructure pages to match the original layout
Joxos Aug 14, 2026
cdabede
chore: ignore MaaFramework runtime checkout, drop empty dir artifact
Joxos Aug 14, 2026
bf3e8e7
fix(webui): language switching, theme-adaptive controls and aside dro…
Joxos Aug 14, 2026
af7cc91
chore: ignore runtime checkout directories
Joxos Aug 14, 2026
53d742c
fix(webui): migrate full original styles, reactive language switch, d…
Joxos Aug 14, 2026
06bd940
fix(webui): port dark/light theme shell styles from dark-alas.css/lig…
Joxos Aug 14, 2026
963bf8c
fix(webui): aside icons matching the original layout
Joxos Aug 14, 2026
c43814c
fix(webui): seven style and rendering issues
Joxos Aug 14, 2026
b4ba4f9
fix(webui): nine refinement items against the original
Joxos Aug 14, 2026
97e9abc
refactor(shell): migrate the SPA from Vue 3 to Svelte 5
Joxos Aug 14, 2026
81a4f27
fix(webui): collapse flicker, favicon, navigator and layout metrics
Joxos Aug 14, 2026
f569c7b
fix(webui): aside icon colors per theme, original Alas window icons
Joxos Aug 14, 2026
1fcefa3
fix(webui): six layout/style details against the original
Joxos Aug 14, 2026
b20e9bd
fix(webui): bare buttons inherit the theme text color
Joxos Aug 14, 2026
c2786ab
fix(webui): align hover colors, overview grid, tool page and updater …
Joxos Aug 14, 2026
2015eee
chore: drop unused updater color styles
Joxos Aug 14, 2026
5b14c98
fix(webui): button metrics and details measured against the original
Joxos Aug 14, 2026
5b71b0c
fix(webui): root backgrounds, icon png, state labels, shared accent v…
Joxos Aug 14, 2026
1b53966
fix(webui): log color, running row height, menu gap, theme accent pri…
Joxos Aug 14, 2026
cf0b3f5
fix(template): restore grayscale GIF frames wrapped as RGB by imageio…
Joxos Aug 15, 2026
7c3ede1
chore(gitignore): ignore .qoder workspace directory
Joxos Aug 15, 2026
b5f2f27
merge: restore local dev line (ocr onnxruntime, uv, webui)
Joxos Aug 15, 2026
e4342f2
fix(build): sync requirements with pyproject.toml
Joxos Aug 15, 2026
adb5a19
fix(aidlux): parse >= constraints in requirements generator
Joxos Aug 15, 2026
5c78636
chore(docs): move docs out of git tracking into .qoder workspace
Joxos Aug 15, 2026
b9a977a
chore(deps): stage A baseline (py3.13, numpy 2.5, pydantic v2, fastap…
Joxos Aug 15, 2026
363c86e
fix(webui): restore colored logs (ANSI render + theme-aware frontend …
Joxos Aug 15, 2026
1817c2e
fix(base): strip UTF-8 BOM from module/base/utils.py (ruff format crash)
Joxos Aug 15, 2026
cd580b0
chore(lint): stage B-2 round 1 — expand ruff rules, format codebase, …
Joxos Aug 15, 2026
7160315
chore(lint): stage B-2 round 2 — fix B006/B007/B023/E721/B032/F601/F7…
Joxos Aug 15, 2026
9e88fda
refactor(base): use project cached_property instead of external cache…
Joxos Aug 15, 2026
004845c
refactor(imports): expand non-data-bundle star imports to explicit im…
Joxos Aug 15, 2026
2ad3469
chore(tooling): add pyright (baseline 2117 errors) + pyrightconfig, d…
Joxos Aug 15, 2026
704dcb4
fix(imports): restore re-export imports removed by F401 auto-fix (Tem…
Joxos Aug 15, 2026
d54f33c
refactor(game_setting): annotate Field.default as Any (mixed int/floa…
Joxos Aug 15, 2026
df7c3bc
revert game_setting Field default annotation to original with noqa F722
Joxos Aug 15, 2026
1e44489
perf(webui): incremental log rendering (append-only DOM, backend rend…
Joxos Aug 15, 2026
b5b92c5
Revert "perf(webui): incremental log rendering (append-only DOM, back…
Joxos Aug 15, 2026
3e88d0e
revert(webui): remove colored logs, back to plain text rendering
Joxos Aug 15, 2026
eb8e8b2
fix(map_detection): wrap generator in list for np.vstack (numpy 2 req…
Joxos Aug 15, 2026
b3bdb1e
perf(cpu): cap opencv/onnxruntime thread pools and lower automation p…
Joxos Aug 15, 2026
1e72431
Revert "revert(webui): remove colored logs, back to plain text render…
Joxos Aug 15, 2026
456d4f5
Reapply "perf(webui): incremental log rendering (append-only DOM, bac…
Joxos Aug 15, 2026
14ae1b2
chore(dev): expose vite dev server on LAN and update gitignore for ru…
Joxos Aug 15, 2026
1b9b949
feat(webui): set default theme to dark
Joxos Aug 15, 2026
db74298
refactor(webui): split 545-line single-file FastAPI app into APIRoute…
Joxos Aug 15, 2026
5a840d4
feat(webui): dev CORS middleware gated by ALAS_CORS_ORIGINS env (vite…
Joxos Aug 15, 2026
d5fea50
feat(webui): replace /ws polling with SSE stream (server-sent events)
Joxos Aug 15, 2026
d3afab7
feat(ocr): dynamic batch, per-model lock, crash watchdog, client reco…
Joxos Aug 15, 2026
62423fb
chore: remove legacy --electron naming and stale mxnet comments (phas…
Joxos Aug 15, 2026
515aa8c
fix(webui): restore /ws as compatibility shim so pre-SSE SPA bundles …
Joxos Aug 15, 2026
88a14ca
fix(shell): repair shell-backend links (phase D-1)
Joxos Aug 15, 2026
525249b
chore(webapp): toolchain modernization (phase D-2)
Joxos Aug 15, 2026
37ebe09
chore: anchor generic Python-artifact gitignore rules to repo root (l…
Joxos Aug 15, 2026
9546662
feat(packaging): updater plugin + PyInstaller sidecar skeleton (phase…
Joxos Aug 15, 2026
dad11d7
chore: track the hand-authored PyInstaller spec (un-ignore deploy/pac…
Joxos Aug 15, 2026
4c9feb7
refactor(webui): converge component colors onto shared CSS design tok…
Joxos Aug 15, 2026
01f8f2a
chore(webui): drop the /ws shim now that dist is rebuilt against /sse…
Joxos Aug 15, 2026
d96ec22
chore(shell): track Cargo.lock and the regenerated tauri ACL schemas …
Joxos Aug 15, 2026
e147df3
fix(shell): add updater pubkey config; fix Home overview missing scro…
Joxos Aug 16, 2026
988fefb
fix(webui): translate state-field option values and make Scheduler.Ne…
Joxos Aug 16, 2026
235e447
fix(webui): numeric select options rendered blank (Fleet index/step e…
Joxos Aug 16, 2026
7016d3b
fix(gui): Ctrl+C left the uvicorn child orphaned; reap it on every ex…
Joxos Aug 16, 2026
025ef42
fix(os): restore ndarray arithmetic reverted by the B-2 RUF005 auto-fix
Joxos Aug 16, 2026
d3c0243
feat(webui): push live scheduler state from the bot to the overview c…
Joxos Aug 16, 2026
0647b5e
refactor(webui): go full push for status/scheduler reads; silence uvi…
Joxos Aug 16, 2026
3ace161
fix(webui): restore one-shot REST scheduler bootstrap at mount
Joxos Aug 16, 2026
b837f66
chore(refactor): baseline import smoke script + recorded baseline (35…
Joxos Aug 16, 2026
3eff9a1
refactor(core): split module/base/utils.py god module into module/cor…
Joxos Aug 16, 2026
98e881f
refactor(imports): annotate all 169 intentional star imports with noq…
Joxos Aug 16, 2026
aa5bff8
fix(dev_tools): correct annotate_star_imports.py top-level exclusion …
Joxos Aug 16, 2026
480dda5
refactor(packages): add __init__.py to all 59 module/ directories (P1.3)
Joxos Aug 16, 2026
d426f9e
refactor(tasks): replace ~70 alas.py boilerplate methods with declara…
Joxos Aug 16, 2026
69f033e
chore(imports): annotate star imports in campaign/ and submodule/ (P1…
Joxos Aug 16, 2026
06831d7
refactor(ui): centralize ui->business asset imports in assets_bridge.…
Joxos Aug 16, 2026
29f06b2
refactor(scheduler): extract TaskRecord from alas.py scheduler loop (…
Joxos Aug 16, 2026
0ad66d0
refactor(device): add DeviceBase protocol contract + Device capabilit…
Joxos Aug 17, 2026
99db749
fix(device): patch pkg_resources in method/utils.py; add delivery ver…
Joxos Aug 17, 2026
85e6f63
refactor(scheduler): extract scheduler loop into Scheduler mixin (P2.3)
Joxos Aug 17, 2026
1aff8bf
refactor(layers): cut base/device/config upward dependency inversions…
Joxos Aug 17, 2026
078c139
test: add pytest test foundation and CI (S7)
Joxos Aug 17, 2026
bc25fee
feat(webui): redirect all unmatched paths to the SPA home page
Joxos Aug 17, 2026
3751d58
feat(webui): redirect unknown hash routes to home in the SPA router
Joxos Aug 17, 2026
e75bac3
refactor(logger): rewrite the logging stack on loguru (L1)
Joxos Aug 17, 2026
e3102a5
feat(scheduler): bind the task name to every log record during run (L3)
Joxos Aug 17, 2026
e02e353
fix(alas): annotate stop_event as Event | None (pre-existing pyright …
Joxos Aug 17, 2026
adf397e
refactor(logger): remove old-adaptation remnants from the loguru rewrite
Joxos Aug 17, 2026
1bbafe8
refactor(logger): drop legacy stdlib logging config remnants
Joxos Aug 17, 2026
a19feb5
refactor(deploy): remove dead if-False Uiautomator2 Init blocks
Joxos Aug 17, 2026
7f17e56
refactor(logger): drop the obsolete basicConfig neutralization
Joxos Aug 17, 2026
92bf262
chore(cleanup): remove old tech stack remnants found by full sweep
Joxos Aug 17, 2026
e2f4ea9
refactor(deploy): remove AidLux and the legacy toolkit installer
Joxos Aug 17, 2026
de1f7ff
chore(lint): clean module/config ruff findings; sync generated deploy…
Joxos Aug 17, 2026
b5394af
chore(quality): frontend biome fixes, dependency declarations, pytest…
Joxos Aug 17, 2026
43c6cbf
test(routing): migrate webui routing tests off starlette TestClient
Joxos Aug 17, 2026
94386bb
test(routing): hoist dist-built check out of async tests (ASYNC240)
Joxos Aug 17, 2026
d816310
Merge pull request #5898 from LmeSzinc/dev
LmeSzinc Aug 17, 2026
681a6ce
fix(logger): restore pre-loguru rich styles for console and webui log…
Joxos Aug 18, 2026
7c41250
chore(deps): sync uv.lock with pyproject dependencies
Joxos Aug 18, 2026
66a035e
refactor(deploy): keep only source/tauri/docker forms, drop self-upda…
Joxos Aug 18, 2026
f5dc3e3
fix(tasks): route campaign kwargs to run() instead of the constructor
Joxos Aug 18, 2026
8e47208
Merge remote-tracking branch 'origin/master'
Joxos Aug 18, 2026
4a2db0f
fix(webui): define ANSI palette CSS vars so log level/time colors res…
Joxos Aug 18, 2026
79a13d0
feat(webui): migrate shell styling to UnoCSS with token-based themes
Joxos Aug 18, 2026
ffb0b3e
fix(webui): button metrics, cursors and manage table i18n
Joxos Aug 18, 2026
64c28f8
chore: remove OCR RPC server and pip-era toolchain leftovers
Joxos Aug 18, 2026
57809c5
docs: codebase audit report and cleanup plan
Joxos Aug 18, 2026
fd257df
dev: add rope to dev group and AST-based find_refs tool
Joxos Aug 18, 2026
652f1e1
deps: remove unused prettytable, aiofiles, pycryptodome, wrapt, anyio
Joxos Aug 18, 2026
5e6be43
fix(dev): bind loop vars in find_refs closure (B023)
Joxos Aug 18, 2026
513413d
lint: fix redundant conversion rules (C4xx, RUF046, RUF015)
Joxos Aug 18, 2026
a0e6291
lint: fix SIM210/RUF007/SIM109/UP028/SIM110 via auto-fix
Joxos Aug 18, 2026
d665405
lint: fix E731/B008/SIM116/B005, drop 4 more ignore entries
Joxos Aug 18, 2026
7c71dc6
lint: sort imports after pairwise fixes (I001)
Joxos Aug 18, 2026
be05e47
lint: fix E722/SIM105 positively, drop 20 ignore entries total (34->14)
Joxos Aug 18, 2026
995a306
chore(dead-code): remove unreachable returns, DockScanner class, unus…
Joxos Aug 18, 2026
1f25337
chore(dead-code): remove 26 unused functions in base/config/deploy layer
Joxos Aug 18, 2026
a924102
chore: drop stray temp file
Joxos Aug 18, 2026
790bfd0
chore(dead-code): remove 29 unused device-layer methods (scrcpy/pool/…
Joxos Aug 18, 2026
cf42a3e
chore: drop temp batch file
Joxos Aug 18, 2026
e36bb97
chore(dead-code): remove handler-layer dead code incl. uiautomator2 X…
Joxos Aug 18, 2026
0bba958
chore(dead-code): remove 19 map/detection/os-layer unused methods
Joxos Aug 18, 2026
6da401f
chore: drop temp batch file
Joxos Aug 18, 2026
7f44c31
chore(dead-code): remove 40 unused business-layer methods and dead as…
Joxos Aug 18, 2026
56580ed
chore(dead-code): remove 41 more unused methods from rescan, restore …
Joxos Aug 18, 2026
1b702d6
docs: Phase 4/5/6 detailed plans with pilot reports (4A equivalence P…
Joxos Aug 18, 2026
285d74c
refactor(webui): rewrite styling utility-first on UnoCSS (v2)
Joxos Aug 19, 2026
7ea8531
docs: move UNOCSS plan docs into .qoder/doc (local notes)
Joxos Aug 19, 2026
5f96ece
fix: restore device-detection property, console tracebacks, setuptool…
Joxos Aug 19, 2026
867e2a7
fix: restore three more properties removed as dead code but still used
Joxos Aug 19, 2026
a053c4a
fix(webui): log box alignment, pre-push logs on SSE connect, running-…
Joxos Aug 19, 2026
3216b32
feat(fork): brand home page and README, fix dev-mode i18n, py3.12+ di…
Joxos Aug 19, 2026
63038e3
fix(desktop): reliable backend spawn and startup failure surfacing
Joxos Aug 19, 2026
e4f0a4f
fix(desktop): working window controls, tray menu, close quits cleanly
Joxos Aug 19, 2026
d2d939a
chore(desktop): sync Cargo.lock and regenerated capability schema
Joxos Aug 19, 2026
8c8115c
fix(desktop): grant app commands ACL for remote origin, wildcard ports
Joxos Aug 20, 2026
0ffd8b7
refactor(desktop): native window controls, drop the custom IPC chain
Joxos Aug 20, 2026
6248ba8
chore(desktop): update stale comment referencing removed window_close
Joxos Aug 20, 2026
2e1c203
feat(updater): release-based update channel (backend + frontend + sid…
Joxos Aug 20, 2026
260a34a
fix(desktop): file-stdio backend spawn, sidecar packaging, 0.1.0 rele…
Joxos Aug 20, 2026
728321c
fix(updater): installer survives job teardown (CREATE_BREAKAWAY_FROM_…
Joxos Aug 20, 2026
af4c3fd
fix(ci): green pipelines - scoped pyright gates, pnpm version, frozen…
Joxos Aug 20, 2026
ed41ae3
fix(release): deterministic asset copy - expression-based name, fail …
Joxos Aug 20, 2026
afcab3d
http readiness, install-dir data, drop backend glue (0.1.2)
Joxos Aug 21, 2026
4cdd481
fix(shell): mode decision independent of launch CWD
Joxos Aug 21, 2026
b5dee2d
fix(shell): allow job breakaway so the updater installer survives she…
Joxos Aug 21, 2026
7f44c54
release: date-based versions (260821), update release docs
Joxos Aug 21, 2026
1a71dd8
release: tag naming vYYYY.MM.DD (release title matches tag)
Joxos Aug 21, 2026
34a0c8c
fix(webui): select config saves lost - store string values with schem…
Joxos Aug 22, 2026
5b385cc
chore(phase456): S0 baseline snapshots
Joxos Aug 22, 2026
4a22f8d
refactor(phase456): S1.1 config regeneration entry + zero-drift verify
Joxos Aug 22, 2026
842304a
chore(phase456): S1.2 sync stale generated config artifacts
Joxos Aug 22, 2026
9308c92
refactor(phase456): S2.1 task family tags in registry
Joxos Aug 22, 2026
deacc86
refactor(phase456): S2.2 derive task families from registry, table-dr…
Joxos Aug 22, 2026
f1d69c9
Cherry-pick upstream 21a5d516c: mode-specific MAP_PREPARATION for nor…
Tianming-Wu Aug 27, 2026
6ec24bb
Port upstream game-update fixes: MAP_PREPARATION page assets + raid_2…
Joxos Aug 29, 2026
2dee1af
refactor(phase456): S3 split config_updater by responsibility
Joxos Aug 29, 2026
e10dc16
style(phase456): S2.2 follow-up remove redundant f-string prefixes
Joxos Aug 29, 2026
8d0f385
refactor(phase456): S4.1 assets semantic dump + verify tool
Joxos Aug 29, 2026
6413f55
refactor(phase456): S4.2 regenerate assets with four-server broadcast
Joxos Aug 29, 2026
5291d1a
refactor(phase456): S5.1 gems_farming config->strategy tables
Joxos Aug 29, 2026
6f860d1
refactor(phase456): S5.2 gems_farming role-change skeleton
Joxos Aug 29, 2026
4d302cc
refactor(phase456): S6 stage-name normalization moved to per-event me…
Joxos Aug 29, 2026
42ab4f0
refactor(phase456): S7.1 map data loader (json-first, legacy fallback)
Joxos Aug 29, 2026
f52a91a
refactor(phase456): S7.2 converter/loader hardening (road DSL, refs, …
Joxos Aug 29, 2026
6388417
refactor(phase456): S7.4-b1 data-driven maps: campaign_main
Joxos Aug 29, 2026
1502819
refactor(phase456): S7.4-b2 data-driven maps: campaign_hard, campaign…
Joxos Aug 29, 2026
4e4a3d2
refactor(phase456): S7.2b grid-value markers and import refs in loader
Joxos Aug 29, 2026
3619529
refactor(phase456): S7.4-b3 data-driven maps: war_archives_*
Joxos Aug 29, 2026
8c70235
refactor(phase456): S7.4-b3 data-driven maps: war_archives_* (remaining)
Joxos Aug 29, 2026
e1d786b
refactor(phase456): S7.2c loader shim registry for legacy siblings
Joxos Aug 29, 2026
7e63837
refactor(phase456): S7.4-b4 data-driven maps: event_* and war_archive…
Joxos Aug 29, 2026
6a4fa1f
refactor(phase456): S7.5 remove flatten generator
Joxos Aug 29, 2026
6636d64
ci(phase456): S8 equivalence gates in workflow
Joxos Aug 29, 2026
c35d0b5
chore(phase456): S9 final verification report
Joxos Aug 29, 2026
1ea13c4
refactor(phase456): followup-2 map data files JSON to YAML with row-a…
Joxos Aug 29, 2026
6920f99
refactor(phase456): followup-1a convert helper-class/data/map files, …
Joxos Aug 29, 2026
04879b6
refactor(phase456): followup-1b OCR rewrites moved to meta.json
Joxos Aug 29, 2026
3c81791
refactor(phase456): followup-1c shared event-entrance flow helpers (D2)
Joxos Aug 29, 2026
cffbe16
refactor(phase456): followup-1d battle_clear_roadblocks helper, 32 ex…
Joxos Aug 29, 2026
a2b4bce
merge: qoder/master (upstream fixes + raid_20260827 ui, island untouc…
Joxos Aug 29, 2026
7cd16b2
docs(phase456): followup final report and merge notes
Joxos Aug 29, 2026
d1feb12
refactor(phase456): followup-1e declarative battle patterns - 2472 me…
Joxos Aug 29, 2026
e0d1c5a
docs(phase456): note battle-pattern extraction
Joxos Aug 29, 2026
7b83d9d
refactor(phase456): followup-1f remove 754 pass-stub fragments and 3 …
Joxos Aug 29, 2026
a087dfb
docs(phase456): note stub removal and dead-map cleanup
Joxos Aug 29, 2026
411637f
fix(config): restore Gui.AppManage.Modified and Gui.Update.* i18n key…
Joxos Aug 29, 2026
2c6b677
fix(device): unify adb resolution - AdbConnectManager reuses the depl…
Joxos Aug 29, 2026
b3f88f3
fix(device): adbutils bundle adb lookup was broken on Windows (join a…
Joxos Aug 29, 2026
6ea5ca9
refactor(campaign): two load contracts for map vs logic modules
Joxos Aug 29, 2026
ec160af
fix(campaign): restore mojibake-corrupted regex char class in event_p…
Joxos Aug 29, 2026
cf2ff32
perf(webui): fix browser freeze from per-CJK-char spans in log view
Joxos Aug 29, 2026
96aa092
feat(webui): multi-instance selection, config rename/delete, live sch…
Joxos Aug 31, 2026
2e404ba
fix(webui): render {name} placeholder in i18n t()
Joxos Aug 31, 2026
9fe0f02
revert(webui): restore 1280x880 default window size
Joxos Aug 31, 2026
aff1037
fix(webui): stop phantom running task on stopped instances
Joxos Sep 1, 2026
6af80bf
chore(probe): OCR/CPU/frontend latency probes (temporary, revert me)
Joxos Sep 1, 2026
34c8c6c
build(packaging): add build.ps1 wrapper, document sidecar prerequisite
Joxos Sep 1, 2026
253b8e8
build(packaging): replace build.ps1 with pnpm scripts, anchor sidecar…
Joxos Sep 1, 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
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
51 changes: 51 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: CI

on:
push:
branches: [master, "refactor/*"]
pull_request:

jobs:
test:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Set up Python 3.13
run: uv python install 3.13

- name: Sync dependencies
run: uv sync --frozen

# The lint/type gates are scoped to the directories that are currently
# clean; widen them as the legacy codebase goes green (module/config,
# module/core and friends still carry pre-existing findings - the cv2
# stubs reject scalar/tuple image ops all over module/core).
- name: Lint (scoped)
run: uv run ruff check alas.py module/logger.py module/scheduler module/tasks module/core module/base module/device module/map_detection tests dev_tools/verify_alas_structure.py

- name: Type check (scoped)
run: uv run pyright module/logger.py module/scheduler module/tasks tests

- name: Import smoke (full tree)
run: uv run python dev_tools/smoke_import_all.py

- name: Structure verification
run: |
uv run python dev_tools/verify_alas_structure.py
uv run python dev_tools/verify_task_registry.py
uv run python dev_tools/verify_task_record.py

- name: Tests
run: uv run pytest tests -v

- name: Equivalence gates (Phase 456)
run: |
uv run python dev_tools/verify_config_generated.py
uv run python dev_tools/verify_task_families.py
uv run python dev_tools/verify_stage_meta.py
uv run python dev_tools/verify_map_data.py --all
uv run python dev_tools/verify_assets.py check .qoder/phase456/assets_before.json
73 changes: 73 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
name: Release

# Build the desktop release asset and publish it as a GitHub Release.
# A release is a single NSIS installer (shell + bundled sidecar); the
# installed app's updater (module/webui/updater.py) lists releases,
# downloads the installer and runs it silently - the installer replaces
# the shell and sidecar files and restarts the app.

on:
push:
# Version tags (vYYYY.MM.DD, e.g. v2026.08.21); see deploy/packaging/README.md
tags: ["v*"]
workflow_dispatch:

permissions:
contents: write

jobs:
release:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Set up Python 3.13
run: uv python install 3.13

- name: Set up pnpm
uses: pnpm/action-setup@v4
with:
version: 11

- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 24

# Main dependency group only; the dev group is not needed to package.
- name: Sync dependencies
run: uv sync --frozen --no-group dev

- name: Build frontend
working-directory: webapp-tauri
run: |
pnpm install --frozen-lockfile
pnpm build

- name: Build backend sidecar
run: |
uv tool install "pyinstaller>=6.19"
$env:PATH = "$env:USERPROFILE\.local\bin;$env:PATH"
pyinstaller --clean --noconfirm deploy/packaging/alas_backend.spec
# version.txt = the release tag; the updater reports it as the
# current version of the running build.
Set-Content -Path "dist/alas-backend/version.txt" -Value "$env:GITHUB_REF_NAME" -NoNewline

- name: Build NSIS installer
working-directory: webapp-tauri
env:
CI: "true"
run: |
pnpm tauri build
Copy-Item -ErrorAction Stop "src-tauri/target/release/bundle/nsis/*-setup.exe" "..\Alas_${{ github.ref_name }}_x64-setup.exe" -Force
Get-ChildItem "..\Alas_*" | ForEach-Object { $_.FullName }

- name: Publish release
uses: softprops/action-gh-release@v2
with:
generate_release_notes: true
files: |
Alas_${{ github.ref_name }}_x64-setup.exe
31 changes: 28 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ dev_tools/debug_tools
/campaign/test/
/toolkit
*.lock
!uv.lock
# The Tauri shell's lockfile is source-controlled (reproducible builds)
!webapp-tauri/src-tauri/Cargo.lock
config/reloadflag
config/reloadalas
test.py
Expand Down Expand Up @@ -112,8 +115,8 @@ dist/
downloads/
eggs/
.eggs/
lib/
lib64/
/lib/
/lib64/
parts/
sdist/
var/
Expand All @@ -130,6 +133,8 @@ MANIFEST
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Hand-authored packaging spec is source-controlled
!deploy/packaging/*.spec

# Installer logs
pip-log.txt
Expand Down Expand Up @@ -254,4 +259,24 @@ console.bat
.vscode/*

# Pylance configuration file
pyrightconfig.json
pyrightconfig.json
# Qoder files
.qoder/

# Python virtual environments created by uv
.venv*

# Tauri shell
webapp-tauri/node_modules/
webapp-tauri/src-tauri/target/
webapp-tauri/dist/
webapp-tauri/.env.development

# Runtime adb copied from adbutils (dev environment)
/bin/adb/

# Rope refactoring config
.ropeproject/

# Local pnpm content-addressable store (sandbox/dev artifact)
.pnpm-store/
58 changes: 58 additions & 0 deletions .qoder/phase456/FINAL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Phase456 终验报告(FINAL)

日期:2026-08-29(含 followup 三项 + 上游/支线合并)
分支:`refactor/phase456`(基线 master @ afcab3d13;已合并 qoder/master @ 6ec24bb25)

## Followup 终验门禁(最新)

| 门禁 | 结果 |
|---|---|
| ruff(scoped) / pyright(scoped) | 0 / 0 |
| smoke_import_all | 427/427 |
| verify_config_generated | ZERO DRIFT |
| verify_task_families | OK(8 族 18 任务) |
| verify_stage_meta | OK(1982 cases;27 meta.json) |
| verify_map_data --all | **1353/1353 maps OK,3 skipped(死导入)** |
| verify_assets check | OK(1345 buttons / 437 templates,含合并后新按钮) |
| pytest / 桥接导入 | 55 passed / ok |

## Followup 变更摘要
- 地图数据文件:JSON → **YAML(网格文本块为行数组)**,并修复 4A 遗留的 MAP.name 丢失 bug。
- 数据化补完:跳过 12 → 3(仅剩资产缺失的死导入地图);OCR 重写入 meta.json;
事件入口流 D2 三助手抽取(5 事件收敛);battle_clear_roadblocks 助手(32 处精确模式重写)。
- 合并:qoder/master(上游 5 修复 + MAP_PREPARATION_HARD/raid_20260827 UI 更新);
island 全面守护 0 改动;冲突仅 4 个 assets.py。raid_20260827 的 Readme 源行上游缺失,
其 args/i18n 选项按零漂移原则未保留(详见 NOTES.md)。

## 首次终验(合并前)

| 门禁 | 结果 |
|---|---|
| verify_map_data --all | 1348/1348 maps OK,12 skipped |
| pytest | 55 passed |
| 桥接导入(AlasMaa/AlasFpy) | ok |

## 规模变化

- campaign 树:1423 个 .py / 102,420 行 → **1348 个 .json + 片段 .py(纯逻辑)+ 12 个 legacy 跳过文件**
- assets.py:48 文件 **-28,996 行** 四服冗余(area/button 相同者广播为裸值)
- config_updater.py:825 行 → 4 模块 mixin 组合(225 行门面)
- 任务族:3 处手写列表 → registry family 标签单一来源
- 阶段名特判:~120 行 if 链 → 27 个 meta.json 规则表

## 用户真机自动化测试清单

1. 主线:Main 跑 12-4(或 2-4 快速图),确认地图加载/格子识别正常
2. 困难模式:Hard 任务(hard.py 走新 load_map)
3. 战争档案:WarArchives 任一(map_files 含 .json)
4. 活动图:任一 event(含 vsp/esp 别名事件,确认 stage 名规范化)
5. GemsFarming:一轮换船流程(确认 ChangeFlagship/ChangeVanguard 日志键与换船成功)
6. 配置重生成:`dev_tools/regenerate_config.py` 后 git 干净
7. 回滚演练:`git revert <4A 任一 batch commit>` 恢复旧路径

## 已知遗留(全部在 NOTES.md)

- 12 个跳过文件保持 legacy(自定义 Grid 类 / 历史损坏 import / actions 字典 / __main__ 块),占比 0.9%
- module/campaign/run.py 有 1 处既有 SIM105 lint(非本次改动面)
- OCR 结果重写(event_20240425_cn / event_20260417_cn)仍为事件级覆盖,未并入 meta.json(基类为 staticmethod 无 config 访问,需签名改造)
- 事件入口流(ui_goto_event)的 D2 抽取、battle_clear_roadblocks 助手(C5)未做,见 refined_plan 后续项
88 changes: 88 additions & 0 deletions .qoder/phase456/NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Phase456 执行笔记

## S0 基线(2026-08-22)
- ruff (scoped): exit 0
- pyright (scoped): exit 0
- smoke_import_all: Imported 424/424 modules(执行规格写 423/423,实际为 424/424)
- verify_alas_structure: exit 0
- verify_task_registry: exit 0(该脚本对比 master:alas.py,master 已完成 P1.4 注册表重构,
"old task methods: 1 / registry extras 68 项" 为预期噪音;mapping completeness 68/68)
- verify_task_record: exit 0
- pytest: 55 passed, 10 warnings

## 环境备忘
- 本机禁用 `uv run`(沙箱下触发全量重装),统一用 `.venv\Scripts\python.exe|ruff.exe|pyright.exe`。
- CI 仍用 uv run。
- 基线存档 .qoder/phase456/baseline/(.qoder 被 gitignore,已 `git add -f`)。

## S1 历史陈旧产物刷新(S1.2 commit)
首次运行 regenerate_config 暴露的历史漂移(4C 零漂移门的首次清扫):
- config/deploy.template*.yaml ×8:源 deploy/utils.py DEPLOY_TEMPLATE 文案已更新,产物未重生成。
- module/config/i18n/*.json ×4:gui.yaml 已删除的 webui updater 旧键残留在产物中
(Modified/CurrentVersion/Repo/Refresh/Install/Installing/NoReleases/InstallHint),重生成后移除,
与近期 webui updater 重写提交一致。
- args.json/menu.json/config_generated.py/campaign/Readme.md 无漂移。

## P1(S1-S3)完成记录
- 提交链:S1.1 4a22f8d23 → S1.2 842304a71 → S2.1 9308c927b → S2.2 deacc862d → S3 2dee1af31 → style e10dc162c。
- 全门禁绿:verify_config_generated ZERO DRIFT / verify_task_families OK / bridges ok / pytest 55 / smoke 427(424+3 新模块)。
- 执行方式偏离说明:原计划由 subagent 执行,但本环境 subagent 连续 3 次卡死(无进程活动),改由主代理按同一规格小步执行。
- S3 拆分方式:AST 脚本搬移 + mixin 组合;`event` 方法整体搬移(未做 parse_readme/normalize_readme 拆分,
与规格偏差已记录:该拆分仅为可测性,行为等价)。
- S2.2 曾因 PowerShell -replace 大小写不敏感误替换局部变量 `events` 与注释,已修复(教训:替换常量引用用逐处 edit,不用全局 replace)。

## P2-P6 完成记录(2026-08-29)
- P2(S4):8d0f3859c 语义快照+校验器 / 6413f5567 四服广播重生成(assets -28,996 行)。运行时零改动。
- P3(S5):5291d1a80 策略表(CV/DD/FLEET_SLOTS)/ 6f860d109 换角色骨架 ROLES。
- P4(S6):4d302cc42 stage_meta.py + 27 个 meta.json + handle_stage_name 表驱动(verify 1982 例全等)。
- P5(S7):42ab4f087 加载器 / f52a91a19 转换器硬化 / 4e4a3d211 格值标记 / 1502819d9 B2 /
3619529a9+8c7023532 B3 / e1d786b4c 垫片注册 / 7e6383749 B4 终转。
**最终:1348/1348 地图等价通过,12 跳过(0.9%)**。
- P6(S8):CI equivalence job;S9 终验全绿,报告见 FINAL.md。

## 4A 遗留(12 个 legacy 跳过文件)
- 自定义 Grid 类:t4.py(EventGrid,war_archives_20190321_en/a1 等 4-5 个)
- 历史损坏 import(assets 中不存在的 C2/D3/EVENT_20200312CN_SP3):legacy 下同样 ImportError,行为不变
- actions 字典 sp.py(复杂格名字典,1 个)
- ttl1.py `if __name__ == '__main__':` 调试块(1 个)
可在后续逐个支持;当前全部走 legacy 路径,行为与重构前完全一致。

## 加载器关键设计(供后续维护)
- YAML 优先、legacy 回退;片段无 import,全部名字由 ns 注入。
- 网格文本块(map_data/weight_data/map_data_loop)以**行数组**存 YAML,loader join 还原
(CampaignMap._parse_text 逐行 strip,语义全等)。
- legacy 兄弟文件导入已转换图:早期 shim 注册 + _inflight/_loading 守卫解决循环。
- campaign 内引用优先取垫片(yaml 存在时),否则 _legacy_import;module.* 引用走 importlib 前缀循环。
- from_data 依赖字段顺序(shape 先于 map_data 等),转换器按源文件顺序保序。

## Followup(2026-08-29)完成记录
- **followup-2**(YAML+行数组):1ea13c46b。1348 地图 json→yaml;迁移时发现并修复 **MAP.name 丢失 bug**
(转换器从未捕获 `CampaignMap('10-1')` 位置参数,自 4A 起全部地图 name=None;已从基线 git 树恢复,
后续转换器已修)。
- **followup-1a**(转换器模式扩展):6920f9984。片段允许前置类/顶层函数、globals 字段、__main__ 块丢弃;
跳过从 12 → 3(仅剩死导入地图,资产确实缺失,legacy 同样 ImportError)。
- **followup-1b**(OCR 入 meta):04879b688。campaign_ocr._get_stage_name 应用 ocr_rewrite 规则;
2 个事件覆盖删除。
- **followup-1c**(D2 事件入口流):3c8179125。campaign_event 新增 event_entrance_ensure/click/from_main;
5 个事件 ui_goto_event 收敛(war_archives 滚动搜索保留专用)。
- **followup-1d**(C5 战斗助手):cffbe168f。battle_clear_roadblocks 助手;32 处精确模式 AST 重写(6 简单+26 potential);
其余混杂模式未动(需真机逐个验证)。
- **merge**:a2b4bce57 合并 qoder/master(上游 5 提交 + 2 游戏更新提交)。冲突仅 4 个 assets.py(取对方→广播重生成)。
gems_farming/fast_forward 自动合并成功,双方改动均在。island 全面守护:diff 中 0 个 island 路径。
**注意**:对方 args.json/i18n 中的 raid_20260827 选项与事件名("大人物的预告信")因上游未提供
campaign/Readme.md 源行,按零漂移原则被 regenerate 归一丢弃;raid 按钮/raid.py/地图模块改动均已保留。
待上游补 Readme 行 + raid 地图目录后可自然恢复。
- **followup-1e**(声明式战斗模式):battle_patterns.py 模式库(11 种:clear_filter/boss/clear_siren/
default/clear_mode_filter/protect_siren/mystery/clear_scale/bouncing_filter/roadblocks)。
转换器+变换器双通道提取;**2472 个方法**从片段移入 YAML `battles` 字段,loader 按模式合成方法;
片段 15,638 → 6,725 行(-57%),battle_N 定义 2990 → 450。
等价硬门:快照 `battle_bodies` 记录提取前方法体,verify 逐方法断言"规范源码 == 原方法体"
(canonical_source 与 match_body 共用同一 AST 构建器,匹配时即断言)。
未匹配模式的手写方法(~450)保留在片段,含全部真机差异策略。
- **followup-1f**(死代码清理):754 个纯 pass 空壳片段删除(loader 现支持无片段时由 type() 合成
Campaign 类);3 个死导入地图删除(load 报 ModuleNotFoundError → 友好的"Map file not found",
比原先 ImportError 更明确)。campaign .py 1423 → **666**;skipped 计数归零。




Loading