# Dependencies Semua dependency dideklarasikan di `[workspace.dependencies]` dalam `Cargo.toml` root, lalu di-*inherit* oleh setiap crate anggota. ## Crate per Layer ### Domain (`apps/domain`) Hanya boleh pakai dependency yang tidak membawa I/O: | Crate | Versi | Fungsi | |-------|-------|--------| | `serde` | 1 | Serialisasi (derive) | | `serde_json` | 1 | JSON | | `chrono` | 0.4 | Tanggal/waktu | | `uuid` | 1 | UUID v4/v5 | | `anyhow` | 1 | Error handling | | `thiserror` | 1 | Derive error types | ### Infrastructure (`apps/infrastructure`) Semua I/O, LLM, DB, tools: | Crate | Versi | Fungsi | |-------|-------|--------| | `tokio` | 1 | Async runtime (rt-multi-thread, macros, sync, time, net, io-util, signal) | | `reqwest` | 0.13 | HTTP client (json, stream, blocking, native-tls-vendored, form) | | `rusqlite` | 0.40 | SQLite (bundled — tidak perlu install sistem) | | `rmcp` | 2.2 | MCP client (child-process, streamable HTTP) | | `tiktoken-rs` | 0.12 | Token counting (OpenAI cl100k) | | `similar` | 3 | Diff computation | | `syntect` | 5 | Syntax highlighting (default-fancy) | | `ignore` | 0.4 | File walking dengan `.gitignore` support | | `globset` | 0.4 | Glob pattern matching | | `include_dir` | 0.7 | Embed direktori ke binary | | `infer` | 0.19 | Deteksi tipe file dari byte signature | | `regex` | 1 | Regular expressions | | `nucleo-matcher` | 0.3 | Fuzzy matching (untuk `@mention` autocomplete) | | `webbrowser` | 1 | Buka URL di browser (OAuth) | | `url` | 2 | URL parsing | | `percent-encoding` | 2 | URL encoding | | `dom_smoothie` | 0.18.0 | HTML DOM manipulation | | `fast_html2md` | 0.0.62 | HTML → Markdown | | `scraper` | 0.27.0 | HTML parsing + CSS selector | | `pulldown-cmark` | 0.13 | Markdown parsing | | `lsp-types` | 0.97 | LSP protocol types | | `futures-util` | 0.3 | Async stream combinators | | `libc` | 0.2 | Raw C FFI (Unix process groups) | ### TUI (`apps/interfaces/tui`) | Crate | Versi | Fungsi | |-------|-------|--------| | `ratatui` | 0.30.2 | TUI framework | | `crossterm` | 0.29 | Terminal manipulation (raw mode, events, mouse) | | `base64` | 0.22 | Base64 (OSC52 clipboard) | | `sha2` | 0.11 | SHA-256 | | `hex` | 0.4 | Hex encoding | | `dirs` | 6 | Platform data directory | ### API (`apps/interfaces/api`) | Crate | Versi | Fungsi | |-------|-------|--------| | `axum` | 0.8 | HTTP server framework (macros) | | `tower` | 0.5 | Middleware layer | | `tower-http` | 0.6 | CORS, body limit | | `argon2` | 0.5 | Password hashing | | `jsonwebtoken` | 9 | JWT (HS256) | | `clap` | 4 | CLI argument parsing (derive) | | `rand_core` | 0.6 | Secure random (getrandom) | ### Serialization (semua layer) | Crate | Versi | Fungsi | |-------|-------|--------| | `serde` | 1 | Framework serialisasi | | `serde_json` | 1 | JSON | | `serde_yaml_ng` | 0.10 | YAML (frontmatter memory files) | ## Layanan Eksternal | Layanan | Fungsi | |---------|--------| | **LLM Provider** | OpenAI/Anthropic-compatible API (default: OpenCode AI / DeepSeek) | | **MCP Servers** | Tool servers eksternal via stdio atau HTTP | | **LSP Servers** | `rust-analyzer`, `typescript-language-server`, `pyright`, `gopls`, dll | | **GitHub** | Release artifacts via semantic-release CI | ## Build & CI ### Compiler Lints (`Cargo.toml` workspace) ```toml [workspace.lints.rust] unused = "deny" dead_code = "deny" unreachable_code = "deny" unused_imports = "deny" unused_variables = "deny" unused_mut = "deny" unused_must_use = "deny" deprecated = "deny" trivial_casts = "deny" trivial_numeric_casts = "deny" [workspace.lints.clippy] all = { level = "warn", priority = -1 } pedantic = { level = "warn", priority = -2 } ``` ### Release Profile ```toml [profile.release] opt-level = 3 lto = "fat" codegen-units = 1 panic = "abort" strip = "symbols" overflow-checks = true ``` ### CI/CD - **CI**: `cargo build` + `cargo test` + `cargo clippy --all-targets` pada setiap push - **Release**: semantic-release — auto changelog, Cargo.toml version bump, GitHub artifact upload - **Versioning**: `v1.17.0` (saat ini) — mengikuti semver dari commit messages ## Feature Flags Penting | Crate | Feature | Alasan | |-------|---------|--------| | `rusqlite` | `bundled` | SQLite statically linked — tidak perlu install sistem | | `reqwest` | `blocking` | Sync HTTP untuk agent turn di blocking thread | | `reqwest` | `native-tls-vendored` | TLS tanpa dependency sistem | | `tokio` | `rt-multi-thread` | Async runtime multi-thread | | `pulldown-cmark` | *(no default)* | Tidak include semua fitur berat | | `syntect` | `default-fancy` | Syntax highlighting penuh | | `rmcp` | `transport-child-process` + `transport-streamable-http-client-reqwest` | MCP via stdio dan HTTP |