# purplemashu/me-cli-sunset architecture

> Architecture diagram of the GitHub repository purplemashu/me-cli-sunset, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/purplemashu/me-cli-sunset
- Repository: https://github.com/purplemashu/me-cli-sunset

## Overview

MYnyak Engsel Sunset is a terminal client for managing an Indonesian mobile-provider account and its packages. The main workflow selects or logs into an account, retrieves account/package data, and lets the user browse packages and initiate purchases; separate menus cover family plans, circles, notifications, bookmarks, and transaction history. Authentication state is maintained by the auth service, while client modules communicate with provider APIs and encrypt/sign requests. The excerpts show several key calls, but not every menu implementation, so unsampled feature wiring is represented conservatively.

Main entry points: [`app/client/engsel.py`](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/engsel.py) (Provider API client), [`main.py`](https://github.com/purplemashu/me-cli-sunset/blob/main/main.py) (Main menu), [`app/menus/purchase.py`](https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/purchase.py) (Package purchases), [`app/service/auth.py`](https://github.com/purplemashu/me-cli-sunset/blob/main/app/service/auth.py) (Auth service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_cli["CLI workflow"]
  node_main["Main menu<br/>[main.py]"]
end

subgraph group_identity["Account identity"]
  node_account_menu["Account menu<br/>[account.py]"]
  node_auth["Auth service<br/>[auth.py]"]
  node_registration["Login registration<br/>[registration.py]"]
  node_ciam["CIAM client<br/>[ciam.py]"]
  node_token_store[("Refresh token state<br/>[auth.py]")]
end

subgraph group_packages["Packages and purchase"]
  node_package_menu["Package browsing<br/>[package.py]"]
  node_store_menu["Store browsing<br/>[search.py]"]
  node_purchase_menu["Package purchases<br/>[purchase.py]"]
  node_balance_payment["Balance settlement<br/>[balance.py]"]
  node_ewallet_payment["E-wallet payment<br/>[ewallet.py]"]
  node_qris_payment["QRIS payment<br/>[qris.py]"]
  node_redeem["Rewards redemption<br/>[redeem.py]"]
  node_hot_data["Hot package lists<br/>[hot.json]"]
  node_decoy_data["Decoy package data"]
end

subgraph group_account_features["Account features"]
  node_family_menu["Family plans<br/>[family.py]"]
  node_famplan_menu["Family organizer<br/>[famplan.py]"]
  node_circle_menu["Circle management<br/>[circle.py]"]
  node_bookmark_menu["Bookmarks<br/>[bookmark.py]"]
  node_notification_menu["Notifications<br/>[notification.py]"]
end

subgraph group_provider["Provider interface"]
  node_store_search["Store search API<br/>[search.py]"]
  node_provider_api["Provider API client<br/>[engsel.py]"]
  node_crypto["Request encryption<br/>[encrypt.py]"]
  node_purchase_common["Payment utilities<br/>[common.py]"]
end

node_user(("CLI user"))
node_provider_service{{"Mobile provider"}}

node_user -->|"selects options"| node_main
node_main -->|"gets active account"| node_auth
node_main -->|"opens account menu"| node_account_menu
node_main -->|"browses packages"| node_package_menu
node_main -->|"starts purchase"| node_purchase_menu
node_main -->|"opens family plans"| node_family_menu
node_main -->|"opens organizer"| node_famplan_menu
node_main -->|"opens circles"| node_circle_menu
node_account_menu -->|"selects account"| node_auth
node_auth -->|"reads and writes tokens"| node_token_store
node_auth -->|"refreshes tokens"| node_ciam
node_auth -->|"loads profile"| node_provider_api
node_registration -->|"authenticates"| node_ciam
node_package_menu -->|"loads package data"| node_provider_api
node_package_menu -->|"settles purchase"| node_balance_payment
node_package_menu -->|"uses bookmarks"| node_bookmark_menu
node_store_menu -->|"searches catalog"| node_store_search
node_store_menu -->|"opens package details"| node_package_menu
node_purchase_menu -->|"loads package details"| node_provider_api
node_purchase_menu -->|"settles by balance"| node_balance_payment
node_purchase_menu -.->|"reads optional decoy"| node_decoy_data
node_purchase_menu -.->|"reads hot lists"| node_hot_data
node_balance_payment -->|"encrypts and signs"| node_crypto
node_ewallet_payment -->|"encrypts and signs"| node_crypto
node_qris_payment -->|"encrypts and signs"| node_crypto
node_redeem -->|"encrypts and signs"| node_crypto
node_balance_payment -->|"submits settlement"| node_provider_service
node_ewallet_payment -->|"submits payment"| node_provider_service
node_qris_payment -->|"submits payment"| node_provider_service
node_redeem -->|"submits redemption"| node_provider_service
node_store_search -->|"sends API request"| node_provider_api
node_provider_api -->|"encrypts requests"| node_crypto
node_provider_api -->|"requests account data"| node_provider_service
node_family_menu -->|"loads family data"| node_provider_api
node_famplan_menu -->|"manages plan"| node_provider_api
node_circle_menu -->|"manages circle"| node_provider_api
node_notification_menu -->|"fetches notifications"| node_provider_api
node_bookmark_menu -.->|"stores bookmarks"| node_provider_service

click node_main "https://github.com/purplemashu/me-cli-sunset/blob/main/main.py"
click node_account_menu "https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/account.py"
click node_auth "https://github.com/purplemashu/me-cli-sunset/blob/main/app/service/auth.py"
click node_registration "https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/registration.py"
click node_ciam "https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/ciam.py"
click node_token_store "https://github.com/purplemashu/me-cli-sunset/blob/main/app/service/auth.py"
click node_package_menu "https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/package.py"
click node_store_menu "https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/store/search.py"
click node_store_search "https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/store/search.py"
click node_purchase_menu "https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/purchase.py"
click node_balance_payment "https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/purchase/balance.py"
click node_ewallet_payment "https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/purchase/ewallet.py"
click node_qris_payment "https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/purchase/qris.py"
click node_redeem "https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/purchase/redeem.py"
click node_hot_data "https://github.com/purplemashu/me-cli-sunset/blob/main/hot_data/hot.json"
click node_decoy_data "https://github.com/purplemashu/me-cli-sunset/blob/main/decoy_data/decoy-default-balance.json"
click node_family_menu "https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/family.py"
click node_famplan_menu "https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/famplan.py"
click node_circle_menu "https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/circle.py"
click node_bookmark_menu "https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/bookmark.py"
click node_notification_menu "https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/notification.py"
click node_provider_api "https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/engsel.py"
click node_crypto "https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/encrypt.py"
click node_purchase_common "https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/purchase/common.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_main,node_user toneBlue
class node_account_menu,node_auth,node_registration,node_ciam,node_token_store toneAmber
class node_package_menu,node_store_menu,node_purchase_menu,node_balance_payment,node_ewallet_payment,node_qris_payment,node_redeem,node_hot_data,node_decoy_data toneMint
class node_family_menu,node_famplan_menu,node_circle_menu,node_bookmark_menu,node_notification_menu toneRose
class node_store_search,node_provider_api,node_crypto,node_purchase_common,node_provider_service toneIndigo
```

## Components

### CLI workflow

- [Main menu](https://github.com/purplemashu/me-cli-sunset/blob/main/main.py): `main.py`

### Account identity

- [Account menu](https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/account.py): `app/menus/account.py`
- [Auth service](https://github.com/purplemashu/me-cli-sunset/blob/main/app/service/auth.py): `app/service/auth.py`
- [Login registration](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/registration.py): `app/client/registration.py`
- [CIAM client](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/ciam.py): `app/client/ciam.py`
- [Refresh token state](https://github.com/purplemashu/me-cli-sunset/blob/main/app/service/auth.py): `app/service/auth.py`

### Packages and purchase

- [Package browsing](https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/package.py): `app/menus/package.py`
- [Store browsing](https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/store/search.py): `app/menus/store/search.py`
- [Package purchases](https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/purchase.py): `app/menus/purchase.py`
- [Balance settlement](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/purchase/balance.py): `app/client/purchase/balance.py`
- [E-wallet payment](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/purchase/ewallet.py): `app/client/purchase/ewallet.py`
- [QRIS payment](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/purchase/qris.py): `app/client/purchase/qris.py`
- [Rewards redemption](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/purchase/redeem.py): `app/client/purchase/redeem.py`
- [Hot package lists](https://github.com/purplemashu/me-cli-sunset/blob/main/hot_data/hot.json): `hot_data/hot.json`
- [Decoy package data](https://github.com/purplemashu/me-cli-sunset/blob/main/decoy_data/decoy-default-balance.json): `decoy_data/decoy-default-balance.json`

### Account features

- [Family plans](https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/family.py): `app/menus/family.py`
- [Family organizer](https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/famplan.py): `app/menus/famplan.py`
- [Circle management](https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/circle.py): `app/menus/circle.py`
- [Bookmarks](https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/bookmark.py): `app/menus/bookmark.py`
- [Notifications](https://github.com/purplemashu/me-cli-sunset/blob/main/app/menus/notification.py): `app/menus/notification.py`

### Provider interface

- [Store search API](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/store/search.py): `app/client/store/search.py`
- [Provider API client](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/engsel.py): `app/client/engsel.py`
- [Request encryption](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/encrypt.py): `app/client/encrypt.py`
- [Payment utilities](https://github.com/purplemashu/me-cli-sunset/blob/main/app/client/purchase/common.py): `app/client/purchase/common.py`

### Other components

- **CLI user**
- **Mobile provider**

## Connections

- CLI user → Main menu: selects options
- Main menu → Auth service: gets active account
- Main menu → Account menu: opens account menu
- Main menu → Package browsing: browses packages
- Main menu → Package purchases: starts purchase
- Main menu → Family plans: opens family plans
- Main menu → Family organizer: opens organizer
- Main menu → Circle management: opens circles
- Account menu → Auth service: selects account
- Auth service → Refresh token state: reads and writes tokens
- Auth service → CIAM client: refreshes tokens
- Auth service → Provider API client: loads profile
- Login registration → CIAM client: authenticates
- Package browsing → Provider API client: loads package data
- Package browsing → Balance settlement: settles purchase
- Package browsing → Bookmarks: uses bookmarks
- Store browsing → Store search API: searches catalog
- Store browsing → Package browsing: opens package details
- Package purchases → Provider API client: loads package details
- Package purchases → Balance settlement: settles by balance
- Package purchases → Decoy package data: reads optional decoy
- Package purchases → Hot package lists: reads hot lists
- Balance settlement → Request encryption: encrypts and signs
- E-wallet payment → Request encryption: encrypts and signs
- QRIS payment → Request encryption: encrypts and signs
- Rewards redemption → Request encryption: encrypts and signs
- Balance settlement → Mobile provider: submits settlement
- E-wallet payment → Mobile provider: submits payment
- QRIS payment → Mobile provider: submits payment
- Rewards redemption → Mobile provider: submits redemption
- Store search API → Provider API client: sends API request
- Provider API client → Request encryption: encrypts requests
- Provider API client → Mobile provider: requests account data
- Family plans → Provider API client: loads family data
- Family organizer → Provider API client: manages plan
- Circle management → Provider API client: manages circle
- Notifications → Provider API client: fetches notifications
- Bookmarks → Mobile provider: stores bookmarks
