For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Make bx/bx-mobile functionally equivalent to bx/bx-web menu-by-menu, with mobile-specific interaction allowed but identical business outcomes.
Architecture: Keep API access centralized in bx/bx-mobile/src/api/index.ts, align route/page capability with web menus, and implement in four batches (advance, reimburse/payment, personal views, admin pages). Each page is completed with a fixed 5-point acceptance checklist and role-based regression.
Tech Stack: Vue 3 + TypeScript + Vite + Vant 4 (bx-mobile), FastAPI (bx-backend), Axios API client.
bx/bx-mobile/src/router/index.ts: route availability, role guard, menu entry mapping.bx/bx-mobile/src/api/index.ts: endpoint contracts and parameter adaptation.bx/bx-mobile/src/views/**: page-level behavior and UI actions.bx/bx-mobile/src/components/mobile/**: reusable list/card/action components.bx/bx-mobile/src/stores/auth.ts: current user, role codes, menu list.bx/bx-backend/app/routers/**: API endpoint capability gaps.bx/bx-backend/app/services/**: business logic gaps (approve/issue/pay/offset details).| web menu code | mobile route/page | API group | key actions |
|---|---|---|---|
advance-apply |
/advance/list, /advance/apply, /advance/:id |
advanceApi, attachmentApi |
create, edit, submit, view |
advance-approve |
/advance/approve |
advanceApi |
pending list, approve, reject |
advance-issue |
/advance/issue |
paymentApi |
issue, issue remark, issue record |
reimburse-apply |
/reimburse/list, /reimburse/apply, /reimburse/:id |
reimburseApi, expenseItemApi, attachmentApi |
create, edit, submit, view |
reimburse-approve |
/reimburse/approve |
reimburseApi |
pending list, approve, reject |
payment |
/payment |
paymentApi |
pay, offset, batch offset, records |
mine |
/mine |
advanceApi, reimburseApi |
filter, paginate, detail |
todo |
/approval, /approval/:bizType/:id |
advanceApi, reimburseApi |
aggregated pending, jump to approval |
all |
/all |
advanceApi, reimburseApi |
role-scoped global query |
user-manage |
/admin/users |
userApi |
list/create/edit/delete/reset pwd |
role-manage |
/admin/roles |
roleApi, menuApi |
CRUD, assign users, assign menus |
menu-manage |
/admin/menus |
menuApi |
tree, create/edit/delete |
project |
/admin/expenses |
expenseItemApi |
tree CRUD |
wf-advance |
/admin/wf-advance |
workflowApi |
workflow CRUD, nodes save |
wf-reimburse |
/admin/wf-reimburse |
workflowApi |
workflow CRUD, nodes save |
Files:
bx/docs/superpowers/specs/2026-04-29-bx-mobile-align-web-design.mdbx/docs/superpowers/plans/bx-mobile-web-parity-matrix.mdTest: manual verification doc only
[ ] Step 1: Create parity matrix file with all 15 menu rows
# BX Mobile-Web Parity Matrix
| menu | web page | mobile page | APIs | action parity | status |
|---|---|---|---|---|---|
| advance-apply | AdvanceApplyPage | AdvanceApplyPage | advanceApi, attachmentApi | create/edit/submit | todo |
done/partial/missing) for every rowRun: cd bx/bx-mobile && npm run build
Expected: build passes (baseline), matrix updated.
Batch-1: advance-apply, advance-approve, advance-issue
Batch-2: reimburse-apply, reimburse-approve, payment
Batch-3: mine, todo, all
Batch-4: admin six pages
git add bx/docs/superpowers/specs/2026-04-29-bx-mobile-align-web-design.md bx/docs/superpowers/plans/bx-mobile-web-parity-matrix.md
git commit -m "docs: add mobile-web parity matrix baseline"
Files:
bx/bx-mobile/src/api/index.tsbx/bx-mobile/src/api/client.tsbx/bx-backend/app/routers/*.pybx/bx-backend/app/services/*.pyTest: bx/bx-mobile build + smoke calls
[ ] Step 1: Write failing contract checklist tests (manual + curl collection)
# Example contract checks
curl -s "http://localhost:8000/api/payments/pending?page=1&pageSize=10" | jq '.code,.data'
curl -s "http://localhost:8000/api/reimburses/generate-title" | jq '.code,.data'
// src/api/index.ts (pattern)
advanceIssues: (params?: Record<string, any>) =>
client.get('/payments/advance-issues', {
params: params
? { page: params.page, pageSize: params.pageSize, issue_status: params.issueStatus, keyword: params.keyword }
: undefined,
})
# routers/payments.py pattern
@router.get("/reimburse/{reimburse_id}/offset-records")
def list_reimburse_offset_records(reimburse_id: int, ...):
...
Run: cd bx/bx-mobile && npm run build
Expected: PASS
git add bx/bx-mobile/src/api/index.ts bx/bx-mobile/src/api/client.ts bx/bx-backend/app/routers bx/bx-backend/app/services
git commit -m "feat: align mobile api contracts with web parity"
Files:
bx/bx-mobile/src/views/advance/AdvanceListPage.vuebx/bx-mobile/src/views/advance/AdvanceApplyPage.vuebx/bx-mobile/src/views/advance/AdvanceDetailPage.vuebx/bx-mobile/src/views/advance/AdvanceApprovePage.vuebx/bx-mobile/src/views/advance/AdvanceIssuePage.vuebx/bx-mobile/src/hooks/useAttachment.tsTest: page flow E2E manual
[ ] Step 1: Implement apply/edit/submit + attachment bind parity
// submit pattern
await advanceApi.create(payload)
await attachmentApi.bindBiz(uploadedIds, 'advance', createdId)
await advanceApi.submit(createdId)
await advanceApi.approve(id, { approvalOpinion: form.opinion })
// or reject(...)
await paymentApi.issueAdvance(advanceId, { actualAmount, issueRemark })
await refreshList()
Run: cd bx/bx-mobile && npm run build
Expected: PASS + checklist all checked in matrix.
git add bx/bx-mobile/src/views/advance bx/bx-mobile/src/hooks/useAttachment.ts bx/docs/superpowers/plans/bx-mobile-web-parity-matrix.md
git commit -m "feat: complete advance flow parity on mobile"
Files:
bx/bx-mobile/src/views/reimburse/ReimburseListPage.vuebx/bx-mobile/src/views/reimburse/ReimburseApplyPage.vuebx/bx-mobile/src/views/reimburse/ReimburseDetailPage.vuebx/bx-mobile/src/views/reimburse/ReimburseApprovePage.vuebx/bx-mobile/src/views/payment/PaymentPage.vuebx/bx-mobile/src/hooks/useExpenseItemTree.tsTest: reimburse/payment closed-loop
[ ] Step 1: Align reimburse apply fields and title generation
const titleRes = await reimburseApi.generateTitle()
form.title = titleRes.data
const approvals = await reimburseApi.getApprovals(id)
await reimburseApi.approve(id, { approvalOpinion: opinion })
await paymentApi.pay(id, { actualAmount, payRemark })
await paymentApi.batchOffset(id, { items, payAmount, remark })
Run: cd bx/bx-mobile && npm run build
Expected: PASS + reimburse/payment rows marked done.
git add bx/bx-mobile/src/views/reimburse bx/bx-mobile/src/views/payment/PaymentPage.vue bx/bx-mobile/src/hooks/useExpenseItemTree.ts bx/docs/superpowers/plans/bx-mobile-web-parity-matrix.md
git commit -m "feat: complete reimburse and payment parity on mobile"
Files:
bx/bx-mobile/src/views/mine/MinePage.vuebx/bx-mobile/src/views/mine/ApplyList.vuebx/bx-mobile/src/views/approval/ApprovalPage.vuebx/bx-mobile/src/views/approval/ApprovalDetailPage.vuebx/bx-mobile/src/views/all/AllPage.vuebx/bx-mobile/src/views/home/HomePage.vueTest: role-based read/operate checks
[ ] Step 1: Align mine filters/pagination/detail routes
await advanceApi.my({ page, pageSize, status, keyword })
await reimburseApi.my({ page, pageSize, status, keyword })
if (bizType === 'advance') router.push('/advance/approve')
if (bizType === 'reimburse') router.push('/reimburse/approve')
meta: { roles: ['ADMIN', 'GENERAL_MANAGER'] }
Run: cd bx/bx-mobile && npm run build
Expected: PASS + mine/todo/all rows done.
git add bx/bx-mobile/src/views/mine bx/bx-mobile/src/views/approval bx/bx-mobile/src/views/all/AllPage.vue bx/bx-mobile/src/views/home/HomePage.vue bx/docs/superpowers/plans/bx-mobile-web-parity-matrix.md
git commit -m "feat: complete mine todo all parity on mobile"
Files:
bx/bx-mobile/src/views/admin/UserManagePage.vuebx/bx-mobile/src/views/admin/RoleManagePage.vuebx/bx-mobile/src/views/admin/MenuManagePage.vuebx/bx-mobile/src/views/admin/ExpenseProjectPage.vuebx/bx-mobile/src/views/admin/WfAdvancePage.vuebx/bx-mobile/src/views/admin/WfReimbursePage.vueTest: admin action suite
[ ] Step 1: User/Role/Menu actions parity (CRUD + assign)
await roleApi.assignUsers(roleId, userIds)
await roleApi.assignMenus(roleId, menuIds)
await expenseItemApi.tree()
await expenseItemApi.create(payload)
await workflowApi.getByBizType('advance')
await workflowApi.saveNodes(id, nodes)
Run: cd bx/bx-mobile && npm run build
Expected: PASS + all admin rows done.
git add bx/bx-mobile/src/views/admin bx/docs/superpowers/plans/bx-mobile-web-parity-matrix.md
git commit -m "feat: complete admin capability parity on mobile"
Files:
bx/docs/superpowers/plans/bx-mobile-web-parity-matrix.mdbx/docs/superpowers/plans/2026-04-29-bx-mobile-parity-test-report.mdTest: full regression by role
[ ] Step 1: Execute role matrix regression
Roles: ADMIN, FINANCE, GENERAL_MANAGER, APPLICANT
Flows: advance full chain, reimburse full chain, admin capability checks
| page | reachable | list | detail | actions | writeback | result |
|---|---|---|---|---|---|---|
| /payment | yes | yes | yes | yes | yes | PASS |
- blocker: reimburse offset rounding mismatch
- owner: backend payment service
- eta: 1 day
Run: cd bx/bx-mobile && npm run build
Expected: PASS
Run: cd bx/bx-mobile && npm run dev
Expected: dev server starts successfully.
git add bx/docs/superpowers/plans/bx-mobile-web-parity-matrix.md bx/docs/superpowers/plans/2026-04-29-bx-mobile-parity-test-report.md
git commit -m "test: finalize mobile-web parity regression report"
bx-mobile/bx-web usage.