From ee459c1f8e66ee2aa30a430c4cedefb1d0aaf042 Mon Sep 17 00:00:00 2001 From: Soldier Date: Thu, 13 Nov 2025 16:19:30 +0000 Subject: [PATCH] feat: Initial MVP release with authentication and quota tracking - Add secure login command with smart editor detection - Implement Bearer token authentication with hidden input option - Add status command showing monthly quota and rate limits - Support for Free/Basic/Pro tier detection - Smart editor detection (nvim, vim, nano, etc.) - Secure token storage in ~/.config/xapi/config.toml - Add comprehensive README and documentation - Add .gitignore for binaries and IDE files Features: - xapi login: Configure credentials securely - xapi login --token: Hidden input mode (no bash history) - xapi status: Check quota usage and recommendations - xapi status --days N: View N-day usage history Security: - Token input without shell history exposure - Config file with 0600 permissions - HTTPS-only API communication - Clear security warnings in config Built with Cobra CLI framework for a professional CLI experience. Next: Search command with dry-run mode to preview before burning quota. --- .gitignore | 30 ++++++ LICENSE | 0 README.md | Bin 0 -> 4936 bytes cmd/login.go | 206 +++++++++++++++++++++++++++++++++++++++ cmd/root.go | 51 ++++++++++ cmd/status.go | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 12 +++ go.sum | 16 +++ main.go | 11 +++ 9 files changed, 590 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 cmd/login.go create mode 100644 cmd/root.go create mode 100644 cmd/status.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3bb15e3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# Binaries +xapi +*.exe +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool +*.out + +# Go vendor directory +vendor/ + +# IDE directories +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS files +.DS_Store +Thumbs.db + +# Config files with secrets (user's local config) +# Note: We don't ignore the entire .config directory +# as users might want to share example configs \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..436e733f370c29ff9bfa66fd5fbb19db27b897dc 100644 GIT binary patch literal 4936 zcma)A+m74F5gp`_K(Kk(w`_n~E5=BKNohQGoD6n0kY{9D@!TxQHw+9+i!717)9j}E zG8!#{Ait9L0QrM_zmYq-6Pp`Sm)zTz|MwHvjaa+21nyIQ^ zv0Gc>66bvibCL<(i=s{kzWE!xE>}MGzmK9f(48&0wWxb^(7Of}6dno+6#NE_5Ab)+ zScv1j!2mR}-1I9YZ5hWY%t~f=4g6_;1B@Cq;yz~Rp!j*s;!(N4mA1vxI56E=<^ffkk;jT3f_%1lY) zDlUs)oQ(VcaXdjL63Z(Lufb}TU2|D@Q_rPZ0^YLBiWMwNX8qPnc7q^rVadkdA&#dN z(-tz8mF>hc!YM47v8`PtA$PUl8MC-Pm?)vMkK-5qI8<#3iNo*=VMqluzq?a9#D5~ZcJyr~12V&*i0Ro5ti%i393a$72A!IUTjl-yXQ zSAe&*GESqn<{1Ds43J^$ZQ=S%O0|TF$rVsK`_%$EwvQ-|r=B3%z>tksOz@mef`Gs` z)Pc8{IZHw6=1p`fm1EDlbLxcUwLlo<+$s%ISJz5gvNv>AB{^EmtO0q$t9#)8lT506 z9%q$mHZ`GTPk6;G43|u!L}UE6O0_gFSGEKXWwB}yK`7mOm{eSXrn$?IX#V^U{{v%b zEEB?Sp5ArfiB=U%J&izjf|;r+lsV?TD7w13nln>I1-Fn1B@tS>D!5J8`S~N+nikwf zS?&{+vNtLe%pDgwBq}g>8X1=>sBXez-x=K(Dr2HQ=dw@B2N#DrE5Wk~bcZh|Tb^~` zNck)=O3A2Z+Ceh)*4o){_-ABt#KTmq|W=qe4)5CFL$ob;mo6wcTUFKC=qaOXL$jE|WI zySWoRNa0A;D@tAckyjKgT1CkPFDOBXZ8lNrz1bgcYso1Iv&r?C(xxF=+i&SfL3^@V!H0%>fL^4`4Tp3pN+{@d6K^;?h|(@bGtFFjF!&QFQnhn2e6jPftf@ z$HUq9{OmI)M9aKYF3{o!oA7nStD@F_I>xqwrVqFF+g4F>Ys9j$sUl4+U2-9s8i%mA znbw9L4*x-!T`})80sm@)(W_{a0zORwKr@Xw)e$BP?bm4(tMntZ1dMNfEfPNkX_E&) zXl?3In@v&y(PCSLw(uI943NBv0(8BHR0h4a^ttYdSrDn4j~xtiw;d#=hs5ha(yMW-uUM+F^d~ zv)Sxo3g=Sz)rLZ>#f}N2FEhQWE#?Gti5YQon0Z1q4yIOVR(O$ev;|%1#h5^nZ5}(7 zS8C`h_&5Lj!dF91+JS_RKN3m}s<8d&tDPOls=Ocl3;^gsD`nF{h0t`UV?m%2Pcp%v zb@h6rPmOkH=Oa}HC6l?}vhc&d+}UY>+Klgn_6ss1YZ^sM6A!lb{I3HeY4r+f#ijK_ z3YAtW{}4A=ll+hwN8-#Kn2d(Ur=zr559@exVj7`DjcZJN`zwl^)qL(HSwtk!JSk~l zi6T=Kehssd8{kxQiFRZXIw(TLcbHko(eQ%Ay;V@6sJHvSbzf&oDVciB@I>ir z`UVlJ}Ave05l7J#({^auiL=j!U@q< zB9F_%f5Swvyka%wzxG zP_Y$Qc1_Z8;jbuswWd(H+BY6-L267lwLdubFKF%uqUdxyYabv1g9w)=U(8gx@H_V)W3eeX55 zFh?h2SZG$^l2XAL%&Ff!R@pV`d+^-NQA@OFLYMQ*6)H-oC#gAc?R@2-*KST9JE#bCTN?7^_`T5OIaw(De<~;!u3UIsUb6%|a;&v8DoY z`IOsdZr()yvq!M*f!22veeSUmdce?Dd0YQa$MnGxKiOaPq9{ocx^)QQny=t=_y%Ur gM(}#{IF8|u5T7!l;|8%T%g`7;Z(!grr