Commit graph

74 commits

Author SHA1 Message Date
2431f6a6b1 add TUI framework foundation
We're going to move to an interface-like pattern for tabs to remove a
lot of shared state and UI logic from tui.zig to the individual tabs. It
is not a full interface like Allocator because we do not need dynamic
dispatch here...the tabs are still known by tui.zig. This gives us the
ability to perform comptime evaluation and adherence to the spec.
2026-05-14 10:49:33 -07:00
cf948d607b initial implementation of projections actual (note TODO comments) 2026-05-13 13:05:01 -07:00
80a00009d8 land date refactor (similar to money) 2026-05-12 21:40:32 -07:00
dc8451065d add new Money type with format helpers 2026-05-12 18:00:35 -07:00
3615c4caf8 initial implementation of pre-retirement projections/accumulation phase 2026-05-12 16:37:28 -07:00
2616209614 add ability to use imported history data 2026-05-12 10:52:43 -07:00
53b807d12e upgrade to zig 0.16.0
IO-as-an-interface refactor across the codebase. The big shifts:
- std.io → std.Io, std.fs → std.Io.Dir/File, std.process.Child → spawn/run.
- Juicy Main: pub fn main(init: std.process.Init) gives gpa, io, arena,
  environ_map up front. main.zig + the build/ scripts use it directly.
- Threading io through everywhere that touches the outside world (HTTP,
  files, stderr, sleep, terminal detection). Functions taking `io` now
  announce side effects at the call site — the smell is the feature.
- date math takes `as_of: Date`, not `today: Date`. Caller resolves
  `--as-of` flag vs wall-clock at the boundary; the function operates
  on whatever date it's given. Every "today" parameter renamed and
  the as_of: ?Date + today: Date pattern collapsed.
- now_s: i64 (or before_s/after_s pairs) for sub-second metadata
  fields like snapshot captured_at, audit cadence, formatAge/fmtTimeAgo.
  Also pure and testable.
- legitimate Timestamp.now callers (cache TTL math, FetchResult
  timestamps, rate limiter, per-frame TUI "now" captures) gain
  `// wall-clock required: ...` comments justifying the read.

Test discovery: replaced the local refAllDeclsRecursive with bare
std.testing.refAllDecls(@This()). Sema-pulling main.zig's top-level
decls reaches every test file transitively through the import graph;
no explicit _ = @import(...) lines needed.

Cleanup along the way:
- Dropped DataService.allocator()/io() accessor methods; renamed the
  fields to drop the base_ prefix. Callers use self.allocator and
  self.io directly.
- Dropped now-vestigial io parameters from buildSnapshot,
  analyzePortfolio, compareSchwabSummary, compareAccounts,
  buildPortfolioData, divs.display, quote.display, parsePortfolioOpts,
  aggregateLiveStocks, renderEarningsLines, capitalGainsIndicator,
  aggregateDripLots, printLotRow, portfolio.display, printSnapNote.
- Dropped the unused contributions.computeAttribution date-form
  wrapper (only computeAttributionSpec is called).
- formatAge/fmtTimeAgo take (before_s, after_s) instead of io and
  reading the clock internally.
- parseProjectionsConfig uses an internal stack-buffer
  FixedBufferAllocator instead of an allocator parameter.
- ThreadSafeAllocator wrappers in cache concurrency tests dropped
  (0.16's DebugAllocator is thread-safe by default).
- analyzePortfolio bug surfaced by the rename: snapshot.zig was
  passing wall-clock today instead of as_of, mis-valuing cash/CDs
  for historical backfills.

83 new unit tests added due to removal of IO, bringing coverage from 58%
-> 64%
2026-05-09 22:40:33 -07:00
91bdd1d648 move ** -> @splat 2026-05-08 12:36:12 -07:00
ac62b5bd1e rename "Conservative estimate" to "Projected return" 2026-05-02 11:16:32 -07:00
f7c6224a1b periodic review: projections --as-of, contributions --since, comparison and tui projections date picker 2026-05-01 15:59:17 -07:00
0bf44581e1 tui implementation of compare mode 2026-05-01 10:27:25 -07:00
add0222ebc remove when column
it was marginal benefit before, and now fmp does not
even have the data, so not worth showing
2026-04-30 15:26:38 -07:00
a64308ee87 sort reverse chronological - now we have a lot more data 2026-04-30 15:23:45 -07:00
494177ca24 replace finnhub with fmp - finnhub data not correct 2026-04-30 15:22:52 -07:00
b241feeaf0 incorporate life events (e.g. social security) into projections 2026-04-30 10:10:44 -07:00
54efdc3e7c add total value to equity/fixed income display 2026-04-28 12:30:16 -07:00
e5c8f6f144 add graph and set up scrolling 2026-04-28 11:46:17 -07:00
ac9f5a78d3 fixed income vs equity on analysis 2026-04-28 10:48:59 -07:00
33d5d7cbb4 initial commit projections TUI tab 2026-04-28 10:30:13 -07:00
5fb1cfe53c style projections based on need to rebalance portfolio 2026-04-27 17:56:42 -07:00
94494c60ee ai: merge multiple positions with price_ratio fields 2026-04-25 11:15:41 -07:00
8b010eb592 dedupe/centralize and add history view 2026-04-23 23:06:02 -07:00
9af99ef8c8 history view refactor 2026-04-23 16:02:34 -07:00
efb05801cb fix portfolio account totals/honor as_of date 2026-04-23 02:43:04 -07:00
e68372036d cleanup of _mod imports 2026-04-23 02:01:25 -07:00
9acf3115db dedup the snapshot loading function 2026-04-23 01:25:00 -07:00
5196a320f6 initial tui history implementation 2026-04-23 00:32:18 -07:00
8c3435cd96 net worth calc 2026-04-21 13:32:42 -07:00
03fd64958b centralize portfolio value 2026-04-11 10:17:29 -07:00
d4b40cbe5c better account filter for interactive mode 2026-04-10 09:39:26 -07:00
922b3d604e reuse common account filtering in portfolio 2026-04-09 17:41:25 -07:00
376000731b file path seperators 2026-04-09 17:33:41 -07:00
4e0270c884 create a view model for options and cds that is reused between cli/tui 2026-03-31 17:02:32 -07:00
3ea39d3c31 options and cd display cleanup (TUI) 2026-03-31 15:47:36 -07:00
db6a101e32 allow for filtering by account (substantial change to calculations - seems ok) 2026-03-31 11:03:37 -07:00
9c27eb8f25 dedup the cli/tui 2026-03-25 05:13:17 -07:00
92ce2f449d fixes for interactive symbol mode 2026-03-20 14:18:39 -07:00
5758f943c6 clean up chart.zig 2026-03-20 09:36:23 -07:00
f02093928c cache chart and use sliding windows on bollinger bands 2026-03-20 09:23:41 -07:00
f227cfc655 clean up quote 2026-03-20 08:51:49 -07:00
9610d773b0 remove stupid one-liners that are not called/rename self in tabs 2026-03-20 08:29:45 -07:00
ae76036090 move loads into tabs 2026-03-20 08:18:21 -07:00
2aaa3e91af clean up earnings 2026-03-20 08:12:53 -07:00
5f57a63ebc clean up perf 2026-03-19 14:32:03 -07:00
0099edcb10 portfolio cli/tui cleanup 2026-03-19 14:25:13 -07:00
5756934d6e consolidate shared portfolio summary calculations 2026-03-19 13:28:18 -07:00
04358e5561 consolidate drip summary 2026-03-19 13:04:20 -07:00
ccdbfdeac2 remove old comment/reuse symbols 2026-03-19 12:50:51 -07:00
c8fb298a83 ai: remove edit feature 2026-03-19 12:12:48 -07:00
1f6b66da80 remove magic numbers 2026-03-19 11:30:12 -07:00