- Transitioned the project to a Python-first architecture, moving feature logic from Bash to Python. - Created a new `setup.sh` script to bootstrap the environment on `nik-gpu`, ensuring necessary tools are installed and setting up a Python virtual environment. - Updated project layout in `plan.md` to reflect the new structure and clarify the purpose of each component. - Established a reference mapping table for feature implementation based on the existing reference project. - Outlined a migration phase to transition existing Bash functionality to Python tasks.
19 KiB
ba-auto-daily implementation plan
Personal Blue Archive JP daily-automation project.
This project controls the PC/Steam/Proton Blue Archive client running on nik-gpu through local desktop automation:
- xdotool
- scrot
- Python
- OpenCV
- later OCR when needed
Development happens on nik-macbookair.
The reference implementation lives at:
~/repo/baas-reference/
The reference project should be treated as the behavioral blueprint. This project should avoid recreating feature logic from scratch when the reference already implements it.
Core project direction
This project is now Python-first.
The goal is not to grow a large Bash script.
The goal is to build a small local Python automation framework that adapts the reference project's Blue Archive logic to this user's unique PC/Steam/Proton environment.
ba_dailies.sh should only be a launcher.
Feature logic should live in Python.
Target architecture
~/repo/ba-auto-daily/
├── ba_dailies.sh
├── ba_daily.py
├── ba_auto/
│ ├── __init__.py
│ ├── config.py
│ ├── driver.py
│ ├── detector.py
│ ├── navigation.py
│ ├── tasks/
│ │ ├── __init__.py
│ │ ├── mailbox.py
│ │ ├── cafe.py
│ │ ├── stamina.py
│ │ ├── group.py
│ │ ├── bounty.py
│ │ ├── commission.py
│ │ ├── arena.py
│ │ ├── shop_common.py
│ │ ├── shop_tactical.py
│ │ ├── lesson.py
│ │ └── ...
│ └── reference_notes/
│ └── mapping.md
├── assets/
├── screenshots/
├── scripts/
├── setup.sh
├── CLAUDE.md
└── plan.md
This is the intended direction. It does not have to be completed all at once.
Project layout
| Path | What it is |
|---|---|
~/repo/ba-auto-daily/ba_dailies.sh |
Thin launcher only. It should call the Python entry point. Do not add new feature logic here. |
~/repo/ba-auto-daily/ba_daily.py |
Main Python CLI entry point. Dispatches tasks such as mailbox, cafe, stamina, group, etc. |
~/repo/ba-auto-daily/ba_auto/driver.py |
Local PC/Steam/Proton control backend. Wraps xdotool, scrot, waits, clicks, swipes, keypresses, screenshots, and window focus. |
~/repo/ba-auto-daily/ba_auto/detector.py |
OpenCV/template/color matching helpers. Existing scripts/detect_and_click.py logic should be migrated here. |
~/repo/ba-auto-daily/ba_auto/navigation.py |
Shared navigation helpers: home, menu, close popup, back, open feature screens. |
~/repo/ba-auto-daily/ba_auto/tasks/ |
Feature implementations. Each task should adapt the relevant baas-reference/module/... logic where possible. |
~/repo/ba-auto-daily/ba_auto/reference_notes/mapping.md |
Reference mapping table: local feature → reference module → local implementation → driver gaps. |
~/repo/ba-auto-daily/assets/ |
Locally captured template images, such as cafe sparkle. Do not blindly copy assets from the reference repo. |
~/repo/ba-auto-daily/screenshots/ |
Human reference screenshots, mostly Moonlight/game captures, used for calibration and debugging. |
~/repo/ba-auto-daily/scripts/ |
Transitional scripts. Long-term reusable Python logic should move into ba_auto/. |
~/repo/ba-auto-daily/setup.sh |
Bootstrap/deploy helper for nik-gpu. Should install/check dependencies and copy runtime files. |
~/repo/baas-reference/ |
Read-only GPL-3.0 reference clone. Study and adapt. Never edit. |
Runtime paths on nik-gpu
Preferred runtime layout:
| Path | What it is |
|---|---|
nik-gpu:~/ba_dailies.sh |
Thin launcher. |
nik-gpu:~/ba_daily.py |
Python CLI entry point. |
nik-gpu:~/ba_auto/ |
Python package copied from this repo. |
nik-gpu:~/ba_assets/ |
Runtime assets/templates. |
nik-gpu:~/.venvs/ba-auto-daily/ |
Python virtual environment. |
Current older layout may include:
| Path | What it is |
|---|---|
nik-gpu:~/ba_scripts/detect_and_click.py |
Old standalone detector helper. Should eventually be replaced by ba_auto/detector.py. |
Implementation strategy
For each feature:
- Read the matching
~/repo/baas-reference/module/...file. - Summarize the reference flow.
- Identify reusable logic:
- state checks
- retry loops
- navigation sequence
- battle/sweep/shop rules
- detection method
- failure handling
- Identify backend-specific calls that cannot be reused directly.
- Implement missing generic primitives in
ba_auto/driver.pyorba_auto/detector.py. - Implement the feature in
ba_auto/tasks/<feature>.py. - Add CLI command dispatch in
ba_daily.py. - Keep
ba_dailies.shunchanged unless launcher behavior changes. - Test syntax locally.
- Deploy to
nik-gpu. - Run against the live game.
- Update this plan.
The intended result is not a Bash automation script.
The intended result is a Python automation framework using the reference repository as the behavioral blueprint.
Reference mapping table
Maintain this table in ba_auto/reference_notes/mapping.md.
Initial seed:
| Local feature | Reference file | Reference functions/classes | Local file | Backend replacements | Status |
|---|---|---|---|---|---|
| Mailbox | Need to confirm in reference | Need to inspect | ba_auto/tasks/mailbox.py |
tap/click via xdotool, screenshot via scrot | Existing Bash behavior; migrate to Python |
| Cafe | Need to confirm in reference | Need to inspect | ba_auto/tasks/cafe.py |
template matching via OpenCV, click via xdotool | Existing Bash + helper behavior; migrate to Python |
| Stamina/AP | module/collect_daily_free_power.py, module/collect_daily_task_power.py |
Need to inspect | ba_auto/tasks/stamina.py |
color checks/clicks via local driver | Not started |
| Group/Club AP | module/group.py |
Need to inspect | ba_auto/tasks/group.py |
fixed click + state check via local driver | Not started |
| Bounty | module/rewarded_task.py |
Need to inspect | ba_auto/tasks/bounty.py |
sweep/color/OCR adaptation | Not started |
| Commissions | module/clear_special_task_power.py |
Need to inspect | ba_auto/tasks/commission.py |
sweep/color adaptation | Not started |
| Arena | module/arena.py |
Need to inspect | ba_auto/tasks/arena.py |
auto-fight + OCR + local driver | Not started |
| Common Shop | module/shop/common_shop.py, module/shop/shop_utils.py |
Need to inspect | ba_auto/tasks/shop_common.py |
OCR + tab navigation + local clicks | Not started |
| Tactical Shop | module/shop/tactical_challenge_shop.py, module/shop/shop_utils.py |
Need to inspect | ba_auto/tasks/shop_tactical.py |
OCR + tab navigation + local clicks | Not started |
| Lesson/Schedule | module/lesson.py |
Need to inspect | ba_auto/tasks/lesson.py |
OCR + template/portrait search + local driver | Not started |
Do not implement a feature without filling at least the relevant row.
Status snapshot
| Feature | Current status | Target status |
|---|---|---|
| Mailbox claim | Done in old Bash style | Migrate to ba_auto/tasks/mailbox.py |
| Cafe pats + income | Done in old Bash + standalone Python detector style | Migrate to ba_auto/tasks/cafe.py and ba_auto/detector.py |
| Shared driver | Partial/implicit in scripts | Build ba_auto/driver.py |
| Python CLI | Missing | Build ba_daily.py |
| Reference mapping | Missing | Build ba_auto/reference_notes/mapping.md |
| Everything else | Not started | Implement reference-first in Python |
Migration phase
Before adding new game features, migrate the existing working implementation.
Phase 1: Python skeleton
Create:
ba_daily.py
ba_auto/__init__.py
ba_auto/config.py
ba_auto/driver.py
ba_auto/detector.py
ba_auto/navigation.py
ba_auto/tasks/__init__.py
ba_auto/tasks/mailbox.py
ba_auto/tasks/cafe.py
ba_auto/reference_notes/mapping.md
Phase 2: Launcher
Change ba_dailies.sh into a thin launcher:
#!/usr/bin/env bash
set -euo pipefail
VENV_PYTHON="${VENV_PYTHON:-$HOME/.venvs/ba-auto-daily/bin/python3}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
exec "$VENV_PYTHON" "$SCRIPT_DIR/ba_daily.py" "$@"
Keep compatibility with:
./ba_dailies.sh
./ba_dailies.sh mailbox
./ba_dailies.sh cafe
Phase 3: Driver extraction
Move shell interactions into ba_auto/driver.py.
Driver primitives should include:
focus_game()
click(x, y)
double_click(x, y)
keypress(key)
screenshot(path=None)
swipe(...)
wait(seconds)
wait_until(...)
Phase 4: Detector extraction
Move scripts/detect_and_click.py logic into ba_auto/detector.py.
Detector primitives should include:
load_template(...)
match_template(...)
find_best_match(...)
find_and_click_template(...)
color_mask(...)
debug_write_match(...)
The old script may remain as a compatibility wrapper temporarily, but the reusable logic should live under ba_auto/.
Phase 5: Mailbox migration
Move mailbox logic from Bash to:
ba_auto/tasks/mailbox.py
The CLI should call it through Python.
Phase 6: Cafe migration
Move cafe logic from Bash to:
ba_auto/tasks/cafe.py
During migration, verify:
- both rooms still work
- sparkle detection still works
- cafe income claim still works
- rank-up popups are handled or explicitly documented as not handled
- student rotation popups are handled or explicitly documented as not handled
- view centering/zoom state is robust
- repeated detection does not suffer from Python cold-start delay
Phase 7: setup.sh update
Update setup.sh so it deploys:
ba_dailies.sh
ba_daily.py
ba_auto/
assets/
to the expected runtime paths on nik-gpu.
Prerequisites
OCR
Not set up yet.
Needed for:
- currency readouts
- ticket counts
- region/tab name matching
- some shop logic
- some lesson/schedule logic
- arena ticket/rank/level checks
- bounty coin balance if auto-refresh is implemented
Candidates:
- Tesseract
- PaddleOCR
Do not add OCR until a feature needs it.
Auto-fight primitive
Needed for:
- Arena
- future main story push
- some battle automation
Reference:
~/repo/baas-reference/module/main_story.py
Look for:
auto_fight
enter_battle
Target local module may be:
ba_auto/tasks/battle.py
or:
ba_auto/battle.py
This should become a reusable primitive, not arena-specific code.
High priority backlog
1. Migration to Python-first
This is the highest priority.
Do this before adding new features.
Goal:
- Bash launcher only
- Python CLI
- Python driver
- Python detector
- mailbox migrated
- cafe migrated
- reference mapping started
Reference:
- Current local implementation
- Existing
ba_dailies.sh - Existing
scripts/detect_and_click.py
2. Stamina/AP sweep
Claim:
- daily free AP purchase
- daily task-menu AP/pyroxene rewards
Likely mostly color/state detection and fixed clicks.
Reference:
~/repo/baas-reference/module/collect_daily_free_power.py
~/repo/baas-reference/module/collect_daily_task_power.py
Local target: ba_auto/tasks/stamina.py
OCR: Probably not needed for first version.
3. Club/Group AP claim
Claim AP from club/group.
Reference:
~/repo/baas-reference/module/group.py
Local target: ba_auto/tasks/group.py
OCR: Not expected.
4. Normal/Hard story AP sweep
Sweep already-cleared main story stages to burn AP.
Reference:
~/repo/baas-reference/module/explore_tasks/sweep_task.py
~/repo/baas-reference/module/explore_tasks/task_utils.py
Local target: ba_auto/tasks/story_sweep.py
OCR: Likely needed for current region/stage detection unless using fixed configured targets.
Suggested first version:
- user-configured fixed stage
- no region search
- no dynamic OCR
- sweep configured mission only
Later version:
- fuzzy stage/region selection
- OCR-assisted navigation
5. Bounty
Three sub-areas and sweep availability.
Reference:
~/repo/baas-reference/module/rewarded_task.py
Local target: ba_auto/tasks/bounty.py
OCR: Optional for coin balance/refresh logic. Can skip refresh for first version.
6. Commissions
Two sub-dungeons:
- Base Defense
- Item Retrieval
Reference:
~/repo/baas-reference/module/clear_special_task_power.py
Local target: ba_auto/tasks/commission.py
OCR: Probably avoidable for first version if configured fixed sweep target is used.
7. Arena
Fight until out of tickets or until configured stopping condition.
Reference:
~/repo/baas-reference/module/arena.py
Local target: ba_auto/tasks/arena.py
Needs:
- auto-fight primitive
- OCR or visual detection for ticket/rank state
- careful safety limits
Arena is high-value but more risky than fixed claim tasks.
8. Common Shop + Tactical Shop
Auto-buy configured items.
Reference:
~/repo/baas-reference/module/shop/common_shop.py
~/repo/baas-reference/module/shop/tactical_challenge_shop.py
~/repo/baas-reference/module/shop/shop_utils.py
Local targets:
ba_auto/tasks/shop_common.py
ba_auto/tasks/shop_tactical.py
Needs:
- OCR for currency balances
- shop tab detection
- configured buy list
- safe purchase confirmation logic
Start with a no-refresh, fixed configured buy list.
9. Lesson / Schedule
Affection farming via classes.
Reference:
~/repo/baas-reference/module/lesson.py
Local target: ba_auto/tasks/lesson.py
Complexity: High
Needs:
- OCR for region/area names
- multi-page swipe search
- student detection/portrait matching if targeting specific students
- isometric grid location logic if following reference fully
Suggested first version:
- pick a fixed region
- select available/highest visible lesson
- avoid favorite-student targeting at first
Low priority backlog
Scrimmage
Reference:
~/repo/baas-reference/module/scrimmage.py
Local target: ba_auto/tasks/scrimmage.py
Similar shape to Bounty/Commissions.
Crafting
Reference:
~/repo/baas-reference/module/create.py
Local target: ba_auto/tasks/crafting.py
Very complex. Contains:
- material selection
- priority lists
- rarity tiers
- stepper/quantity UI
- filtering/sorting
- OCR-like decision points
Do not start until the framework and OCR are mature.
Battle Pass claim
Reference:
~/repo/baas-reference/module/collect_pass_reward.py
Local target: ba_auto/tasks/battle_pass.py
Should be simpler than crafting.
OCR only needed for optional stats.
Momo Talk
Reference:
~/repo/baas-reference/module/momo_talk.py
Local target: ba_auto/tasks/momo_talk.py
Potentially useful because it runs on a different cadence from daily reset.
Likely no OCR. Mostly state scanning and click flow.
Main story push
This means clearing new uncleared stages, not sweeping already-cleared stages.
Reference:
~/repo/baas-reference/module/main_story.py
~/repo/baas-reference/module/explore_tasks/explore_task.py
Low priority because full grid-mode support requires lots of per-stage scripting.
A simple auto-fight-only mode can be added later.
Group Story / Mini Story
Reference:
~/repo/baas-reference/module/group_story.py
~/repo/baas-reference/module/mini_story.py
Convenience only.
Event content
Reference:
~/repo/baas-reference/module/activities/activity_utils.py
~/repo/baas-reference/module/sweep_activity.py
Do not prebuild specific event scripts.
Build only generic event AP sweep if it can reuse story sweep logic.
Event-specific content expires and is not worth hardcoding unless the user asks for a specific live event.
Skip list
| Feature | Why skip |
|---|---|
| Total Assault / Raid | Low value and risky to automate. Reference support may be limited/stubbed. |
| Joint Firing Drill | Not worth prioritizing for JP if reference has server-specific limitations. |
| De-clothes localization toggle | CN-only / irrelevant. |
| Restart / refresh-uiautomator2 | Android/ADB backend maintenance, not applicable to PC/Steam/Proton. |
| Auto-unfriend | Risky, low value, destructive. |
| Daily minigame dispatcher | Event-specific and unstable. Handle ad hoc only. |
Automation cadence notes
Some tasks decay on different schedules.
| Feature | Suggested cadence |
|---|---|
| Cafe income / affection | Every few hours |
| Momo Talk | Every few hours |
| Arena | Around reset windows / twice daily if implemented |
| Mailbox | Daily or with default run |
| AP/stamina/task rewards | Daily |
| Group AP | Daily |
| Bounty/Commissions/Scrimmage | Daily |
| Shops | Daily, after reset |
| Lesson/Schedule | Daily |
Scheduling should be handled outside the feature logic.
Feature code should perform one safe run and exit.
Safety and robustness rules
Every task should have:
- maximum retry count
- timeout where appropriate
- safe failure mode
- clear stdout logging
- no infinite click loops
- no unbounded spending
- config guard for purchases
- dry-run or debug mode when useful
For purchases:
- default to conservative behavior
- avoid refresh loops until OCR/currency detection is reliable
- require explicit configured item list
- avoid buying unknown items
For battle features:
- require clear stop conditions
- avoid continuing blindly after unexpected state
- prefer returning failure over clicking randomly
Configuration direction
Future config may live in ba_auto/config.py or config.yaml.
Possible config values:
server = JP
game_window_name = BlueArchive
display = :0
asset_dir = ~/ba_assets
screenshot_dir = ./scratchpad
cafe_max_clicks_per_room
story_sweep_target
shop_buy_list
arena_stop_condition
ocr_enabled
debug_enabled
Keep config explicit. Do not bury user-specific settings deep inside task logic.
Debugging conventions
Use ./scratchpad for:
- temporary screenshots
- cropped templates
- annotated match images
- OCR debug output
- one-off notes
Do not use /tmp or /private/tmp unless unavoidable.
When detector behavior changes, save debug outputs with clear names, for example:
scratchpad/cafe_match_2026-07-05_001.png
scratchpad/shop_ocr_debug_001.png
Local validation commands
On nik-macbookair:
bash -n ba_dailies.sh
python3 -m py_compile ba_daily.py
python3 -m py_compile ba_auto/*.py
python3 -m py_compile ba_auto/tasks/*.py
On nik-gpu:
~/ba_dailies.sh mailbox
~/ba_dailies.sh cafe
After migration:
~/ba_dailies.sh
should run the default daily sequence.
Near-term recommended task order
- Rewrite
ba_dailies.shas a thin launcher. - Add
ba_daily.py. - Add
ba_auto/driver.py. - Add
ba_auto/detector.py. - Add
ba_auto/navigation.py. - Move mailbox logic to
ba_auto/tasks/mailbox.py. - Move cafe logic to
ba_auto/tasks/cafe.py. - Update
setup.sh. - Add
ba_auto/reference_notes/mapping.md. - Verify existing mailbox and cafe still work.
- Implement stamina/AP.
- Implement group/club AP.
- Implement fixed-target sweep features.
- Add OCR only when needed.
- Attempt Arena/Shop/Lesson after the framework is stable.
Claude Code guidance summary
When Claude Code works on this repo, it should follow this rule:
Reference first. Python first. Driver primitives before feature hacks. Bash launcher only.
Do not turn this project into a Bash recreation of Blue Archive Auto Script.