mirror of
https://github.com/0xrsydn/idx-cli.git
synced 2026-11-07 01:35:36 +00:00
Since June 2026 IDX publishes the monthly "Pemegang Saham di Atas 1%" list as an XLSX workbook on the Data Kepemilikan Saham page instead of a PDF announcement. Add a parser for it and accept `.xlsx` in `ownership import --file`. - src/ownership/xlsx.rs: zip + quick-xml reader (shared strings incl. rich text, sheet cells), exact 12-column header match so the daily above-5% and investor-type/classification workbooks are rejected, Excel serial dates, numeric shares, percent -> bps with float-noise rounding. Builds KseiHoldingDraft directly and reuses the entity normalizers, so investor types stay uppercase like the PDF path. - Fixtures: trimmed excerpts of the real 2026-08-31 above-1% and 2026-09-23 above-5% workbooks. - Unit + CLI tests: import, ticker, releases, above-5% rejection. - Docs: ARCHITECTURE parser pipeline, AGENTS ownership inputs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017a5Cv5Z1NzdYKgKnTiAF4E
3.2 KiB
3.2 KiB
AGENTS.md
Project
idx-cli is a Rust CLI for Indonesian stock market analysis and ownership workflows.
The repo currently has two main product areas:
stocks: live market data and analysisownership: import/sync once, then query locally from SQLite
Stack
- Rust stable
clap4 for CLIureq3 for HTTPcomfy-tableandowo-colorsfor outputrusqlite+ bundled SQLite/FTS5 for ownership- TOML config in
~/.config/idx/config.toml - file cache in
~/.cache/idx/
Source Map
src/
├── main.rs
├── cli/
│ ├── stocks.rs
│ ├── ownership.rs
│ ├── config.rs
│ └── cache.rs
├── api/
│ ├── mod.rs
│ ├── types.rs
│ ├── yahoo/
│ └── msn/
├── analysis/
├── ownership/
│ ├── archive.rs
│ ├── db.rs
│ ├── entities.rs
│ ├── parser.rs
│ ├── remote.rs
│ ├── snapshot.rs
│ └── types.rs
├── output/
├── cache.rs
├── config.rs
└── error.rs
Provider Model
MSNis the primary/default provider for quotes, fundamentals, profile, earnings, financials, sentiment, insights, news, and screener data.Yahoois the fallback provider for history/OHLCV because MSN history for IDX is still not supported.- Current config knobs:
IDX_PROVIDER=msn|yahooIDX_HISTORY_PROVIDER=auto|yahoo|msn
Ownership Model
Ownership is local-first after bootstrap.
Preferred bootstrap/update path:
idx ownership sync- if no snapshot manifest is available:
idx ownership discoverthenidx ownership import --url <pdf-url> - local
--fileimports remain available for manual/fallback use
Ownership input paths:
- primary remote source: discoverable IDX
above1holder-register PDF - maintained snapshot path:
ownership sync - local file imports: IDX above-1%
.xlsx(current format since June 2026), legacy.pdf, plus local archive.zip/.txt
Important scope note:
- archive ZIP/TXT ingest is a fallback/backstop path, not the primary product ingest surface
ownership import --fetch-bingis still intentionally unsupported
Working Principles
- Keep data access provider-driven where possible; avoid adding new ad hoc fetch paths at the CLI layer.
- Prefer pure parse/normalize transforms over hidden state.
- Use fixtures in tests; do not hit live network in automated tests.
- Preserve the output contract: table to stdout, JSON with
--output json, errors to stderr. - Treat ownership schema/query compatibility as important:
releases,ticker, andchangesshould keep working across ingest paths.
Verification
Core verification:
nix develop
cargo build
cargo clippy -- -D warnings
cargo test
Smoke tooling:
scripts/live-smoke.sh
scripts/live-smoke.sh --mode mock
scripts/live-smoke.sh --mode full
Read First
Start with these repo docs before making changes:
FEATURE_SPEC.md— active implementation backlog and remaining core gapsTODO.md— execution tracker and smoke notesdocs/ARCHITECTURE.md— provider and ownership flowdocs/OWNERSHIP_SYNC.md— snapshot sync contractdocs/SMOKE.md— reusable smoke commandsdocs/CONVENTIONS.md— repo conventions