Commit graph

267 commits

Author SHA1 Message Date
d4d09f73d2
migrate projections tab to new framework 2026-05-14 22:43:28 -07:00
61dd86dc9a
migrate history tab to new framework 2026-05-14 18:29:37 -07:00
d4d8961eff
perf -> performance 2026-05-14 14:52:53 -07:00
4761de9d28
move most tabs to new framework 2026-05-14 14:50:36 -07:00
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
dc956a2b8d
add overlay information to README 2026-05-13 13:07:10 -07:00
bacc01d9f4
add accumulation SWR todo 2026-05-13 13:06:19 -07:00
9cea368f2c
initial implementation of projections actual (note TODO comments) 2026-05-13 13:05:01 -07:00
cbb32727d8
adding previously ignored example files 2026-05-13 11:15:04 -07:00
c3d796c8a9
let direct indexing ratio be precise 2026-05-12 21:42:13 -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
d94ffb3410
add additional data in examples/ directories 2026-05-12 17:26:24 -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
b75381a9bd
update todo.md 2026-05-08 15:02:44 -07:00
86cf60447f
nag when data is stale 2026-05-08 14:47:31 -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
1ab6fd8353
unnoisy the tests 2026-05-08 12:30:48 -07:00
896347692c
check etag header if present, give a single retry on body validation error 2026-05-08 12:21:31 -07:00
42b8ff1b38
more robuster error capturing - looks like torn srf is in http transit 2026-05-08 11:50:50 -07:00
f605e1f764
add age-based horizon to projections 2026-05-08 11:40:33 -07:00
a26470f46a
transaction documentation 2026-05-07 14:50:08 -07:00
88de7a9882
surface suspected account cash transfers through audit command 2026-05-07 14:32:36 -07:00
7729ac8d7e
initial transfer capability on contributions 2026-05-07 10:43:59 -07:00
cab4c291ad
begin transfer log 2026-05-06 22:10:13 -07:00
10f54c24ad
allow explicit pinning of snapshots and commits 2026-05-05 13:06:30 -07:00
8a09d904e2
output ratio suggestions to reconcile Schwab direct indexing accounts 2026-05-04 15:14:37 -07:00
f007a1d350
update TODOs 2026-05-02 11:33:48 -07:00
1839bce49b
add projections comparison to compare and projections commands 2026-05-02 11:29:55 -07:00
6e0861c5dd
rename "Conservative estimate" to "Projected return" 2026-05-02 11:16:32 -07:00
f28d98f708
clear up the attributions output 2026-05-02 11:10:39 -07:00
67351bc936
fix segfault on audit 2026-05-02 11:07:17 -07:00
fef126471f
clean up contributions command 2026-05-02 11:02:06 -07:00
7a05d53dc9
address symptom of Torn SRF files while we track this down 2026-05-02 10:07:59 -07:00
94311f6ff7
use new common cli helpers throughout
All checks were successful
Generic zig build / build (push) Successful in 2m3s
Generic zig build / deploy (push) Successful in 15s
2026-05-01 16:22:19 -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
90ed1dabd3
use atomic file writes for data pulling from server 2026-05-01 08:53:14 -07:00
6a2cc8e775
add new compare command (CLI only for now) 2026-05-01 08:52:43 -07:00
0d3dfc6a55
handle write failed due to piping through commands like head
All checks were successful
Generic zig build / build (push) Successful in 1m59s
Generic zig build / deploy (push) Successful in 17s
2026-04-30 15:27:08 -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
25d763e306
update todo list 2026-04-30 10:14:40 -07:00
8387692de1
incorporate life events (e.g. social security) into projections 2026-04-30 10:10:44 -07:00
c58edb4f1c
hide projections when not in portfolio mode 2026-04-28 15:54:21 -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