Bu fayl Claude Code uchun loyiha xaritasi. Maqsad: kodni qaytadan o'qimasdan kontekstni tez tiklash. Yangi sessiyada AVVAL shuni o'qing.
Aidevix — terminaldagi AI CLI agentlarini (Claude Code, Codex, Gemini, Aider, ...)
bitta menyudan boshqaradigan launcher. config/agents.conf dan agentlar ro'yxatini
o'qiydi, fzf (yoki raqamli) menyu ko'rsatadi, tanlangan agentni ishga tushiradi;
o'rnatilmagan bo'lsa — ruxsat so'rab o'rnatadi. Sof Bash loyihasi (build yo'q).
- Til: manba matnlar o'zbekcha (standart). i18n orqali inglizcha ham qo'llab-quvvatlanadi (
AIDEVIX_LANG=enyokiLANG). Qaranglib/i18n.sh. - Platformalar: Linux, macOS, Windows (Git Bash / MINGW64).
- Buyruq nomi:
aidevix.
| Yo'l | Vazifa |
|---|---|
bin/ai-selector.sh |
Asosiy skript (~2850 qator). Barcha mantiq shu yerda: menyu, parsing, o'rnatish, doctor, auto-update. |
lib/ui.sh |
Dizayn tizimi — butun interfeysning yagona manbai. (1) IKONKALAR: uch pog'ona nerd/unicode/ascii, ui_icons_detect avtomatik aniqlaydi (fontconfig · macOS shrift papkasi · Windows reyestri), natija keshlanadi; (2) SEMANTIK RANGLAR: UI_OK/WARN/ERR/INFO/AI/MUTED/FAINT/TEXT/BRAND (256 → 16 → rangsiz); (3) LAYOUT: ui_vislen/ui_pad/ui_trunc (ANSI'ni hisobga oladi), ui_rule, ui_kv, ui_badge, ui_notice, ui_header, ui_footer, ui_statusbar, ui_bar, ui_deemoji_v. Har birining _v (fork'siz) varianti bor — tsiklda $(...) ISHLATMA. UI_FD chiqish oqimini boshqaradi (2 std, --list/--doctor uchun 1). |
lib/common.sh |
Umumiy yordamchilar: log_* (+log_step), die, require_cmd, panel (→ui_notice qobig'i), banner/banner_full, spin_run, ui_launch, tool_hint, open_url. STDERR'ga yozadi. lib/i18n.sh va lib/ui.sh ni source qiladi. |
lib/i18n.sh |
Ko'p tillilik (i18n) — aidevix_detect_lang (AIDEVIX_LANG > LANG/LC_* > uz), t() gettext-uslubidagi lookup. Manba o'zbekcha = kalit; tarjima topilmasa o'zbekchaga qaytadi. |
lib/i18n/en.sh |
Inglizcha tarjima katalogi (MSG_EN["uz manba"]="en"). Faqat "en" rejimida yuklanadi. Yangi t "..." qo'shsang — kalitni shu yerga ham qo'sh. |
config/agents.conf |
Agentlar ro'yxati. Format: NAME|BINARY|COMMAND|INSTALL|DESC|CATEGORY|AUTH|URL (5–7 ta |). |
bin/aidevix.cmd, bin/aidevix.ps1 |
Windows wrapperlari — Git Bash topib ai-selector.shni chaqiradi. |
bin/cli.js |
npm uchun Node launcher — bash'ni topib ai-selector.shni spawnSync bilan ishga tushiradi (package.json bin). |
completions/ |
aidevix.bash (bash/zsh), _aidevix (zsh native), aidevix.fish (fish). |
packaging/ |
homebrew/aidevix.rb (formula), scoop/aidevix.json (manifest). Relizda url/sha256/version yangilanadi. |
man/aidevix.1 |
man sahifa. |
scripts/ |
demo.sh (deterministik, non-interaktiv demo) + record-demo.sh (asciinema→agg→assets/demo.gif). |
assets/demo.svg |
README demo posteri (statik). log.jpg — AD logosi. |
README.md / README.en.md |
O'zbekcha / inglizcha hujjat (til almashtirgich tepada). |
install.sh |
Lokal o'rnatish (symlink → ~/.local/bin, rc zaxira, idempotent, sudosiz). |
bootstrap.sh |
curl | bash bitta-buyruqli o'rnatuvchi (repo'ni ~/.ai-cliga klonlaydi). |
uninstall.sh |
O'chirish. |
tests/ |
Bats testlari (*.bats, test_helper.bash, fixtures/). Qarang tests/README.md. |
server/ |
Global statistika backend'i (alohida Node loyihasi, npm paketiga kirmaydi). Fastify 5 + ioredis + @fastify/rate-limit; Redis sorted-set'lari (ZINCRBY/ZREVRANGE). Endpoint'lar: POST /v1/events, GET /v1/stats, GET /health. Railway'ga Dockerfile + railway.json bilan deploy. Testlar: node --test (ioredis-mock). CI: .github/workflows/server-ci.yml (faqat server/**). Klyent (aidevix) integratsiyasi hali ulanmagan — opt-in bo'lib qo'shiladi. |
VERSION |
Yagona haqiqat manbai (SemVer). Release teg vX.Y.Z shunga mos bo'lishi shart. |
.github/workflows/ci.yml |
CI: shellcheck · bash -n · agents.conf validatsiya · bats. |
.github/workflows/release.yml |
Teg push'da GitHub Release. |
main()— argument dispatch (fayl oxirida).__previewsubkomandasi, so'ngaugment_tool_path,auto_update, keyin flag'lar.resolve_config/build_merged_config— repo + foydalanuvchi config birlashtirish (repo ustun).parse_agents— config → TAB-ajratilgan 10 maydon;build_rows→ 11 maydon:NAME DESC BINARY COMMAND INSTALL CATEGORY STATUS AUTH URL AUTHCLASS PROVIDER.STATUSendi mashina o'qiydigan token —installed/missing(ilgari"✓ o'rnatilgan"edi; belgi/rang/tarjima bir satrda aralashgan va tekislashni buzardi). Belgiga aylantirish faqat chizishda.- Emoji → semantik maydon: config va i18n kalitlarida emoji ATAYLAB qoladi (foydalanuvchi configlari va tarjimalar bilan moslik), lekin interfeysga CHIQMAYDI.
classify_auth_vemoji'ni (🆓/🌐/🔑/💳) HAM, matnni hamfree|browser|key|paid|nonesinfiga aylantiradi;detect_provider_vprovayderni aniqlaydi (vendor naqshlari umumiygithub.comdan OLDIN tekshiriladi).ui_deemoji_vmatndan emoji'ni oladi —ui_noticebuni sarlavha va har qatorda avtomatik qiladi, shuning uchun 13 ta chaqiruv joyi va butun tarjima katalogi tegilmagan. run_menu(filter:free/top),select_with_fzf,select_with_arrows,select_with_numbers,build_menu,preview_agent. fzf xato bilan to'xtasa (eski versiya flag tanimaydi) —select_with_fzfrc=3 qaytaradi,run_menuichki ↑/↓ menyuga fallback qiladi.- IKKI USTUNLI menyu (
select_with_arrows): chapda qidiriladigan agentlar ro'yxati, o'ngda tanlangan agent tafsiloti, pastda status bar + klavish footer'i. Tor terminalda (< 84 ustun) avtomatik ustma-ust (stacked) maketga tushadi. Tafsilotdetail_lines()→DETAIL[]dan chiziladi — fzf preview HAM aynan shundan, ya'ni ikkala interfeys bir xil ko'rinadi. Chap ustun qatorlari (lrow[]) va barcha statik matnlar tsikldan OLDIN bir marta quriladi. - Status bar (
_as): faqat HAQIQIY ma'lumot — provayder (config'dan), model va API-kalit holati (MUHIT o'zgaruvchilaridan:provider_model_var/provider_key_var), o'rnatilgan/jami, versiya + yangilanish (status_version_field), tarmoq latency (status_latency_field—curl -w %{time_total}o'lchagan haqiqiy qiymat,LATENCY_FILE). Kontekst/token sarfi ATAYLAB YO'Q: Aidevix LLM API'ga murojaat qilmaydi, ya'ni uni o'lchay olmaydi — to'qib chiqarilgan raqam ko'rsatgandan ko'ra ko'rsatmagan to'g'ri. Testi bor (tests/ui_layout.bats). - Test seam:
AIDEVIX_UI_DUMP=1— menyu interaktiv ochilmasdan BITTA kadrni stdout'ga chizadi (AIDEVIX_UI_DUMP_QUERYbilan qidiruv holati ham). Maket testlari (tests/ui_layout.bats) TTY/pty talab qilmaydi. - Ichki menyu texnikasi (
select_with_arrows): ALT-SCREEN (\033[?1049h) + alternate-scroll (\033[?1007h) — sichqoncha G'ILDIRAGI strelka bo'lib keladi (scroll ishlaydi), scrollback buzilmaydi. Datafile BIR o'qishdar_*massivlariga olinadi, statikt()matnlar loop'dan oldin bir marta hisoblanadi — klavish tsiklida fork YO'Q (MSYS'da har fork ~50-150ms edi → "scroll ishlamayapti" shikoyati). Birinchi bayt bloklovchiread -rsn1(builtin); ESC'dan keyingi baytlar_rqorqali UCH QATLAMLI: stty VTIME+dd →read -t 1zaxira → ikkalasi ham darhol bo'sh qaytsa (EPOCHREALTIME bilan o'lchanadi)TIMERS_BROKEN=1va BLOKLOVCHI o'qish (strelka baytlari birga kelgani uchun darhol qaytadi; yolg'iz ESC u muhitda ikkinchi klavishani kutadi, ESC-ESC = bekor). Shu tufayli strelka HECH QACHON "bekor" deb o'qilmaydi. Notanish CSI (Delete, F-klavish, Ctrl+strelka) —action=skipbilan yutiladi, menyu YOPILMAYDI; faqat yolg'iz ESC/q bekor qiladi. Testlar:tests/menu_errtrap.bats. quick_launch(nomdan agent topish) →launch_selected→ensure_installed→maybe_autoupdate_agent→maybe_show_auth_note→launch_agent(exec).- O'rnatilganini aniqlash (reinstall-aylanasiga qarshi):
locate_binary <binary>— PATH'da ko'rinmagan binarni ma'lum joylardan (~/.local/bin,~/.<binary>/bin, Windows pip%APPDATA%\Python\Python3XX\Scripts, ...) qidiradi; topsa PATH'ga qo'shadi varecord_bin_dirbilanBIN_DIR_CACHE($STATE_DIR/bin_dirs)ga yozadi.augment_tool_pathkeyingi sessiyalarda keshdagi papkalarni avtomatik qo'shadi.ensure_installedo'rnatishdan OLDIN ham, KEYIN ham locate bilan qutqaradi.resolve_install_cmd— Windows'dapython3Store-stub bo'lsa buyruqnipythonga moslaydi (-c 'import sys'bilan tekshiradi). Testlar:tests/install_detect.bats. - Agentni avtomatik yangilash:
maybe_autoupdate_agent— ALLAQACHON o'rnatilgan agentni ishga tushirishdan oldin, throttled (AIDEVIX_UPDATE_INTERVAL, std 3 soat) BIR MARTA eng so'nggi versiyaga yangilaydi. Faqat qaytainstallqilganda haqiqatan yangilaydiganlar uchun (@latest/--upgrade); curl/wget ATAYLAB chiqarilgan (butun installer'ni qayta yuklab, "yana o'rnatyapti" taassurotini berardi), brew/cargo ham o'tkazib yuboriladi. Per-agent stamp:AGENT_UPDATE_DIR(touch_agent_update_stamp). Eski Gemini CLI "client no longer supported" muammosini hal qiladi. Xato — bloklamaydi. O'chirish:AIDEVIX_NO_AUTOUPDATE=1/CI.ensure_installedham fresh o'rnatishdan keyin stamp yozadi (darhol qayta yangilamaslik uchun). - Sertifikat/soat xatosi:
ensure_installedo'rnatish xatosida "certificate is not yet valid / expired" naqshini tutib, internet emas — tizim SOATI noto'g'ri ekanini aniq panelda tushuntiradi (freebuff'dagi muammo). - Til (i18n) UX:
load_saved_lang(main'da, preview'dan oldin),choose_language(ilk run picker,LANG_FILE),lang_cmd(--lang [en|uz]),aidevix_set_lang(i18n.sh). Agentdesc/authparse_agents'dat()bilan tarjima qilinadi → menyu/preview/--list to'liq bir tilda.maybe_show_intro(BIR MARTA "Aidevix nima/emas" paneli).ui_spin_start/stop(common.sh) — menyu tayyorlanayotgandagi fon loaderi.bin/postinstall.js— npm'dan keyin "aidevix yozing" yo'riqnomasi. ensure_installed— yo'q bo'lsa ruxsat so'rab o'rnatadi; OS-qo'llab-quvvatlamaslik / xato uchun aniqpanelxabarlari.should_open_login_link— 🔑 kalit kerak VA muhitda yo'q bo'lsagina login sahifa ochadi.doctor,update_agents,add_agent,auto_update(gitfetch+reset --hard, throttled).- npm yangilanish eslatmasi (notify):
is_npm_install(PROJECT_ROOTnode_modulesichidami),version_gt(semver taqqoslash, tashqi dastursiz),fetch_npm_latest(registrydist-tags'dan eng so'nggi versiyani FONDA keshlaydi, throttled),maybe_npm_update_hint(yangisi chiqsa eslatadi). Interaktiv auto-update:npm_autoupdate_apply— yangi versiya bor + interaktiv sessiya ([[ -t 0 ]]+/dev/tty+npm) bo'lsa "Hozir yangilaymizmi? [Y/n]" so'raydi; tasdiqlasanpm i -g pkg@latestqilibexec "$0" "$@"bilan qayta ishga tushiradi. Nointeraktiv (quvur/CI/bats) — gate o'tmaydi, passiv eslatma qoladi. Git o'rnatishlar uchunauto_updateishlaydi; npm uchun esa bu — chunki.gityo'q.AIDEVIX_NO_AUTOUPDATE/CIhurmat qilinadi. - Kutilmagan xato → KATTA yangilash eslatmasi:
crash <buyruq> <qator>— ERR-tutqich endidieo'rniga SHUNI chaqiradi (10 ta trap). Crashlarning aksariyati eski versiyada bo'lgani uchun xatodan keyin yangilash buyrug'ini ko'zga tashlanadiganpanelbilan ko'rsatadi: npm o'rnatishdanpm i -g aidevix@latest, git checkout'daaidevix --update(is_npm_install+.gitbo'yicha tanlaydi). Testlar:tests/menu_errtrap.bats. - Banner animatsiyasi:
banner_full(common.sh) — logo qatorma-qator + gradient (ui_gradient_line,ui_anim_waitlib/ui.sh da). FaqatAI_ANIM=1VAUI_DEPTH=256bo'lganda; aks holda darhol chiziladi.ui_anim_waitATAYLABsleepishlatadi: fork'sizexec {fd}<> <(:)MSYS'da redirect xatosi berardi va noninteraktiv bashexecbarbod bo'lsa BUTUN SKRIPTNI to'xtatadi (banner birinchi qatordan keyin jim uzilardi). Bu tsikl klavish tsikli emas — butun o'rnatishda 6 kadr. - Lokal statistika:
record_usage/read_usage(STATS_FILE);build_menu/list_agentslokal sanoq bo'yicha saralaydi.build_menu4-argument sifatida OXIRGI ishlatilgan agent nomini (read_last) oladi — u "↩ oxirgi" belgisi bilan eng tepada chiqadi (agent yopilib qolsa bitta ENTER bilan qayta ochiladi). - Global statistika (opt-in):
global_stats_enabled,set_global_stats,stats_cmd(--stats on|off),report_usage_global(fonda POST),fetch_global_stats(fonda kesh, throttled),global_install_tsv(JSON→TSV reyting),maybe_global_hint. Backend:server/.
- Har skript boshida
set -Eeuo pipefail. ERR tutqichcrashqiladi (xato + KATTA yangilash eslatmasi); TTY o'qishdan oldin tutqich vaqtincha o'chiriladi. - Har funksiya ustida qisqa o'zbekcha izoh. Foydalanuvchiga ko'rinadigan yangi matnni
t "..."bilan o'rab yoz (manba o'zbekcha) va o'sha kalitnilib/i18n/en.shga inglizcha tarjimasi bilan qo'sh.%sjoy egalaritga argument sifatida beriladi. lib/common.shlog/UI'lari STDERR'ga yozadi — stdout faqat qaytariladigan qiymat uchun.- Ranglar
UI_TTYga bog'liq;NO_COLORhurmat qilinadi. - Commit: Conventional Commits (
feat:,fix:,docs:, ...). Release qo'lda emas — teg orqali. - Test: yangi funksiya/xulq qo'shsang →
tests/ga test ham qo'sh.
| O'zgaruvchi | Ta'siri |
|---|---|
AI_PULT_CONFIG |
Aniq config yo'li (test/maxsus). Berilsa — faqat o'sha. |
AIDEVIX_LANG |
Interfeys tili: uz yoki en. Berilmasa saqlangan tanlov (--lang), so'ng LANG/LC_* locale'idan aniqlanadi; ilk ishga tushishda interaktiv so'raladi. |
AIDEVIX_ICONS |
Ikonka pog'onasi: nerd/unicode/ascii/auto. Avtomatik aniqlash va saqlangan tanlovdan (--icons) ustun. |
AIDEVIX_UI_DUMP |
1 — menyuning BITTA kadrini stdout'ga chizib qaytadi (test seam, TTY kerak emas). AIDEVIX_UI_DUMP_QUERY — qidiruv holati. |
AIDEVIX_USE_FZF |
1 — menyuni fzf bilan ochadi. Standart — ichki select_with_arrows: ikki ustunli maket, status bar va footer FAQAT unda bor (fzf'da --footer yo'q, Windows'da preview ham std o'chiq — natijada fzf o'rnatilganlar tekis ro'yxat ko'rardi). AIDEVIX_NO_FZF — fzf'ni butunlay o'chiradi. |
AIDEVIX_FZF_PREVIEW |
1 — fzf preview'ni majburan yoqadi (Windows/MSYS'da std o'chiq, cygwin fork xatosi uchun). |
AIDEVIX_NO_AUTOUPDATE=1 |
Avtomatik yangilanish (git), npm eslatmasi va agentni avtomatik yangilash (maybe_autoupdate_agent)ni o'chiradi. |
AIDEVIX_UPDATE_INTERVAL |
Tekshirish oralig'i (sekund, std 10800) — aidevix git auto-update, npm tekshiruvi va agentni avtomatik yangilash throttle'i. |
CI=1 |
Animatsiya + auto_update + global statistika o'chiq. |
NO_COLOR / AI_NO_ANIM |
Rang / animatsiyani o'chiradi. |
AIDEVIX_GLOBAL_STATS |
Global statistika opt-in (1/0) — GLOBAL_OPTIN_FILEdan ustun. |
AIDEVIX_STATS_URL |
Global statistika backend URL'i (std: Railway server, server/). |
AIDEVIX_STATS_TTL |
Global kesh yangilash oralig'i (sekund, std 10800). |
make test # bats tests/ — testlar
make lint # shellcheck
make syntax # bash -n barcha skript
make check # syntax + lint + test (CI bilan bir xil)
bats tests/foo.bats # bitta fayldeclare -A XYETARLI EMAS —declare -gA X=()yoz. Ikki xil tuzoq bir joyda: (1)-g— bu fayllar funksiya ichidan hamsourceqilinadi (testlardaload_selector, ishlab chiqarishdaaidevix_set_lang).-gbo'lmasa massiv o'sha funksiyaga LOKAL bo'lib qoladi va chiqishda yo'qoladi; keyin${MSG_EN[$kalit]}assotsiativ emas, INDEKSLI massiv sifatida o'qilib kalitni ARIFMETIK hisoblashga urinadi ("syntax error: operand expected") — tarjima jim ishlamay qo'yadi. (2)=()— e'lon qilib qiymat bermaslikset -uostida${#X[@]}ni "unbound variable" qiladi va skript JIMGINA 1 kod bilan to'xtaydi (aynan shu sababaidevix --lang enhech narsa chiqarmasdi).- Nom orqali qaytaruvchi funksiyalarda ichki lokal
__bilan boshlanadi.printf -v "$__v"chaqiruvchi bergan NOMGA yozadi; ichkilocal schaqiruvchi hamsdeb atagan bo'lsa, natija unga YETIB BORMAYDI. Shu sababtrim()jim ishlamay turgan edi (trim_v s "$s",trim_vichida hamlocal s) vaaidevix --addfoydalanuvchi kiritgan bo'shliqlarni kesmasdi. - Testlar YIQILA OLISHINI vaqti-vaqti bilan tekshir.
tests/test_helper.bashbats'ning ERR/EXIT tutqichlarini saqlab-tiklaydi (_save_bats_traps/_restore_bats_traps). Ilgari u ularni shunchakitrap -bilan olib tashlardi va bats yiqilishni UMUMAN ko'rmasdi — 207 test "yashil" edi, aslida 21 tasi yiqilardi. Yangi helper yozsang:@test { false; }chindan hamnot okberishini tekshir. - Ikkilangan mantiq:
clip()(awk, build_menu) vsui_trunc_v(bash). Ikkalasi ham qisqartiradi, lekin ELLIPSIS uzunligi ascii pog'onada 2 belgi (".."). awk nusxasin-1deb hisoblab, tor terminalda qatorni bir belgi uzun chiqarardi. Birini o'zgartirsang — ikkinchisini ham tekshir. $(...)= FORK. Bu loyihada bu asosiy tezlik muammosi. MSYS/Windows'da har fork ~50-150 ms. Ilgaritrim()sedorqali ishlardi vaparse_agentsuni har agent uchun 8 marta chaqirardi → 28 agentda ~450 fork;--listshu mashinada 60 s dan oshib ketardi. Enditrim_v,t_v,classify_auth_v,detect_provider_v,ui_*_v— hammasiprintf -vbilan, fork'siz. Yangi kod yozganda: konfiguratsiyani o'qish, menyu chizish va klavish tsiklida$(...), quvur (|),$(cmd)ISHLATMA —_vvariantidan foydalan yoki yangisini qo'sh.- Sekin tashqi buyruqlar keshlanadi:
npm config get prefix(~2.5 s, node'ni ko'taradi) vapython -m site --user-base(~1 s) HAR ishga tushishda chaqirilardi. EndiNPM_PREFIX_CACHE/PY_USERBASE_CACHEda saqlanadi va papka yo'qolsagina qayta so'raladi (--version: 7.4 s → 2.0 s). - awk dasturi
'...'bloki ichida — izohlarda APOSTROF ISHLATMA.# bo'yichadeb yozsang blok uziladi vabuild_menujim buziladi (menyu bo'sh chiqadi). Apostrofsiz yoz:boyicha. - Windows PATH buzilishi: Git Bash'da
npm config get prefixC:\...qaytaradi;augment_tool_pathPATH'ni tozalaydi vacygpath -ubilan POSIX shaklga o'tkazadi. Bunga tegishda ehtiyot bo'l. - TAB vs bo'sh maydon:
build_rowsichida TAB o'rniga\037(US) ishlatiladi — bo'sh maydonlar "yutilmasligi" uchun. - fzf stdin'ni band qiladi: TTY o'qishlar
/dev/ttydan, bo'lmasa&2/stdin'dan (qarangensure_installed,prompt_tty). source-qorovuli:ai-selector.shoxiri[[ "${BASH_SOURCE[0]}" == "${0}" ]]bilan himoyalangan — testdasourceqilsamainishlamaydi. BUNI O'CHIRMA.- Repo nomi: GitHub'da
SUNNATBEE/sunnatbeeCLI, buyruq nomi esaaidevix.
VERSION + package.json:version + packaging/homebrew/aidevix.rb (url teg + sha256) + packaging/scoop/aidevix.json (version + extract_dir) + man/aidevix.1 (.TH qatori). Release teg vX.Y.Z VERSIONga mos bo'lishi shart (CI tekshiradi).