inboxer/PROJECT_PLAN.md

163 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Project inBOXER: Master Agent Manifest
## 1. System Architecture
- **Backend:** Go (Golang) compiled binary **modular design** (each package does one specific task).
- **Frontend:** Embedded Go templates + CSS (mobilefirst, responsive). No heavy JavaScript frameworks.
- **Database:** SQLite (single file) with GORM.
- **Authentication:** Email address + OTP (onetime password) sent via SMTP.
- One email address = one user.
- Session stored in a secure, httponly cookie.
- **Core Logic:** IMAP fetching → DeepSeek LLM classification → IMAP folder move.
---
## 2. Directory Structure
The agent **must** create the following exact hierarchy inside the repository:
```text
~/inboxer/ # Repository root
├── README.md
├── .env # ALL credentials (IMAP, SMTP, DeepSeek)
├── docs/
│ ├── CHANGELOG.md # Updated with each version
│ └── LICENSE.md
├── src/
│ ├── cmd/
│ │ └── main.go # Orchestrator (startup, workers, web server)
│ ├── internal/
│ │ ├── auth/ # OTP generation, email sending, session mgmt
│ │ ├── imap/ # IMAP client, batch fetching, folder ops
│ │ ├── ai/ # DeepSeek caller, prompt loader, result parser
│ │ ├── db/ # SQLite models & user settings
│ │ └── worker/ # Orchestrated coldstart / steadystate loop
│ ├── web/
│ │ ├── templates/ # .html files (login, dashboard, settings)
│ │ └── static/ # CSS (mobilefirst)
│ └── pkg/ # Helpers (logging, config, OTP utils)
└── bin/
├── inboxer # Compiled binary
├── config.yaml # Global settings (poll intervals, batch sizes)
├── prompt.txt # Classification prompt (loaded at runtime)
└── db.sqlite # User data & settings
```
---
## 3. Critical Agent Instructions
### A. Credentials `.env` file
The agent **must** read `~/inboxer/.env` on startup. It contains:
```
DEEPSEEK_API_KEY=sk-...
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=noreply@example.com
SMTP_PASS=...
```
- No hardcoded secrets.
- The `.env` file is **never** committed to the repository.
### B. Modularity & Testability
- Each subpackage (`auth`, `imap`, `ai`, `db`, `worker`) must expose a small, focused interface.
- The `main` package acts only as the orchestrator:
- Reads `config.yaml` and `.env`.
- Initialises database, AI client, IMAP client, OTP sender.
- Starts the web server and the background worker goroutine.
- Unit tests can target any package in isolation (each module has its own `*_test.go`).
### C. Authentication Email + OTP
- **Login flow:**
1. User enters email address on `/login`.
2. Backend generates a 6digit OTP, stores it (hashed) in the database with a 10minute expiry.
3. OTP is sent via SMTP (credentials from `.env`) to that email address.
4. User submits OTP on `/verify`.
5. If correct, a session cookie is created (user identified by email).
- **One email = one user** the database stores a single users own IMAP/SMTP mailbox settings (encrypted).
- **Session management:** cookie with `HttpOnly`, `Secure`, and appropriate expiry.
### D. Classification Prompt Location
- The prompt text file **must** be placed in `bin/prompt.txt` (next to `bin/config.yaml`).
- The binary reads this file at startup (or caches it).
- This allows endusers to modify the classification prompt without recompiling.
### E. Repository & Version Control
- **First step:** The agent creates a new repository named `inboxer` (on GitHub/GitLab, whichever is available).
- **After each version increment** (i.e., completing a Phase task), the agent must:
- Update `docs/CHANGELOG.md` with the new version and changes.
- Commit all changes with a descriptive message.
- Push to the remote repository.
---
## 4. Phased Project Plan
### Phase 1: Foundation, OTP Auth & Mobile Frontend (Version: 2026-04.1)
- **1.1** Create repository `inboxer` and the exact folder structure.
- **1.2** Go module init, add dependencies: `go-imap`, `gorm`, `sqlite`, `slog`, etc.
- **1.3** Implement `.env` loader + `config.yaml` parser.
- **1.4** **Modular auth package:**
- OTP generation & hashing (bcrypt)
- SMTP sender (using `.env` credentials)
- Session cookie management
- **1.5** **Mobilefirst frontend** (Go templates + CSS grid/flex):
- `/login` email input
- `/verify` OTP input
- `/dashboard` shows processing status, last run, folder counts
- `/settings` user can set their own IMAP/SMTP credentials (encrypted in DB)
- **1.6** SQLite schema: `users` (email, hashed_otp, otp_expiry), `mailbox_settings` (imap_host, imap_user, encrypted_pass, etc.).
### Phase 2: IMAP & ColdStart Worker (Version: 2026-04.2)
- **2.1** **Modular IMAP package** connect, list folders, move messages, fetch batches.
- **2.2** **Worker orchestrator:**
- Steady state: 10 emails every 5 minutes.
- Catchup mode (if `last_processed_uid` is null): batches of 50 emails, 5second cooldown between batches.
- **2.3** Ensure folders `Important`, `eCommerce`, `Other`, `Spam` exist (create if missing).
### Phase 3: DeepSeek AI & Prompt Loading (Version: 2026-04.3)
- **3.1** **Modular AI package** reads `bin/classify_prompt.txt` and caches it.
- **3.2** Sends (sender, subject, body snippet) to DeepSeek, expects JSON: `{"folder": string, "score": int, "context": string}`.
- **3.3** If AI fails (API error, invalid response), the email stays in `INBOX` (no guessing).
- **3.4** Add “Test Mode” toggle in frontend logs AI decisions without moving physical emails.
### Phase 4: Reporting, Logging & Final Polish (Version: 2026-04.4)
- **4.1** Weekly summary report sent via SMTP (from `.env`) to the loggedin users email.
- **4.2** Structured logging (`slog`) to `bin/inboxer.log`.
- **4.3** `Makefile` with targets: `build`, `run`, `test`.
- **4.4** Final binary placed in `bin/` ready for enduser distribution.
---
## 5. Operational Guardrails for the AI Agent
1. **Versioning** Increment the version in `docs/CHANGELOG.md` after every completed Phase task, then **commit and push**.
2. **Safety** Never delete emails. Only move from `INBOX` to subfolders.
3. **OTP Security** OTPs expire after 10 minutes; use bcrypt for storage; always send via TLS.
4. **Error Handling** If AI API or IMAP fails, log the error, keep the email in `INBOX`, and retry on the next cycle.
5. **tmux sessions** Do not kill the tmux session where the agent runs.
6. **Testing** Each modular function must have its own test file (`*_test.go`) that can be executed independently.
7. **Frontend** The web interface must be usable on mobile devices (responsive design, touchfriendly inputs).
---
## 6. Immediate Actions for the Agent (OpenCode)
1. **Create the repository** named `inboxer` on the available Git host.
2. **Clone it** and create the exact folder structure shown above.
3. **Place a sample `.env`** (with placeholder values) and a default `bin/classify_prompt.txt` (a basic classification prompt).
4. **Begin Phase 1** implement OTP authentication and the mobilefirst frontend.
5. **After finishing Phase 1**, update `CHANGELOG.md` to version `2026-04.1`, then **commit and push**.
The agent is now cleared to execute. All subsequent commits must follow the same pattern after each version increment.