From b268564658e422197a5ef6e41b02d73c022ff00d Mon Sep 17 00:00:00 2001 From: m1ngsama Date: Mon, 28 Sep 2026 12:54:16 +0800 Subject: [PATCH] docs(readme): lead with what the app does and show it --- .github/screenshot.webp | Bin 0 -> 17772 bytes README.md | 62 ++++++++++++++-------------------------- 2 files changed, 21 insertions(+), 41 deletions(-) create mode 100644 .github/screenshot.webp diff --git a/.github/screenshot.webp b/.github/screenshot.webp new file mode 100644 index 0000000000000000000000000000000000000000..2b994525ee24c66de1bff542f1a75d484fa2c010 GIT binary patch literal 17772 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index da7f616..904d16c 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,55 @@ # NBTCA Prompt -Terminal client for NBTCA events, documentation, status and personal timetables. +Club events, the school calendar, your campus timetable, and the NBTCA knowledge +base in one terminal app. What you have loaded stays readable offline. [![npm version](https://img.shields.io/npm/v/@nbtca/prompt)](https://www.npmjs.com/package/@nbtca/prompt) [![License](https://img.shields.io/npm/l/@nbtca/prompt)](LICENSE) -## Requirements - -- Node.js 20.12 or newer +![The Events tab: the next event with a countdown, upcoming events, and browse options](.github/screenshot.webp) ## Install +Requires Node.js 20.12 or newer. + ```bash npm install --global @nbtca/prompt nbtca ``` -Run a command without installing: - -```bash -npx @nbtca/prompt --help -``` +Or try it without installing: `npx @nbtca/prompt`. ## Interactive mode -Run `nbtca` with no arguments to open the full-screen client. Press `1`–`5` or -`Tab` to switch tabs, and `?` to list every key. +`nbtca` opens a full-screen client. Press `1`–`5` or `Tab` to switch tabs, and +`?` to list every key. - **Home**: today's classes and the next club events. -- **Schedule**: the current term, week, and next break from the school - calendar. Log in to the campus system to see your timetable and export it as - an `.ics` file. -- **Events**: the next event with a countdown, plus week, month, search, +- **Schedule**: the current term, week, and next break. Log in to the campus + system to see your timetable and export it to any calendar app as `.ics`. +- **Events**: a countdown to the next event, plus week and month views, search, history, and a one-year activity heatmap. -- **Docs**: the NBTCA knowledge base, readable and searchable in the terminal. - It is cached locally and served from a mirror when GitHub is unreachable. -- **Settings**: language, icon and color modes, and version info. - -Events, docs, and the school calendar stay readable offline from the last -successful fetch. +- **Docs**: read and search the knowledge base. It works even when GitHub is + unreachable. +- **Settings**: language, icons, and colors. ## Commands ```text -nbtca events [--today|--week|--month] [--search=] [--next=] [--json] -nbtca events --heatmap +nbtca events [--today|--week|--month] [--search=] [--json] +nbtca schedule login|terms|export|logout +nbtca status [--watch] nbtca docs -nbtca status [--watch] [--json] -nbtca schedule login -nbtca schedule status -nbtca schedule terms -nbtca schedule export --term=2026:3 --week-one=YYYY-MM-DD [--output=] -nbtca schedule logout nbtca website|github|roadmap|repair [--open] -nbtca theme icon auto|ascii|unicode -nbtca theme color auto|on|off -nbtca theme reset nbtca lang zh|en nbtca update ``` -`nbtca --help` lists every flag. Use `--plain` for stable output without color -and `--no-logo` to skip the startup logo. `schedule export --one-shot` avoids -reading or saving a campus session. +`nbtca --help` lists every command and flag. Add `--plain` for output without +color. -Prompt never stores passwords. Persisted sessions contain only a masked account -hint and a CookieJar, protected with user-only permissions on POSIX systems. -Treat exported calendars and session files as private data. See [SECURITY.md](SECURITY.md). +Prompt never stores your password. A saved campus session gets user-only file +permissions. See [SECURITY.md](SECURITY.md). ## Development @@ -75,9 +58,6 @@ npm ci npm run check ``` -`check` runs formatting, lint, full TypeScript validation, tests, build, package -consumer checks and dependency audit. - ## License MIT