refactor: nama binary final tia-love (cmd/, Makefile, README, PRD)

This commit is contained in:
oxpoe committed 2026-10-15 06:55:42 +07:00
1 parent db75653e3d
commit 3b4bbf09bc
6 files changed
+44 -41

No files matched your search

+1 -1
View File
@@ -1,5 +1,5 @@
# Build artifacts # Build artifacts
/tia /tia-love
/dist/ /dist/
*.exe *.exe
+2 -2
View File
@@ -1,9 +1,9 @@
BINARY := tia BINARY := tia-love
.PHONY: build run test vet fmt clean .PHONY: build run test vet fmt clean
build: build:
go build -o $(BINARY) ./cmd/tia go build -o $(BINARY) ./cmd/tia-love
run: build run: build
./$(BINARY) ./$(BINARY)
+7 -5
View File
@@ -11,16 +11,18 @@ Status: **Phase 0 — fondasi** (lihat roadmap di `docs/PRD.md` §8).
## Build & jalankan ## Build & jalankan
```bash ```bash
make build # menghasilkan ./tia make build # menghasilkan ./tia-love
./tia # buka TUI ./tia-love # buka TUI
./tia version # versi & build info ./tia-love version # versi & build info
make test # unit test make test # unit test
``` ```
Nama binary final: **`tia-love`** (nama produk tetap **tia**).
## Struktur repo ## Struktur repo
``` ```
cmd/tia/ entry point — router TUI default vs CLI companion cmd/tia-love/ entry point — router TUI default vs CLI companion
internal/app/ root Bubble Tea model internal/app/ root Bubble Tea model
internal/ (menyusul) docker, stack, config, ui, i18n, host, cli, audio internal/ (menyusul) docker, stack, config, ui, i18n, host, cli, audio
docs/PRD.md product requirements docs/PRD.md product requirements
+5 -4
View File
@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"os" "os"
"runtime/debug" "runtime/debug"
"strings"
tea "charm.land/bubbletea/v2" tea "charm.land/bubbletea/v2"
@@ -13,8 +14,8 @@ import (
const usage = `tia — Terminal Is A My Way (Just Work) const usage = `tia — Terminal Is A My Way (Just Work)
Pemakaian: Pemakaian:
tia Buka TUI interaktif tia-love Buka TUI interaktif
tia version Tampilkan versi & build info tia-love version Tampilkan versi & build info
Subcommand CLI pendamping (convert, ps, up, down, update, doctor) Subcommand CLI pendamping (convert, ps, up, down, update, doctor)
menyusul di Phase 1–3 — lihat docs/PRD.md §F-028. menyusul di Phase 1–3 — lihat docs/PRD.md §F-028.
@@ -33,7 +34,7 @@ func main() {
} }
if _, err := tea.NewProgram(app.New()).Run(); err != nil { if _, err := tea.NewProgram(app.New()).Run(); err != nil {
fmt.Fprintln(os.Stderr, "tia:", err) fmt.Fprintln(os.Stderr, "tia-love:", err)
os.Exit(1) os.Exit(1)
} }
} }
@@ -45,7 +46,7 @@ func versionString() string {
return "tia dev" return "tia dev"
} }
ver := info.Main.Version ver := info.Main.Version
if ver == "" || ver == "(devel)" { if ver == "" || ver == "(devel)" || strings.HasPrefix(ver, "v0.0.0-") {
ver = "dev" ver = "dev"
} }
rev, dirty := "", false rev, dirty := "", false
+28 -28
View File
@@ -26,11 +26,11 @@ Tagline: "Just Work"
### Prinsip Produk: Satu Binary Multifungsi (TUI Utama + CLI Pendamping) ### Prinsip Produk: Satu Binary Multifungsi (TUI Utama + CLI Pendamping)
tia hadir sebagai **satu binary mandiri (single static binary)** yang fleksibel dengan filosofi **"Just Work"**: tia hadir sebagai **satu binary mandiri (single static binary)** yang fleksibel dengan filosofi **"Just Work"**:
1. **Pengalaman Utama = TUI Interaktif Penuh:** 1. **Pengalaman Utama = TUI Interaktif Penuh:**
Menjalankan `tia` tanpa argumen langsung meluncurkan TUI modern lengkap dengan dashboard keren (logo, jam digital ASCII), animasi dinamis, mouse support penuh, efek suara interaktif, dan notifikasi toast status. Menjalankan `tia-love` tanpa argumen langsung meluncurkan TUI modern lengkap dengan dashboard keren (logo, jam digital ASCII), animasi dinamis, mouse support penuh, efek suara interaktif, dan notifikasi toast status.
2. **Mode CLI Pendamping (Scriptable & Headless):** 2. **Mode CLI Pendamping (Scriptable & Headless):**
Untuk kebutuhan otomatisasi, CI/CD, atau perintah kilat tanpa membuka antarmuka TUI, binary yang sama dapat dipanggil dengan subcommand CLI (misal: `tia convert ...`, `tia ps`, `tia up <stack>`, `tia doctor`). Seluruh logika inti di-share dari `internal/core`, sehingga output dan perilakunya 100% konsisten. Untuk kebutuhan otomatisasi, CI/CD, atau perintah kilat tanpa membuka antarmuka TUI, binary yang sama dapat dipanggil dengan subcommand CLI (misal: `tia-love convert ...`, `tia-love ps`, `tia-love up <stack>`, `tia-love doctor`). Seluruh logika inti di-share dari `internal/core`, sehingga output dan perilakunya 100% konsisten.
3. **Instalasi Instan:** 3. **Instalasi Instan:**
Dapat diinstal dengan **1 baris perintah (`curl -fsSL ... | sh`)** atau cukup unduh binary Go precompiled secara manual dan langsung jalankan (`./tia`). Dapat diinstal dengan **1 baris perintah (`curl -fsSL ... | sh`)** atau cukup unduh binary Go precompiled secara manual dan langsung jalankan (`./tia-love`).
4. **Mouse & Keyboard Setara:** 4. **Mouse & Keyboard Setara:**
Seluruh navigasi dan operasi di TUI ramah mouse (klik, drag, scroll, hover) maupun keyboard shortcut vim-like. Seluruh navigasi dan operasi di TUI ramah mouse (klik, drag, scroll, hover) maupun keyboard shortcut vim-like.
5. **Aset Bebas & Terbuka:** 5. **Aset Bebas & Terbuka:**
@@ -67,7 +67,7 @@ tia hadir sebagai **satu binary mandiri (single static binary)** yang fleksibel
| **Audio Engine** | Oto v3 | `github.com/ebitengine/oto/v3` | Pure-Go audio player (`CGO_ENABLED=0`), PulseAudio/PipeWire/ALSA fallback | | **Audio Engine** | Oto v3 | `github.com/ebitengine/oto/v3` | Pure-Go audio player (`CGO_ENABLED=0`), PulseAudio/PipeWire/ALSA fallback |
| **Audio Assets** | Kenney Interface Sounds | CC0 1.0 Universal | Aset audio open-source tanpa royalti, WAV 44.1kHz mono embedded (<2MB) | | **Audio Assets** | Kenney Interface Sounds | CC0 1.0 Universal | Aset audio open-source tanpa royalti, WAV 44.1kHz mono embedded (<2MB) |
| **Animation Engine**| Harmonica v2 | `charm.land/harmonica/v2` | Fisika pegas (spring physics) & timer ticker 30 FPS untuk animasi TUI | | **Animation Engine**| Harmonica v2 | `charm.land/harmonica/v2` | Fisika pegas (spring physics) & timer ticker 30 FPS untuk animasi TUI |
| **CLI Dispatcher** | Native Go Router | Go standard library | Router ringan untuk mode CLI pendamping (`tia convert`, `tia ps`, dll) | | **CLI Dispatcher** | Native Go Router | Go standard library | Router ringan untuk mode CLI pendamping (`tia-love convert`, `tia-love ps`, dll) |
### Docker Interaction Strategy: Hybrid ### Docker Interaction Strategy: Hybrid
@@ -320,16 +320,16 @@ tia hadir sebagai **satu binary mandiri (single static binary)** yang fleksibel
#### F-028: Satu Binary Multifungsi & CLI Companion Mode #### F-028: Satu Binary Multifungsi & CLI Companion Mode
- **Priority:** P0 (arsitektur fondasi) - **Priority:** P0 (arsitektur fondasi)
- **Description:** `tia` adalah satu file binary mandiri (single binary) yang multifungsi. Secara default `tia` membuka TUI interaktif penuh, namun dapat dipanggil langsung dari command line (CLI mode) untuk eksekusi skrip, CI/CD, atau konversi cepat tanpa membuka TUI. - **Description:** `tia-love` adalah satu file binary mandiri (single binary) yang multifungsi. Secara default `tia-love` membuka TUI interaktif penuh, namun dapat dipanggil langsung dari command line (CLI mode) untuk eksekusi skrip, CI/CD, atau konversi cepat tanpa membuka TUI.
- **Subcommand CLI Pendamping:** - **Subcommand CLI Pendamping:**
- `tia`: Meluncurkan antarmuka TUI interaktif penuh. - `tia-love`: Meluncurkan antarmuka TUI interaktif penuh.
- `tia convert [flags/command]`: Mengonversi perintah `docker run` menjadi compose YAML dan mencetaknya ke stdout atau menyimpannya langsung ke direktori stack (contoh: `tia convert "docker run -d -p 80:80 nginx"`). - `tia-love convert [flags/command]`: Mengonversi perintah `docker run` menjadi compose YAML dan mencetaknya ke stdout atau menyimpannya langsung ke direktori stack (contoh: `tia-love convert "docker run -d -p 80:80 nginx"`).
- `tia ps`: Menampilkan ringkasan status semua stack & kontainer dalam format tabel rapi atau JSON (`--json`). - `tia-love ps`: Menampilkan ringkasan status semua stack & kontainer dalam format tabel rapi atau JSON (`--json`).
- `tia up <stack-name>`: Menjalankan stack di background tanpa membuka TUI. - `tia-love up <stack-name>`: Menjalankan stack di background tanpa membuka TUI.
- `tia down <stack-name>`: Menghentikan & menurunkan stack. - `tia-love down <stack-name>`: Menghentikan & menurunkan stack.
- `tia update <stack-name>`: Menarik image terbaru dan merefresh kontainer stack via CLI. - `tia-love update <stack-name>`: Menarik image terbaru dan merefresh kontainer stack via CLI.
- `tia doctor`: Memeriksa kesehatan sistem (koneksi Docker daemon, ketersediaan sound server/driver, versi Go, direktori stack). - `tia-love doctor`: Memeriksa kesehatan sistem (koneksi Docker daemon, ketersediaan sound server/driver, versi Go, direktori stack).
- `tia version` / `tia --version`: Menampilkan versi, commit git, dan build info. - `tia-love version` / `tia-love --version`: Menampilkan versi, commit git, dan build info.
- **Acceptance Criteria:** - **Acceptance Criteria:**
- Berbagi basis kode logika inti yang sama di `internal/core`, menjamin kesamaan hasil antara eksekusi di TUI dan CLI. - Berbagi basis kode logika inti yang sama di `internal/core`, menjamin kesamaan hasil antara eksekusi di TUI dan CLI.
- Kode keluar (*exit codes*) standar (0 = sukses, >0 = error) untuk integrasi skrip bash. - Kode keluar (*exit codes*) standar (0 = sukses, >0 = error) untuk integrasi skrip bash.
@@ -338,7 +338,7 @@ tia hadir sebagai **satu binary mandiri (single static binary)** yang fleksibel
#### F-029: 1-Line Installer & Standalone Binary Distribution #### F-029: 1-Line Installer & Standalone Binary Distribution
- **Priority:** P0 (distribusi rilis) - **Priority:** P0 (distribusi rilis)
- **Description:** Pengguna dapat memasang `tia` dalam hitungan detik menggunakan perintah instalasi satu baris (*one-line command*) otomatis, atau dengan mengunduh binary Go mandiri tanpa proses kompilasi manual. - **Description:** Pengguna dapat memasang `tia-love` dalam hitungan detik menggunakan perintah instalasi satu baris (*one-line command*) otomatis, atau dengan mengunduh binary Go mandiri tanpa proses kompilasi manual.
- **Metode Instalasi:** - **Metode Instalasi:**
1. **One-Line Command (Rekomendasi):** 1. **One-Line Command (Rekomendasi):**
```bash ```bash
@@ -347,13 +347,13 @@ tia hadir sebagai **satu binary mandiri (single static binary)** yang fleksibel
- Skrip otomatis mendeteksi OS (Linux, macOS) dan arsitektur CPU (`amd64`, `arm64`). - Skrip otomatis mendeteksi OS (Linux, macOS) dan arsitektur CPU (`amd64`, `arm64`).
- Mengunduh rilis tarball terbaru dari GitHub Releases. - Mengunduh rilis tarball terbaru dari GitHub Releases.
- Memverifikasi checksum SHA256 secara otomatis demi keamanan sebelum mengekstrak. - Memverifikasi checksum SHA256 secara otomatis demi keamanan sebelum mengekstrak.
- Memasang binary ke direktori pengguna (`~/.local/bin/tia` tanpa memerlukan akses `sudo`). - Memasang binary ke direktori pengguna (`~/.local/bin/tia-love` tanpa memerlukan akses `sudo`).
- Memberikan instruksi jika `~/.local/bin` belum ada di `$PATH`. - Memberikan instruksi jika `~/.local/bin` belum ada di `$PATH`.
2. **Manual Download Precompiled Binary:** 2. **Manual Download Precompiled Binary:**
- Pengguna dapat langsung menuju halaman GitHub Releases, mengunduh file binary terkompresi (misal: `tia_linux_amd64.tar.gz`), mengekstraknya, dan langsung menjalankannya (`./tia`). - Pengguna dapat langsung menuju halaman GitHub Releases, mengunduh file binary terkompresi (misal: `tia-love_linux_amd64.tar.gz`), mengekstraknya, dan langsung menjalankannya (`./tia-love`).
3. **Go Install (untuk developer Go):** 3. **Go Install (untuk developer Go):**
```bash ```bash
go install github.com/oxpoe/tia/cmd/tia@latest go install github.com/oxpoe/tia/cmd/tia-love@latest
``` ```
- **Acceptance Criteria:** - **Acceptance Criteria:**
- Skrip instalasi aman (`set -euo pipefail`), transparan, dan tidak meminta privilege root/sudo secara membabi-buta. - Skrip instalasi aman (`set -euo pipefail`), transparan, dan tidak meminta privilege root/sudo secara membabi-buta.
@@ -910,7 +910,7 @@ graph TD
``` ```
tia/ tia/
├── cmd/ ├── cmd/
│ └── tia/ │ └── tia-love/
│ └── main.go # Entry point (Router TUI default vs CLI companion) │ └── main.go # Entry point (Router TUI default vs CLI companion)
├── internal/ ├── internal/
│ ├── app/ │ ├── app/
@@ -919,10 +919,10 @@ tia/
│ │ └── messages.go # Custom tea.Msg types │ │ └── messages.go # Custom tea.Msg types
│ ├── cli/ # Mode CLI pendamping (single binary) │ ├── cli/ # Mode CLI pendamping (single binary)
│ │ ├── root.go # CLI argument parser & dispatcher │ │ ├── root.go # CLI argument parser & dispatcher
│ │ ├── convert.go # 'tia convert' command │ │ ├── convert.go # 'tia-love convert' command
│ │ ├── ps.go # 'tia ps' list stacks & containers │ │ ├── ps.go # 'tia-love ps' list stacks & containers
│ │ ├── stack.go # 'tia up / down / update' commands │ │ ├── stack.go # 'tia-love up / down / update' commands
│ │ └── doctor.go # 'tia doctor' diagnostic check │ │ └── doctor.go # 'tia-love doctor' diagnostic check
│ ├── audio/ # Audio feedback engine (Pure Go, Oto v3) │ ├── audio/ # Audio feedback engine (Pure Go, Oto v3)
│ │ ├── player.go # Audio context & sound player │ │ ├── player.go # Audio context & sound player
│ │ ├── sounds.go # Sound event definitions & mapping │ │ ├── sounds.go # Sound event definitions & mapping
@@ -1200,9 +1200,9 @@ Langkah wizard: **Bahasa → Direktori stack → Tema → Impor stack yang ditem
| Config | Basic config load/save | | Config | Basic config load/save |
| Theme | Catppuccin (Mocha/Latte), mode Otomatis/Gelap/Terang/Terminal, deteksi background terminal, semua warna via token semantik | | Theme | Catppuccin (Mocha/Latte), mode Otomatis/Gelap/Terang/Terminal, deteksi background terminal, semua warna via token semantik |
| Status bar | Context-aware help text (hint klikable) | | Status bar | Context-aware help text (hint klikable) |
| **Rilis awal** | goreleaser + GitHub Releases + `install.sh` + checksum (F-029), `tia --version` / `tia doctor` | | **Rilis awal** | goreleaser + GitHub Releases + `install.sh` + checksum (F-029), `tia-love --version` / `tia-love doctor` |
**Exit Criteria:** Jalankan `tia` → splash → Home Dashboard (jam, ringkasan) → masuk workspace, lihat semua resource Docker, navigasi dengan keyboard **dan mouse**; setiap aksi memberi suara + toast; instal dengan satu baris perintah berhasil di mesin bersih **Exit Criteria:** Jalankan `tia-love` → splash → Home Dashboard (jam, ringkasan) → masuk workspace, lihat semua resource Docker, navigasi dengan keyboard **dan mouse**; setiap aksi memberi suara + toast; instal dengan satu baris perintah berhasil di mesin bersih
--- ---
@@ -1235,7 +1235,7 @@ Langkah wizard: **Bahasa → Direktori stack → Tema → Impor stack yang ditem
| Setup wizard | First-run setup with huh forms | | Setup wizard | First-run setup with huh forms |
| Compose CLI wrapper | docker compose up/down/pull/restart/ps | | Compose CLI wrapper | docker compose up/down/pull/restart/ps |
| REA modul 1, 2, 7 | Analisis composerize, Dockge (stack), dan format output Compose, hasil di `docs/rea/` + test vectors | | REA modul 1, 2, 7 | Analisis composerize, Dockge (stack), dan format output Compose, hasil di `docs/rea/` + test vectors |
| CLI mode (pendamping) | `tia convert`, `tia ps`, `tia stacks`, `tia up/down/restart/update`, `--json`, kode keluar jelas (F-028) | | CLI mode (pendamping) | `tia-love convert`, `tia-love ps`, `tia-love stacks`, `tia-love up/down/restart/update`, `--json`, kode keluar jelas (F-028) |
**Exit Criteria:** Convert docker run command → save as stack → manage it, **baik dari TUI maupun dari CLI**, dengan hasil identik **Exit Criteria:** Convert docker run command → save as stack → manage it, **baik dari TUI maupun dari CLI**, dengan hasil identik
@@ -1316,7 +1316,7 @@ Langkah wizard: **Bahasa → Direktori stack → Tema → Impor stack yang ditem
- **Satu binary statis** (`CGO_ENABLED=0`), tanpa runtime dependency selain Docker (audio memakai library pure-Go; server audio hanya dibutuhkan jika suara diaktifkan) - **Satu binary statis** (`CGO_ENABLED=0`), tanpa runtime dependency selain Docker (audio memakai library pure-Go; server audio hanya dibutuhkan jika suara diaktifkan)
- Instal satu baris (skrip) **atau** unduh binary manual dari GitHub Releases, detail di **F-029** - Instal satu baris (skrip) **atau** unduh binary manual dari GitHub Releases, detail di **F-029**
- Release otomatis via goreleaser: `.tar.gz`/`.zip` + `checksums.txt`; `.deb`, `.rpm`, Homebrew, AUR menyusul - Release otomatis via goreleaser: `.tar.gz`/`.zip` + `checksums.txt`; `.deb`, `.rpm`, Homebrew, AUR menyusul
- Binary name: `tia` - Binary name: `tia-love` (nama produk tetap: tia)
### Audio & Animasi ### Audio & Animasi
- Suara dan animasi **opsional**: bisa dimatikan penuh dari Pengaturan, dan aplikasi tetap 100% fungsional tanpa keduanya - Suara dan animasi **opsional**: bisa dimatikan penuh dari Pengaturan, dan aplikasi tetap 100% fungsional tanpa keduanya
@@ -1345,7 +1345,7 @@ Langkah wizard: **Bahasa → Direktori stack → Tema → Impor stack yang ditem
| Latensi suara klik | < 100 ms dari aksi sampai terdengar | | Latensi suara klik | < 100 ms dari aksi sampai terdengar |
| Notifikasi (toast) muncul | < 100 ms setelah event, tampil di atas-tengah dengan status lengkap | | Notifikasi (toast) muncul | < 100 ms setelah event, tampil di atas-tengah dengan status lengkap |
| Animasi | Stabil 30 FPS, CPU idle < 3% saat dashboard terbuka | | Animasi | Stabil 30 FPS, CPU idle < 3% saat dashboard terbuka |
| Instalasi satu baris | < 30 detik dari perintah sampai `tia` bisa dijalankan | | Instalasi satu baris | < 30 detik dari perintah sampai `tia-love` bisa dijalankan |
| Paritas CLI vs TUI | Hasil konversi & operasi stack lewat CLI identik dengan lewat TUI | | Paritas CLI vs TUI | Hasil konversi & operasi stack lewat CLI identik dengan lewat TUI |
| Coverage aset | 100% aset tercatat di register aset dengan lisensi valid | | Coverage aset | 100% aset tercatat di register aset dengan lisensi valid |
@@ -1363,7 +1363,7 @@ Langkah wizard: **Bahasa → Direktori stack → Tema → Impor stack yang ditem
| Mouse event tidak konsisten antar terminal/tmux/SSH | Medium | Test di terminal populer (kitty, alacritty, wezterm, gnome-terminal, tmux, SSH), keyboard selalu jadi fallback penuh, toggle mouse via config | | Mouse event tidak konsisten antar terminal/tmux/SSH | Medium | Test di terminal populer (kitty, alacritty, wezterm, gnome-terminal, tmux, SSH), keyboard selalu jadi fallback penuh, toggle mouse via config |
| Mouse capture mengganggu copy-paste teks native | Medium | Sediakan mode "text select" (toggle `m`) + tombol Copy di log/YAML viewer + dukungan OSC52 clipboard | | Mouse capture mengganggu copy-paste teks native | Medium | Sediakan mode "text select" (toggle `m`) + tombol Copy di log/YAML viewer + dukungan OSC52 clipboard |
| Suara tidak terdengar saat tia dijalankan lewat SSH (audio diputar di server, bukan di laptop pengguna) | High | Deteksi sesi SSH → suara default mati + info; semua suara selalu punya padanan visual; opsi terminal bell (BEL) sebagai fallback; rekomendasikan pola "tia lokal + multi-host" | | Suara tidak terdengar saat tia dijalankan lewat SSH (audio diputar di server, bukan di laptop pengguna) | High | Deteksi sesi SSH → suara default mati + info; semua suara selalu punya padanan visual; opsi terminal bell (BEL) sebagai fallback; rekomendasikan pola "tia lokal + multi-host" |
| Tidak ada audio device/server (PulseAudio/PipeWire/ALSA) di mesin | Medium | Deteksi saat start, degradasi diam-diam ke mode tanpa suara + notifikasi sekali; `tia doctor` menampilkan status audio | | Tidak ada audio device/server (PulseAudio/PipeWire/ALSA) di mesin | Medium | Deteksi saat start, degradasi diam-diam ke mode tanpa suara + notifikasi sekali; `tia-love doctor` menampilkan status audio |
| Dependensi audio merusak single static binary (cgo) | High | Pilih library audio pure-Go (Oto v3 dengan `CGO_ENABLED=0`); **spike teknis di Phase 0** untuk membuktikan sebelum dikunci | | Dependensi audio merusak single static binary (cgo) | High | Pilih library audio pure-Go (Oto v3 dengan `CGO_ENABLED=0`); **spike teknis di Phase 0** untuk membuktikan sebelum dikunci |
| Animasi menghabiskan CPU / flicker di terminal lambat | Medium | Batas 30 FPS, animasi dimatikan otomatis saat idle/terminal lambat, mode "reduced motion", toggle di Pengaturan | | Animasi menghabiskan CPU / flicker di terminal lambat | Medium | Batas 30 FPS, animasi dimatikan otomatis saat idle/terminal lambat, mode "reduced motion", toggle di Pengaturan |
| Spam suara/notifikasi dari event Docker beruntun | Medium | Debounce, rate limit, dan pengelompokan notifikasi sejenis | | Spam suara/notifikasi dari event Docker beruntun | Medium | Debounce, rate limit, dan pengelompokan notifikasi sejenis |
+1 -1
View File
@@ -6,7 +6,7 @@
## 1. Ringkasan & Tujuan ## 1. Ringkasan & Tujuan
`composerize` mengubah perintah `docker run` menjadi file compose YAML. Di tia, logika ini menjadi `composerize` mengubah perintah `docker run` menjadi file compose YAML. Di tia, logika ini menjadi
**konverter inti** yang dipakai dua-duanya: modal konverter TUI (F-008) dan `tia convert` CLI (F-028). **konverter inti** yang dipakai dua-duanya: modal konverter TUI (F-008) dan `tia-love convert` CLI (F-028).
Yang diporting: **pipeline parsing, tabel pemetaan flag, dan aturan normalisasi**. Yang diporting: **pipeline parsing, tabel pemetaan flag, dan aturan normalisasi**.
Yang tidak diport: fitur merge dengan file compose existing via stdin (ditangani layer stack tia Yang tidak diport: fitur merge dengan file compose existing via stdin (ditangani layer stack tia