Commit graph

369 commits

Author SHA1 Message Date
166e8b4e6b derive tab states from tab modules/remove file level imports 2026-05-15 08:33:32 -07:00
492774c04e migrate portfolio tab to new framework 2026-05-15 08:06:34 -07:00
afe9eacf1d migrate projections tab to new framework 2026-05-14 22:43:28 -07:00
13145590d1 migrate history tab to new framework 2026-05-14 18:29:37 -07:00
e27904df69 perf -> performance 2026-05-14 14:52:53 -07:00
dd6fad9184 move most tabs to new framework 2026-05-14 14:50:36 -07:00
4ffddb44a2 migrate earnings tab to new framework 2026-05-14 11:47:47 -07:00
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
6506a98a63 add overlay information to README 2026-05-13 13:07:10 -07:00
bff4569665 add accumulation SWR todo 2026-05-13 13:06:19 -07:00
cf948d607b initial implementation of projections actual (note TODO comments) 2026-05-13 13:05:01 -07:00
bda38e3c05 adding previously ignored example files 2026-05-13 11:15:04 -07:00
0b22277544 let direct indexing ratio be precise 2026-05-12 21:42:13 -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
d23a9a181c add additional data in examples/ directories 2026-05-12 17:26:24 -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
a611c20f54 update todo.md 2026-05-08 15:02:44 -07:00
24dd862abc nag when data is stale 2026-05-08 14:47:31 -07:00
91bdd1d648 move ** -> @splat 2026-05-08 12:36:12 -07:00
57d3b03623 unnoisy the tests 2026-05-08 12:30:48 -07:00
832ce93155 check etag header if present, give a single retry on body validation error 2026-05-08 12:21:31 -07:00
d9c00b6bcb more robuster error capturing - looks like torn srf is in http transit 2026-05-08 11:50:50 -07:00
77ec6945a0 add age-based horizon to projections 2026-05-08 11:40:33 -07:00
000f3febef transaction documentation 2026-05-07 14:50:08 -07:00
d4c944f1bb surface suspected account cash transfers through audit command 2026-05-07 14:32:36 -07:00
78c9afc2d8 initial transfer capability on contributions 2026-05-07 10:43:59 -07:00
c21ff84758 begin transfer log 2026-05-06 22:10:13 -07:00
3f0a40cea7 allow explicit pinning of snapshots and commits 2026-05-05 13:06:30 -07:00
ea1a88442a output ratio suggestions to reconcile Schwab direct indexing accounts 2026-05-04 15:14:37 -07:00
2238733de7 update TODOs 2026-05-02 11:33:48 -07:00
d472402680 add projections comparison to compare and projections commands 2026-05-02 11:29:55 -07:00
ac62b5bd1e rename "Conservative estimate" to "Projected return" 2026-05-02 11:16:32 -07:00
12cc8fb9e7 clear up the attributions output 2026-05-02 11:10:39 -07:00
b8c6d1c7b2 fix segfault on audit 2026-05-02 11:07:17 -07:00
17225326de clean up contributions command 2026-05-02 11:02:06 -07:00
2ac1d30c37 address symptom of Torn SRF files while we track this down 2026-05-02 10:07:59 -07:00
8b6e10ea10 use new common cli helpers throughout 2026-05-01 16:22:19 -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
441735b3c6 use atomic file writes for data pulling from server 2026-05-01 08:53:14 -07:00
b3542771b7 add new compare command (CLI only for now) 2026-05-01 08:52:43 -07:00
6293a02c59 handle write failed due to piping through commands like head 2026-04-30 15:27:08 -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
ab1539444d update todo list 2026-04-30 10:14:40 -07:00
b241feeaf0 incorporate life events (e.g. social security) into projections 2026-04-30 10:10:44 -07:00