Commit graph

75 commits

Author SHA1 Message Date
b6372a33de
migrate earnings tab to new framework 2026-05-14 11:47:47 -07:00
2ed34e6c10
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
9cea368f2c
initial implementation of projections actual (note TODO comments) 2026-05-13 13:05:01 -07:00
0987a61634
land date refactor (similar to money) 2026-05-12 21:40:32 -07:00
e62eb5f0a7
add new Money type with format helpers 2026-05-12 18:00:35 -07:00
bdd827734d
initial implementation of pre-retirement projections/accumulation phase 2026-05-12 16:37:28 -07:00
f9d2148c23
add ability to use imported history data 2026-05-12 10:52:43 -07:00
fad9be6ce8
upgrade to zig 0.16.0
All checks were successful
Generic zig build / build (push) Successful in 2m20s
Generic zig build / deploy (push) Successful in 27s
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
f9c7fa99e4
move ** -> @splat
All checks were successful
Generic zig build / build (push) Successful in 1m57s
Generic zig build / deploy (push) Successful in 17s
2026-05-08 12:36:12 -07:00
6e0861c5dd
rename "Conservative estimate" to "Projected return" 2026-05-02 11:16:32 -07:00
d15939a9ad
periodic review: projections --as-of, contributions --since, comparison and tui projections date picker 2026-05-01 15:59:17 -07:00
0aabdfb4f1
tui implementation of compare mode 2026-05-01 10:27:25 -07:00
f436ca5a86
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
9bb0d8036b
sort reverse chronological - now we have a lot more data 2026-04-30 15:23:45 -07:00
0c08cdda6c
replace finnhub with fmp - finnhub data not correct 2026-04-30 15:22:52 -07:00
8387692de1
incorporate life events (e.g. social security) into projections 2026-04-30 10:10:44 -07:00
7014c326d1
add total value to equity/fixed income display
All checks were successful
Generic zig build / build (push) Successful in 1m51s
Generic zig build / deploy (push) Successful in 15s
2026-04-28 12:30:16 -07:00
6ea0a58949
add graph and set up scrolling 2026-04-28 11:46:17 -07:00
bbdc46702f
fixed income vs equity on analysis 2026-04-28 10:48:59 -07:00
c0b980146c
initial commit projections TUI tab 2026-04-28 10:30:13 -07:00
4f75c2e006
style projections based on need to rebalance portfolio 2026-04-27 17:56:42 -07:00
77cc69efe0
ai: merge multiple positions with price_ratio fields
All checks were successful
Generic zig build / build (push) Successful in 1m48s
Generic zig build / deploy (push) Successful in 15s
2026-04-25 11:15:41 -07:00
11a282e2db
dedupe/centralize and add history view
All checks were successful
Generic zig build / build (push) Successful in 1m45s
Generic zig build / deploy (push) Successful in 16s
2026-04-23 23:06:02 -07:00
41208f3732
history view refactor 2026-04-23 16:02:34 -07:00
9364532c9b
fix portfolio account totals/honor as_of date 2026-04-23 02:43:04 -07:00
58c20a4de9
cleanup of _mod imports 2026-04-23 02:01:25 -07:00
b3ebc3f986
dedup the snapshot loading function 2026-04-23 01:25:00 -07:00
dac310e38e
initial tui history implementation 2026-04-23 00:32:18 -07:00
b3c1751eb6
net worth calc 2026-04-21 13:32:42 -07:00
3171be6f70
centralize portfolio value 2026-04-11 10:17:29 -07:00
ddd47dad66
better account filter for interactive mode 2026-04-10 09:39:26 -07:00
9337c198f4
reuse common account filtering in portfolio 2026-04-09 17:41:25 -07:00
ddf89f926f
file path seperators 2026-04-09 17:33:41 -07:00
1f9f90357f
create a view model for options and cds that is reused between cli/tui 2026-03-31 17:02:32 -07:00
9de40e8219
options and cd display cleanup (TUI) 2026-03-31 15:47:36 -07:00
31dd551efe
allow for filtering by account (substantial change to calculations - seems ok) 2026-03-31 11:03:37 -07:00
ac5e0639fc
dedup the cli/tui 2026-03-25 05:13:17 -07:00
057bca14a1
fixes for interactive symbol mode
All checks were successful
Generic zig build / build (push) Successful in 32s
2026-03-20 14:18:39 -07:00
6d99349b62
clean up chart.zig 2026-03-20 09:36:23 -07:00
04882a4ff8
cache chart and use sliding windows on bollinger bands 2026-03-20 09:23:41 -07:00
35fc9101fd
clean up quote 2026-03-20 08:51:49 -07:00
b718c1ae39
remove stupid one-liners that are not called/rename self in tabs 2026-03-20 08:29:45 -07:00
621a8db0df
move loads into tabs 2026-03-20 08:18:21 -07:00
2bcb84dafa
clean up earnings 2026-03-20 08:12:53 -07:00
31d49d4432
clean up perf 2026-03-19 14:32:03 -07:00
88241b2c7b
portfolio cli/tui cleanup 2026-03-19 14:25:13 -07:00
b4f3857cef
consolidate shared portfolio summary calculations 2026-03-19 13:28:18 -07:00
b162708055
consolidate drip summary 2026-03-19 13:04:20 -07:00
46bf34fd1c
remove old comment/reuse symbols 2026-03-19 12:50:51 -07:00
8124ca0e88
ai: remove edit feature 2026-03-19 12:12:48 -07:00