chore: untrack private docs (STRUCTURE, FUTURE, HISTORY, DEVELOPMENT_LOG)
This commit is contained in:
parent
34b0f75918
commit
d2acf44846
|
|
@ -1,3 +1,15 @@
|
||||||
|
# Private project/agent docs — never commit
|
||||||
|
DEVELOPMENT_LOG.md
|
||||||
|
PROJECT.md
|
||||||
|
STRUCTURE.md
|
||||||
|
FUTURE.md
|
||||||
|
HISTORY.md
|
||||||
|
BUILD_SUMMARY.md
|
||||||
|
SCRIPTS.md
|
||||||
|
project-requirements.md
|
||||||
|
.learnings/
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
node_modules/
|
node_modules/
|
||||||
dist/
|
dist/
|
||||||
db/*.db
|
db/*.db
|
||||||
|
|
|
||||||
|
|
@ -1,175 +0,0 @@
|
||||||
# Bill Tracker - Development Log
|
|
||||||
|
|
||||||
**Purpose:** Track active development work across all agents. Bishop uses this to update Engineering_Reference_Manual.md.
|
|
||||||
|
|
||||||
**⚠️ Note for Agents:** When you complete your task, update this file with results, completion status, and any files modified. Ripley will then notify Bishop to review and decide on manual updates. You have `write` and `edit` access to this file.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### v0.26.1 — Dual-Column XLSX Parser Bug Fixes
|
|
||||||
**Status:** ✅ COMPLETED
|
|
||||||
**Date:** 2026-05-11
|
|
||||||
**Priority:** HIGH
|
|
||||||
|
|
||||||
| Agent | Status | Time | Notes |
|
|
||||||
|-------|--------|------|-------|
|
|
||||||
| Bishop | ✅ COMPLETED | 15m | Build verified, version bumped, test runtime validated |
|
|
||||||
| Ripley | ✅ COMPLETED | 10m | Bugfixes implemented and verified with real spreadsheet |
|
|
||||||
|
|
||||||
**Files modified:** `services/spreadsheetImportService.js`, `package.json`, `client/lib/version.js`
|
|
||||||
|
|
||||||
**Work Completed:**
|
|
||||||
- [x] **`detectAllHeaderSets()` rewritten** — Uses repeat-field detection instead of gap-based splitting. Second "Bill" or "Amount" column starts a new group. Requires ≥2 header fields per group (filters out "Left Over | Paid" rows).
|
|
||||||
- [x] **Column leakage fixed** — `allColumnsIndices` Set includes full range [startCol..endCol] for every header set, passed to `analyzeRow` and `collectNotesCells`. Prevents right-side bills from picking up left-side amounts.
|
|
||||||
- [x] **`header_set_index` added to output** — `analyzeRow` return object now includes `header_set_index` so frontend can distinguish left vs right bills.
|
|
||||||
- [x] **`isLikelySummaryRow()` added** — Catches Paycheck, Left Over, Enter how much, Starting/Ending Balance rows.
|
|
||||||
- [x] **`isLikelyTotalRow()` expanded** — Catches "Auto Total ------>" patterns.
|
|
||||||
- [x] **Leftover calc rows filtered** — null/blank bill name + negative amount, or dash-separator names like "--------->".
|
|
||||||
- [x] **`HEADER_PATTERNS.amount`** — Removed `paid` from alternation (was matching "Paid" text as a header).
|
|
||||||
- [x] **Empty cell filter** in `detectAllHeaderSets` — Skips cells with empty string values.
|
|
||||||
|
|
||||||
**Functional Test Results (verified by Ripley):**
|
|
||||||
|
|
||||||
January 2026 sheet from real spreadsheet:
|
|
||||||
- ✅ 15 left-side bills (due ~1st), 12 right-side bills (due ~15th)
|
|
||||||
- ✅ No null-name rows, no dash names, no negative amounts
|
|
||||||
- ✅ Amazon chase card correctly shows null amount (no column leakage)
|
|
||||||
- ✅ All amounts parse correctly
|
|
||||||
|
|
||||||
**Build & Runtime Verification:**
|
|
||||||
|
|
||||||
1. ✅ Build completed successfully:
|
|
||||||
```
|
|
||||||
Successfully built 97480952ed3e
|
|
||||||
Successfully tagged bill-tracker:local
|
|
||||||
```
|
|
||||||
|
|
||||||
2. ✅ Container started on http://localhost:3036
|
|
||||||
|
|
||||||
**Changes Applied:**
|
|
||||||
|
|
||||||
**Version bump:**
|
|
||||||
- `package.json`: `0.26.0` → `0.26.1`
|
|
||||||
- `client/lib/version.js`: `APP_VERSION = '0.26.1'`
|
|
||||||
- `client/lib/version.js`: RELEASE_NOTES version updated with v0.26.1 highlights
|
|
||||||
|
|
||||||
**Files Modified:**
|
|
||||||
- `services/spreadsheetImportService.js` - Dual-column parser bugfixes (already verified by Ripley)
|
|
||||||
- `package.json` - Version bumped to 0.26.1
|
|
||||||
- `client/lib/version.js` - APP_VERSION and RELEASE_NOTES updated
|
|
||||||
|
|
||||||
**Deliverables:**
|
|
||||||
- XLSX dual-column parser correctly detects multiple header sets using repeat-field detection
|
|
||||||
- XLSX dual-column parser prevents column leakage between left and right column groups
|
|
||||||
- API response includes `header_set_index` for frontend column distinction
|
|
||||||
- Summary rows (Paycheck, Left Over, Auto Total) correctly filtered
|
|
||||||
- Amount header pattern no longer false-matches "Paid" text
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### v0.24.6 — XLSX Dual-Column Parser Bug Fixes
|
|
||||||
**Status:** ✅ COMPLETED
|
|
||||||
**Date:** 2026-05-11
|
|
||||||
**Priority:** MEDIUM
|
|
||||||
|
|
||||||
| Agent | Status | Time | Notes |
|
|
||||||
|-------|--------|------|-------|
|
|
||||||
| Neo | ✅ COMPLETED | 2m | Added filter for null-name + negative amount rows and dash separators |
|
|
||||||
| Bishop | ✅ COMPLETED | 2m | Build verified, parsed data cleaned |
|
|
||||||
|
|
||||||
**Files modified:** `services/spreadsheetImportService.js`
|
|
||||||
|
|
||||||
**Work Completed:**
|
|
||||||
- [x] **Bug 1 Fixed:** Added filter in `parseSheetRows` to skip rows where bill name is null/blank AND amount is negative (leftover calculation rows)
|
|
||||||
- [x] **Bug 1 Fixed:** Added filter to skip rows where bill name matches `/^-+>/` or `/^--+$/` (dash separators like "--------->")
|
|
||||||
- [x] **Bug 2 Verified:** `header_set_index` was already present in API output (no changes needed)
|
|
||||||
- [x] **Bug 3 Verified:** "kids lunches" has null amount because the spreadsheet cell is genuinely empty (correct behavior, not a bug)
|
|
||||||
- [x] Docker build passes, container starts, import preview shows 27 rows instead of 29 (removed 2 leftover calculation rows)
|
|
||||||
|
|
||||||
**Changes Applied:**
|
|
||||||
|
|
||||||
**Before (buggy behavior):**
|
|
||||||
- Row 23 (Excel row 24): Left side `[null, null, "-$3,429.47", ...]` parsed as bill with null name and negative amount
|
|
||||||
- Row 23 (Excel row 24): Right side `["--------->", null, "-$1,915.78", ...]` parsed as bill named "--------->" with negative amount
|
|
||||||
|
|
||||||
**After (fixed behavior):**
|
|
||||||
- Both rows skipped during parsing
|
|
||||||
- Total rows reduced from 29 to 27
|
|
||||||
- No null-name or negative-amount rows in parsed output
|
|
||||||
|
|
||||||
**Code Added (in `parseSheetRows` loop):**
|
|
||||||
```javascript
|
|
||||||
// Skip leftover calculation rows: null/blank bill name with negative amount, or dash separators
|
|
||||||
const getBillName = (field) => {
|
|
||||||
const idx = headerMap[field];
|
|
||||||
return idx !== undefined ? cells[idx] : undefined;
|
|
||||||
};
|
|
||||||
const get = (field) => {
|
|
||||||
const idx = headerMap[field];
|
|
||||||
return idx !== undefined ? cells[idx] : undefined;
|
|
||||||
};
|
|
||||||
const rawBillName = getBillName('bill_name') ?? cells[0];
|
|
||||||
const billName = rawBillName ? String(rawBillName).trim() || null : null;
|
|
||||||
const rawAmount = get('amount') ?? findFirstAmountCell(cells, new Set(Object.values(headerMap)));
|
|
||||||
const amount = rawAmount !== null ? parseAmount(rawAmount) : null;
|
|
||||||
|
|
||||||
// Check if bill name is a dash separator (--- or ---->)
|
|
||||||
const isDashSeparator = billName && (billName.match(/^-+>/) || billName.match(/^--+$/));
|
|
||||||
|
|
||||||
// Check if this is a leftover calculation row (null/blank bill name + negative amount)
|
|
||||||
// Skip if bill name is null AND amount is negative
|
|
||||||
const isLeftoverCalcRow = !billName && amount !== null && amount < 0;
|
|
||||||
|
|
||||||
if (isDashSeparator || isLeftoverCalcRow) continue;
|
|
||||||
```
|
|
||||||
|
|
||||||
**Test Results:**
|
|
||||||
|
|
||||||
**Header Detection:** ✅ PASSED
|
|
||||||
- Left set: startCol=0, endCol=4, defaultDueDay=1
|
|
||||||
- Right set: startCol=6, endCol=9, defaultDueDay=15
|
|
||||||
|
|
||||||
**Parsing:** ✅ PASSED
|
|
||||||
- 27 rows parsed (down from 29)
|
|
||||||
- No null-name + negative-amount rows
|
|
||||||
- No dash-separator rows
|
|
||||||
|
|
||||||
**API Output:** ✅ PASSED
|
|
||||||
- `header_set_index` present in all rows
|
|
||||||
- Correctly assigns 0 to left column bills, 1 to right column bills
|
|
||||||
|
|
||||||
**Files Modified:**
|
|
||||||
- `services/spreadsheetImportService.js` - Added row skip filter in `parseSheetRows`
|
|
||||||
|
|
||||||
**Deliverables:**
|
|
||||||
- XLSX dual-column parser correctly filters calculation leftover rows
|
|
||||||
- XLSX dual-column parser correctly filters dash separator rows
|
|
||||||
- `header_set_index` available in preview API response for frontend column distinction
|
|
||||||
- Kids lunches null amount correctly reflects genuine empty cell (not a parsing bug)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### v0.24.4 - Analytics Mobile Layout + Previous Month Payment Toggle
|
|
||||||
**Status:** ✅ COMPLETED
|
|
||||||
**Date:** 2026-05-11
|
|
||||||
**Priority:** MEDIUM
|
|
||||||
|
|
||||||
| Agent | Status | Time | Notes |
|
|
||||||
|-------|--------|------|-------|
|
|
||||||
| Scarlett | ✅ COMPLETED | 12m | Mobile responsiveness fixes for AnalyticsPage |
|
|
||||||
| Neo | ✅ COMPLETED | 3m | Toggle-paid scoped to year/month on backend + frontend |
|
|
||||||
| Bishop | ✅ COMPLETED | 7m | Build verified, runtime tested, version bumped |
|
|
||||||
|
|
||||||
**Files modified:** `client/pages/AnalyticsPage.jsx`, `routes/bills.js`, `client/pages/TrackerPage.jsx`, `package.json`, `client/lib/version.js`
|
|
||||||
|
|
||||||
**Work Completed:**
|
|
||||||
- [x] AnalyticsPage: Heatmap table responsive (removed min-w-760px, narrower columns)
|
|
||||||
- [x] AnalyticsPage: Controls grid breakpoints (sm:grid-cols-2 → lg:grid-cols-6)
|
|
||||||
- [x] AnalyticsPage: Chart card grid (sm:grid-cols-1 → lg:grid-cols-2)
|
|
||||||
- [x] AnalyticsPage: Donut chart responsive SVG sizing
|
|
||||||
- [x] AnalyticsPage: Checkbox grid mobile layout
|
|
||||||
- [x] AnalyticsPage: Loading skeleton mobile height
|
|
||||||
- [x] Backend: toggle-paid accepts year/month params, scopes payment lookup to specific month
|
|
||||||
- [x] Backend: paid_date calculated from due_day when year/month provided but no explicit date
|
|
||||||
|
|
||||||
[... remaining content unchanged from original file ...]
|
|
||||||
330
FUTURE.md
330
FUTURE.md
|
|
@ -1,330 +0,0 @@
|
||||||
# Bill Tracker — Future Improvements
|
|
||||||
|
|
||||||
**This document tracks potential future enhancements for Bill Tracker.**
|
|
||||||
|
|
||||||
**Last Updated:** 2026-05-11
|
|
||||||
**Current Version:** v0.24.3
|
|
||||||
|
|
||||||
## How to Use This Document
|
|
||||||
|
|
||||||
This file is a living document. Agents should:
|
|
||||||
1. Read this file before proposing changes
|
|
||||||
2. Add new recommendations with priority levels
|
|
||||||
3. Never add completed items — move those to HISTORY.md instead
|
|
||||||
4. Reference this file when dispatching improvement tasks
|
|
||||||
5. Only Ripley can remove items from this list. Notify Ripley if something neds to be removed.
|
|
||||||
|
|
||||||
### Priority Format
|
|
||||||
|
|
||||||
All items must include the priority emoji in their heading, matching the section they belong to:
|
|
||||||
|
|
||||||
| Priority | Emoji | Heading Format |
|
|
||||||
|----------|-------|---------------|
|
|
||||||
| CRITICAL | 🔴 | `### 🔴 Title — CRITICAL` |
|
|
||||||
| HIGH | 🟠 | `### 🟠 Title — HIGH` |
|
|
||||||
| MEDIUM | 🟡 | `### 🟡 Title — MEDIUM` |
|
|
||||||
| LOW | 🔵 | `### 🔵 Title — LOW` |
|
|
||||||
| NICE TO HAVE | 💭 | `### 💭 Title — NICE TO HAVE` |
|
|
||||||
|
|
||||||
Items are grouped under their priority section heading (`## 🔴 CRITICAL`, `## 🟠 HIGH`, etc.) and sorted most-impactful-first within each tier.
|
|
||||||
|
|
||||||
|
|
||||||
## Pending Recommendations
|
|
||||||
|
|
||||||
### 🔴 No Confirmation Before Destructive Actions — CRITICAL
|
|
||||||
**Priority:** CRITICAL
|
|
||||||
**Added:** 2026-05-11 by Ripley
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
Deleting a bill or payment is one click with no confirmation dialog and no undo. For a financial app, accidental data loss destroys user trust.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- Bills and payments represent real financial commitments and history
|
|
||||||
- No "are you sure?" prompt before delete
|
|
||||||
- No undo mechanism, no soft delete, no recovery
|
|
||||||
- One misclick = gone forever — unacceptable for financial data
|
|
||||||
- This is a trust and data integrity issue, not a UX nicety
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Add confirmation dialog to all delete actions (bills, payments, categories)
|
|
||||||
- Consider soft delete (`deleted_at` column) with a grace period before permanent removal
|
|
||||||
- Add undo toast after delete that allows restoration within a short window
|
|
||||||
- Files to modify: `BillModal.jsx`, `BillsTableInner.jsx`, `TrackerPage.jsx`, `CategoriesPage.jsx`
|
|
||||||
- Estimated effort: 3-4 hours
|
|
||||||
|
|
||||||
|
|
||||||
### 🟠 HIGH
|
|
||||||
|
|
||||||
### 🟠 No Search or Filter Across Bills — HIGH
|
|
||||||
**Priority:** HIGH
|
|
||||||
**Added:** 2026-05-11 by Ripley
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
No way to find a bill by name, category, or amount. Users must scroll through the entire list to find anything. Every bill tracker on the market has instant search.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- With dozens of bills, scrolling is slow and error-prone
|
|
||||||
- No search bar on BillsPage, TrackerPage, or CalendarPage
|
|
||||||
- Can't filter by category, amount range, autopay status, or billing cycle
|
|
||||||
- Can't quickly find "where's that electric bill?" without visually scanning
|
|
||||||
- Table stakes for any list-based app
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Add search input to BillsPage (filter by name, category, notes)
|
|
||||||
- Add filter chips/dropdowns for category, billing cycle, autopay, active/inactive
|
|
||||||
- Add search to TrackerPage (filter visible rows by bill name)
|
|
||||||
- Consider a global `Cmd+K` / `Ctrl+K` command palette for instant bill lookup
|
|
||||||
- Files to modify: `BillsPage.jsx`, `TrackerPage.jsx`, `client/api.js`
|
|
||||||
- Estimated effort: 6-8 hours
|
|
||||||
|
|
||||||
### 🟠 No Visible Overdue Indicators — HIGH
|
|
||||||
**Priority:** HIGH
|
|
||||||
**Added:** 2026-05-11 by Ripley
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
Overdue bills aren't visually flagged on the tracker. An unpaid past-due bill looks the same as one not due yet. The `notify_overdue` setting exists but there's no visual distinction in the UI.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- The whole point of a bill tracker is to not miss payments
|
|
||||||
- Overdue bills should be impossible to overlook — red highlight, badge count, sticky alert
|
|
||||||
- Data model supports overdue notifications but tracker grid shows no overdue state
|
|
||||||
- Users scanning the tracker won't notice a missed bill buried in the list
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Add overdue detection: if today > due date for current month and no payment logged, mark overdue
|
|
||||||
- Red/amber background on overdue tracker rows
|
|
||||||
- Overdue count badge in Sidebar next to Tracker nav link
|
|
||||||
- Optional: overdue summary banner at top of TrackerPage
|
|
||||||
- Files to modify: `TrackerPage.jsx`, `Sidebar.jsx`, `routes/tracker.js` (add overdue count to API response)
|
|
||||||
- Estimated effort: 4-6 hours
|
|
||||||
|
|
||||||
### 🟠 Filtered Export for Reports — HIGH
|
|
||||||
**Priority:** HIGH
|
|
||||||
**Added:** 2026-05-11 by Ripley (upgraded from LOW)
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
No way to export filtered data (e.g., "all bills in category X for last 6 months", "everything overdue in 2026"). Export dumps everything or nothing.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- Exporting filtered reports is core functionality for a bill tracker, not a nice-to-have
|
|
||||||
- Users need "all Q1 utility bills" or "overdue payments this year" for reconciliation and tax prep
|
|
||||||
- `/api/export/user-excel` exports everything — no query params for date range, category, or status
|
|
||||||
- This is how people actually use financial data outside the app
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Add query params to export endpoints: `category_id`, `start`, `end`, `status` (paid/unpaid/overdue)
|
|
||||||
- Files to modify: `routes/export.js`, `client/pages/DataPage.jsx`
|
|
||||||
- Estimated effort: 6 hours
|
|
||||||
|
|
||||||
|
|
||||||
### 🟡 MEDIUM
|
|
||||||
|
|
||||||
### 🟡 No Bill Template / Duplicate Bill — MEDIUM
|
|
||||||
**Priority:** MEDIUM
|
|
||||||
**Added:** 2026-05-11 by Ripley
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
Creating a new bill means filling 10+ fields every time. No way to duplicate an existing bill or use a template. If you have 3 utilities from the same provider, you're retyping everything.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- Bill creation has many fields (name, category, due day, amount, autopay, website, account, 2FA, notes)
|
|
||||||
- Common pattern: similar bills from same provider or same category with slight variations
|
|
||||||
- "Duplicate bill" is table stakes in every bill tracker
|
|
||||||
- Reduces friction and errors during bill setup
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Add "Duplicate" button/action on each bill row and in BillModal
|
|
||||||
- Pre-fill all fields from source bill, clear `name` and set "(Copy)" suffix
|
|
||||||
- Files to modify: `BillModal.jsx`, `BillsPage.jsx`, `routes/bills.js` (POST endpoint can accept `source_bill_id` param)
|
|
||||||
- Estimated effort: 3-4 hours
|
|
||||||
|
|
||||||
### 🟡 No Partial Payment Support — MEDIUM
|
|
||||||
**Priority:** MEDIUM
|
|
||||||
**Added:** 2026-05-11 by Ripley
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
The UI only supports logging a single payment per bill per month. The `payments` table schema supports multiple entries per bill, but the frontend doesn't surface this. Split payments (half now, half later) can't be tracked.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- Many bills get paid in installments (medical, tuition, large utilities)
|
|
||||||
- Payment plan arrangements require tracking multiple payments against one bill
|
|
||||||
- The data model already supports it — it's purely a frontend gap
|
|
||||||
- Without this, users either over-record or under-record partial payments
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Show payment history per bill in tracker (expandable row or modal tab)
|
|
||||||
- Allow "Add partial payment" with amount + date, summing to bill total
|
|
||||||
- Display remaining balance on partially-paid bills
|
|
||||||
- Files to modify: `TrackerPage.jsx`, `routes/payments.js`, possibly `BillModal.jsx`
|
|
||||||
- Estimated effort: 6-8 hours
|
|
||||||
|
|
||||||
### 🟡 No Year-Over-Year Comparison in Analytics — MEDIUM
|
|
||||||
**Priority:** MEDIUM
|
|
||||||
**Added:** 2026-05-11 by Ripley
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
Analytics shows monthly trends within a single year but there's no "this month vs same month last year" view. Users can't evaluate whether spending is improving.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- The whole point of analytics is answering "am I doing better or worse?"
|
|
||||||
- Within-year trends are useful but don't show long-term improvement
|
|
||||||
- Comparing April 2026 to April 2025 is the natural question people ask
|
|
||||||
- Available in every competing app (YNAB, Monarch, etc.)
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Add YoY comparison toggle or tab to AnalyticsPage
|
|
||||||
- Query: same month range across current and previous year, diff the totals
|
|
||||||
- Show percentage change and absolute change per category
|
|
||||||
- Files to modify: `AnalyticsPage.jsx`, `routes/analytics.js` (add YoY endpoint or params)
|
|
||||||
- Estimated effort: 6-8 hours
|
|
||||||
|
|
||||||
### 🟡 No Bulk Actions — MEDIUM
|
|
||||||
**Priority:** MEDIUM
|
|
||||||
**Added:** 2026-05-11 by Ripley
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
Every action is one-at-a-time. Can't select multiple bills and mark them paid, skip them for a month, or change their category.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- End-of-month reconciliation means marking many bills as paid in a row
|
|
||||||
- Category reorganization affects multiple bills at once
|
|
||||||
- Skipping seasonal bills for summer/winter requires individual clicks
|
|
||||||
- Bulk actions are standard in any list-based management UI
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Add checkbox selection to BillsPage rows (with select-all toggle)
|
|
||||||
- Bulk action toolbar: Mark Paid, Skip This Month, Change Category, Delete
|
|
||||||
- Backend: batch endpoints or loop with progress indicator
|
|
||||||
- Files to modify: `BillsPage.jsx`, `BillsTableInner.jsx`, `routes/bills.js`, `routes/payments.js`
|
|
||||||
- Estimated effort: 8-10 hours
|
|
||||||
|
|
||||||
### Architecture: Business Logic Mixed with Route Handlers
|
|
||||||
**Priority:** MEDIUM
|
|
||||||
**Added:** 2026-05-08 by Neo
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
Many routes contain business logic that should be extracted to service layers.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- `bills.js` contains `parseDueDay()`, `parseInterestRate()` — validation logic
|
|
||||||
- `tracker.js` contains date/range calculations that are reused across routes
|
|
||||||
- `admin.js` has complex OIDC config building mixed with routing
|
|
||||||
- `analytics.js` has complex date-building logic (`buildMonths`, `monthKey`, etc.)
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Files to modify: Multiple route files + new service files in `/services/`
|
|
||||||
- Estimated effort: 8 hours
|
|
||||||
- Proposed structure:
|
|
||||||
```
|
|
||||||
/services/billsService.js
|
|
||||||
/services/trackerService.js
|
|
||||||
/services/analyticsService.js
|
|
||||||
/services/authService.js (existing)
|
|
||||||
/services/oidcService.js (existing)
|
|
||||||
/services/cleanupService.js (existing)
|
|
||||||
```
|
|
||||||
- Route handlers should call services, not contain business logic
|
|
||||||
|
|
||||||
|
|
||||||
### 🔵 LOW
|
|
||||||
|
|
||||||
### 🔵 Payment Method Tracking and Summary — LOW
|
|
||||||
**Priority:** LOW
|
|
||||||
**Added:** 2026-05-11 by Ripley
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
The `payments` table has a `method` column (free-text) but no way to see "how much did I pay via autopay vs manual vs credit card this month." No standardized method options, no summary.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- Useful for reconciling credit card statements vs bank statements
|
|
||||||
- Autopay vs manual tracking helps identify bills that should be switched to autopay
|
|
||||||
- Payment method breakdown is a common analytics view in financial apps
|
|
||||||
- Current `method` field is unvalidated free text — no consistency
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Standardize payment methods: enum or controlled list (autopay, bank_transfer, credit_card, check, cash, other)
|
|
||||||
- Add payment method breakdown to analytics or summary page
|
|
||||||
- Files to modify: `routes/payments.js`, `AnalyticsPage.jsx` or `SummaryPage.jsx`, schema migration for method validation
|
|
||||||
- Estimated effort: 4-6 hours
|
|
||||||
|
|
||||||
### 🔵 No Keyboard Navigation or Shortcuts — LOW
|
|
||||||
**Priority:** LOW
|
|
||||||
**Added:** 2026-05-11 by Ripley
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
Only a skip link exists for keyboard accessibility. No `Cmd+K` to find a bill, no `Esc` to close modals, no arrow keys to navigate the tracker grid. Power users and accessibility need keyboard support.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- Keyboard accessibility is required for WCAG compliance
|
|
||||||
- Power users navigate faster with keyboard shortcuts
|
|
||||||
- Modal dismiss on `Esc` is expected behavior in any modern app
|
|
||||||
- Command palette (`Cmd+K`) pairs with the search feature (also missing)
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- `Esc` closes any open modal/dialog
|
|
||||||
- `Cmd+K` / `Ctrl+K` opens search/command palette
|
|
||||||
- Arrow keys navigate tracker rows when grid is focused
|
|
||||||
- Tab order follows logical flow, not DOM order
|
|
||||||
- Files to modify: `App.jsx`, `BillModal.jsx`, `TrackerPage.jsx`, all dialog components
|
|
||||||
- Estimated effort: 6-8 hours
|
|
||||||
|
|
||||||
### Add comprehensive unit and integration tests
|
|
||||||
**Priority:** LOW
|
|
||||||
**Added:** 2026-05-08 by Scarlett
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
Currently no unit tests exist for components or hooks. The only testing appears to be functional tests in `test-functional.js`. Component-level testing is missing.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
Code quality and maintainability. Unit tests catch regressions and document component behavior. Bill Tracker has complex business logic (bill calculations, monthly state, analytics) that should be tested.
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Set up Jest + React Testing Library
|
|
||||||
- Test key components: BillModal, TrackerPage row, BillsTableInner
|
|
||||||
- Test hooks: useAuth, custom form hooks
|
|
||||||
- Test utility functions in `client/lib/utils.js`
|
|
||||||
- Consider vitest for faster test execution
|
|
||||||
- Add CI integration for test execution
|
|
||||||
- Files likely to be modified: Add `client/test/` directory, add `jest.config.cjs`
|
|
||||||
- Estimated effort: 8-12 hours for baseline coverage
|
|
||||||
|
|
||||||
### Features: Missing Bill Grouping and Reorganization API
|
|
||||||
**Priority:** LOW
|
|
||||||
**Added:** 2026-05-08 by Neo
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
No way to reorder bills, drag-and-drop, or group by custom criteria.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
- `bills` table has `due_day` ordering but no manual sort order
|
|
||||||
- Frontend likely orders by `due_day` only
|
|
||||||
- Users cannot create bill groups or categories for bills
|
|
||||||
- No way to mark bills as "hidden" or "archived" without deactivating
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Files to modify: `/home/kaspa/.openclaw/Projects/bill-tracker/db/schema.sql`, `/routes/bills.js`
|
|
||||||
- Estimated effort: 6 hours
|
|
||||||
- Add:
|
|
||||||
- `sort_order` column to bills table (default NULL, ordered first by sort_order then due_day)
|
|
||||||
- `PUT /api/bills/reorder` endpoint accepting `{bill_id: new_index}`
|
|
||||||
- `PUT /api/bills/:id/archived` to soft-dearchive (sets `archived` flag)
|
|
||||||
|
|
||||||
|
|
||||||
### 💭 NICE TO HAVE
|
|
||||||
|
|
||||||
### Add consistent form state management pattern
|
|
||||||
**Priority:** MEH
|
|
||||||
**Added:** 2026-05-08 by Scarlett
|
|
||||||
|
|
||||||
**Description:**
|
|
||||||
Form state management is inconsistent across components. Some use `useState` for each field, others use form libraries. Validation patterns vary.
|
|
||||||
|
|
||||||
**Rationale:**
|
|
||||||
Consistency and maintainability. A consistent pattern makes it easier to add new forms and reduce bugs.
|
|
||||||
|
|
||||||
**Implementation Notes:**
|
|
||||||
- Consider react-hook-form for complex forms
|
|
||||||
- Create reusable form field components (InputField, SelectField, etc.)
|
|
||||||
- Standardize validation approach
|
|
||||||
- Files likely to be modified: `client/components/*.jsx`
|
|
||||||
- Estimated effort: 4-6 hours for migration
|
|
||||||
1274
HISTORY.md
1274
HISTORY.md
File diff suppressed because it is too large
Load Diff
277
STRUCTURE.md
277
STRUCTURE.md
|
|
@ -1,277 +0,0 @@
|
||||||
# Bill Tracker Project Structure
|
|
||||||
|
|
||||||
## Project Overview
|
|
||||||
Bill Tracking Website — Full-stack application with Node.js backend and React frontend.
|
|
||||||
|
|
||||||
## Directory Structure
|
|
||||||
```
|
|
||||||
bill-tracker/
|
|
||||||
├── client/ # React frontend (ALL UI CODE HERE)
|
|
||||||
│ ├── components/ # Reusable React components
|
|
||||||
│ │ ├── layout/ # Layout components (Sidebar, etc.)
|
|
||||||
│ │ └── ui/ # UI components (buttons, inputs, etc.)
|
|
||||||
│ ├── pages/ # Page components (one per route)
|
|
||||||
│ │ ├── TrackerPage.jsx
|
|
||||||
│ │ ├── BillsPage.jsx
|
|
||||||
│ │ ├── CategoriesPage.jsx
|
|
||||||
│ │ ├── CalendarPage.jsx
|
|
||||||
│ │ ├── SummaryPage.jsx
|
|
||||||
│ │ ├── AnalyticsPage.jsx
|
|
||||||
│ │ ├── ProfilePage.jsx
|
|
||||||
│ │ ├── SettingsPage.jsx
|
|
||||||
│ │ ├── DataPage.jsx
|
|
||||||
│ │ ├── AdminPage.jsx
|
|
||||||
│ │ ├── LoginPage.jsx
|
|
||||||
│ │ └── AboutPage.jsx
|
|
||||||
│ ├── hooks/ # Custom React hooks (useAuth, etc.)
|
|
||||||
│ ├── api.js # API client functions
|
|
||||||
│ ├── App.jsx # React Router configuration
|
|
||||||
│ ├── main.jsx # React entry point
|
|
||||||
│ └── index.html # HTML template
|
|
||||||
├── server.js # Express backend entry
|
|
||||||
├── routes/ # API route handlers
|
|
||||||
├── services/ # Business logic layer
|
|
||||||
├── middleware/ # Express middleware
|
|
||||||
├── db/ # Database schemas/migrations
|
|
||||||
├── workers/ # Background job workers
|
|
||||||
├── scripts/ # Utility scripts
|
|
||||||
├── docs/ # Documentation
|
|
||||||
├── dist/ # Build output (generated)
|
|
||||||
├── public/ # Static assets
|
|
||||||
├── Dockerfile # Container config
|
|
||||||
└── docker-compose.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
## Critical Notes for Agents
|
|
||||||
|
|
||||||
### Frontend Code Location
|
|
||||||
**ALL React components, pages, and UI code are in `client/` folder.**
|
|
||||||
- Pages: `client/pages/*.jsx`
|
|
||||||
- Components: `client/components/**/*.jsx`
|
|
||||||
- Hooks: `client/hooks/*.js`
|
|
||||||
- API client: `client/api.js`
|
|
||||||
- Router: `client/App.jsx`
|
|
||||||
|
|
||||||
### Backend Code Location
|
|
||||||
**ALL backend code is at root or in server folders:**
|
|
||||||
- Entry: `server.js`
|
|
||||||
- Routes: `routes/*.js`
|
|
||||||
- Services: `services/*.js`
|
|
||||||
- Middleware: `middleware/*.js`
|
|
||||||
- Database: `db/*.js`
|
|
||||||
|
|
||||||
## Agent Review Roles
|
|
||||||
|
|
||||||
| Agent | Role | Focus Area |
|
|
||||||
|-------|------|------------|
|
|
||||||
| Neo | Backend / System Architecture | server.js, routes/, services/, middleware/, workers/, db/, Docker, performance, scalability, security |
|
|
||||||
| Scarlett | UI/UX / Frontend | client/, public/, components, styling, accessibility, responsive design |
|
|
||||||
| Bishop | Analysis / Code Quality | overall architecture, patterns, maintainability, technical debt |
|
|
||||||
| Private_Hudson | Security / Compliance | auth, data protection, input validation, compliance |
|
|
||||||
|
|
||||||
### Cross-Cutting Concerns
|
|
||||||
All agents must be aware of:
|
|
||||||
- **Routing**: `client/App.jsx` defines all frontend routes
|
|
||||||
- **Auth**: `client/hooks/useAuth.jsx` and `services/authService.js`
|
|
||||||
- **API**: `client/api.js` mirrors `routes/` structure
|
|
||||||
- **Database**: `db/database.js` schema affects both frontend and backend
|
|
||||||
|
|
||||||
## Review Output
|
|
||||||
All findings appended to `REVIEW.md` per agent section.
|
|
||||||
|
|
||||||
# OpenClaw Agent Structure
|
|
||||||
|
|
||||||
## Prime
|
|
||||||
|
|
||||||
Role:
|
|
||||||
|
|
||||||
* executive coordinator
|
|
||||||
* project strategist
|
|
||||||
* Discord command interface
|
|
||||||
|
|
||||||
Responsibilities:
|
|
||||||
|
|
||||||
* **Overall Oversight:** Must maintain high-level awareness of all concurrent projects, ensuring every agent's output aligns with the goal set in `projects-requirements.md`.
|
|
||||||
* **Coordination & Directives:** Direct agent activity by issuing tasks that fit within the approved technology stack and operational guidelines.
|
|
||||||
* **Priority Setting:** Assign priorities while constantly cross-referencing potential conflicts with established system mandates (e.g., Security > Performance > Feature).
|
|
||||||
* **Escalation & Blockers:** Must be the first point of contact when any agent flags a requirement conflict or a technical blocker that contradicts the mandated best practices.
|
|
||||||
* **High-Level Strategy:** Must ensure that any strategy proposed is *future-proof*, *lightweight*, and avoids accumulating technical debt against the required state of the stack.
|
|
||||||
* **Communication:** Must communicate status, outcomes, and required actions to the human user, translating technical mandates into actionable project milestones.
|
|
||||||
|
|
||||||
Authority:
|
|
||||||
|
|
||||||
* project coordination and task routing.
|
|
||||||
* Authority to pause or redirect any agent whose proposed path violates the Universal Mandate or project requirements.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Riply
|
|
||||||
|
|
||||||
Role:
|
|
||||||
|
|
||||||
* operations
|
|
||||||
* infrastructure
|
|
||||||
* runtime management
|
|
||||||
|
|
||||||
Responsibilities:
|
|
||||||
|
|
||||||
* deployment oversight, adhering to stability and resilience standards (per `projects-requirements.md`).
|
|
||||||
* runtime monitoring, ensuring all services are low-latency and avoid unnecessary polling.
|
|
||||||
* infrastructure coordination, guaranteeing that all components use the approved stack (Next.js, React, etc.).
|
|
||||||
* operational alerts, prioritizing security and performance issues immediately.
|
|
||||||
* service stability, adhering to the "fail gracefully" principle.
|
|
||||||
* environment consistency, ensuring local/localhost parity across development.
|
|
||||||
* Discord operational reporting, following established communication protocols.
|
|
||||||
|
|
||||||
Authority:
|
|
||||||
|
|
||||||
* infrastructure operations, strictly governed by stability and security mandates.
|
|
||||||
* deployment workflows, must pass full security and performance audits before proceeding.
|
|
||||||
* runtime diagnostics, must use established, non-bloated tooling.
|
|
||||||
* operational communication, must be precise and action-oriented.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Neo
|
|
||||||
|
|
||||||
Role:
|
|
||||||
|
|
||||||
* senior backend developer
|
|
||||||
* backend architecture lead
|
|
||||||
|
|
||||||
Responsibilities:
|
|
||||||
|
|
||||||
* **Mandatory Adherence:** Must treat `projects-requirements.md` as the primary source of truth for all technology choices and operational philosophies.
|
|
||||||
* **Security First:** All data handling, authentication, and authorization logic must strictly follow OWASP best practices and the principle of least privilege. No assumption of trust.
|
|
||||||
* **Data Integrity:** Must ensure all database operations use transactions and validate inputs/outputs to prevent silent failures.
|
|
||||||
* **Business Logic Separation:** Must keep core business logic separate from the API routes to maintain clear separation of concerns.
|
|
||||||
* **API Consistency:** Must ensure all endpoints are well-documented, predictable, and enforce structured error handling.
|
|
||||||
* **Resilience:** Must design for restart-safe operation and predictable data flow, especially when handling configuration from environment variables.
|
|
||||||
|
|
||||||
Authority:
|
|
||||||
|
|
||||||
* ultimate authority over the integrity and security of the data layer and business logic flow.
|
|
||||||
* must block any integration or design that compromises data integrity or security posture.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Scarlett
|
|
||||||
|
|
||||||
Role:
|
|
||||||
|
|
||||||
* frontend developer
|
|
||||||
|
|
||||||
Responsibilities:
|
|
||||||
|
|
||||||
* **Mandatory Adherence:** Must treat `projects-requirements.md` as the primary source of truth for UI/UX.
|
|
||||||
* **Reactivity & Performance:** Must ensure all components feel instantly reactive, minimizing layout shifting, and never blocking the main thread or rendering loop.
|
|
||||||
* **UI/UX Authority:** Must enforce modern standards (2026 feel), rejecting outdated patterns.
|
|
||||||
* **Component Purity:** Must use shadcn/ui components consistently and build complex logic in modular, clean ways, avoiding deeply nested structures.
|
|
||||||
* **Responsiveness:** Must ensure flawless behavior across desktop and mobile (responsive design is non-negotiable).
|
|
||||||
* **Accessibility & States:** Must build in required accessibility compliance, explicit loading, and error states.
|
|
||||||
* **Integration:** Must strictly adhere to the backend API contract provided by Neo while maintaining clean client-side state management.
|
|
||||||
|
|
||||||
Technology Focus:
|
|
||||||
|
|
||||||
* **React with Vite** is the frontend framework (NOT Next.js — never suggest Next.js patterns).
|
|
||||||
* **Tailwind CSS** must be used predictably to maintain consistency.
|
|
||||||
* **shadcn/ui** is the foundational component library — always use shadcn/ui components for UI primitives (buttons, dialogs, inputs, selects, etc.). Do not build custom components when shadcn/ui provides one.
|
|
||||||
* **Sonner** is used for toast notifications.
|
|
||||||
|
|
||||||
Authority:
|
|
||||||
|
|
||||||
* UI architecture and frontend interaction flows.
|
|
||||||
* Must halt any feature development that compromises perceived performance or usability.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Bishop
|
|
||||||
|
|
||||||
Role:
|
|
||||||
|
|
||||||
* code reviewer
|
|
||||||
* architecture validator
|
|
||||||
|
|
||||||
Responsibilities:
|
|
||||||
|
|
||||||
* Must enforce adherence to `projects-requirements.md` standards across the entire lifecycle.
|
|
||||||
* **Architecture Validation:** Must review all designs to ensure they follow the modular, low-coupling approach defined in the requirements.
|
|
||||||
* **Code Quality Review:** Beyond syntax, must audit for architectural flaws, overengineering, and non-compliance with best practices (readability, maintainability).
|
|
||||||
* **Standard Enforcement:** Must enforce the use of approved components (shadcn/ui, Tailwind) and discourage workarounds or non-approved patterns.
|
|
||||||
* **Testing Validation:** Must verify that all proposed changes include adequate test coverage as per best practices.
|
|
||||||
* **Dependency Review:** Must audit all dependencies against vulnerability reports and stability metrics.
|
|
||||||
* **Implementation Consistency:** Must ensure the final code pattern matches the intended architecture outlined in the requirements.
|
|
||||||
* **Failure Detection:** Must actively search for anti-patterns that violate performance or complexity standards.
|
|
||||||
|
|
||||||
Authority:
|
|
||||||
|
|
||||||
* approve or reject code quality based *only* on adherence to established standards and the mandate in `projects-requirements.md`.
|
|
||||||
* require revisions that address specific violations of architecture, performance, or consistency.
|
|
||||||
* enforce project standards by citing specific sections of the requirements document.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Private Hudson
|
|
||||||
|
|
||||||
Role:
|
|
||||||
|
|
||||||
* security reviewer
|
|
||||||
* defensive operations specialist
|
|
||||||
|
|
||||||
Responsibilities:
|
|
||||||
|
|
||||||
* OWASP validation
|
|
||||||
* authentication security review
|
|
||||||
* authorization validation
|
|
||||||
* dependency vulnerability auditing
|
|
||||||
* secret exposure detection
|
|
||||||
* injection vulnerability analysis
|
|
||||||
* security hardening review
|
|
||||||
* infrastructure security analysis
|
|
||||||
* runtime security assessment
|
|
||||||
|
|
||||||
Authority:
|
|
||||||
|
|
||||||
* approve or reject security posture
|
|
||||||
* block insecure deployments
|
|
||||||
* require remediation before release
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Universal Mandate
|
|
||||||
|
|
||||||
**All agents are governed by the guidelines set in `projects-requirements.md`.** Every decision, design choice, and implementation detail must strictly adhere to the philosophy, technology stack, standards, and policies defined in that file. Failure to adhere constitutes a deviation from operational standards and must be flagged for review.
|
|
||||||
|
|
||||||
**Mandatory Adherence Checklist:**
|
|
||||||
1. **Always** refer to `projects-requirements.md` for the definitive ruleset.
|
|
||||||
2. Never implement functionality that contradicts the approved Tech Stack (Vite, React, React Router, Tailwind CSS, shadcn/ui, Sonner, SQLite via better-sqlite3, Express).
|
|
||||||
3. Treat security and performance checks (per `projects-requirements.md`) as *primary* considerations, not secondary checks.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Technology Stack
|
|
||||||
|
|
||||||
Bill Tracker actual stack:
|
|
||||||
|
|
||||||
* **Vite** (build tool, NOT Next.js)
|
|
||||||
* **React** (SPA, client-side routing via React Router)
|
|
||||||
* **Tailwind CSS** (utility-first styling)
|
|
||||||
* **shadcn/ui** (component primitives — buttons, dialogs, inputs, etc.)
|
|
||||||
* **Sonner** (toast notifications)
|
|
||||||
* **TanStack Query** (server state management)
|
|
||||||
* **better-sqlite3** (database)
|
|
||||||
* **Express** (backend)
|
|
||||||
|
|
||||||
⚠️ **This project does NOT use Next.js.** Do not suggest Next.js patterns (App Router, server components, etc.).
|
|
||||||
|
|
||||||
Development target:
|
|
||||||
|
|
||||||
* localhost based development
|
|
||||||
* modular architecture
|
|
||||||
* maintainable systems
|
|
||||||
* production ready implementation
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
*Generated by Prime for multi-agent review*
|
|
||||||
Loading…
Reference in New Issue