omni-catalyst 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1137 -0
  3. package/core/bin/core +85 -0
  4. package/core/bin/omni +21 -0
  5. package/core/cli/commands/--version.sh +8 -0
  6. package/core/cli/commands/brain.sh +1549 -0
  7. package/core/cli/commands/doctor.sh +834 -0
  8. package/core/cli/commands/env.sh +226 -0
  9. package/core/cli/commands/init.sh +1266 -0
  10. package/core/cli/commands/install.sh +759 -0
  11. package/core/cli/commands/list.sh +397 -0
  12. package/core/cli/commands/open.sh +71 -0
  13. package/core/cli/commands/pg.sh +761 -0
  14. package/core/cli/commands/reinstall.sh +694 -0
  15. package/core/cli/commands/show.sh +90 -0
  16. package/core/cli/commands/uninstall.sh +700 -0
  17. package/core/cli/commands/update.sh +754 -0
  18. package/core/cli/commands/voice.sh +170 -0
  19. package/core/cli/core.sh +82 -0
  20. package/core/cli/omni.sh +634 -0
  21. package/core/modules/ai.sh +152 -0
  22. package/core/modules/auto.sh +90 -0
  23. package/core/modules/db.sh +94 -0
  24. package/core/modules/deploy.sh +50 -0
  25. package/core/modules/dev.sh +126 -0
  26. package/core/modules/editor.sh +101 -0
  27. package/core/modules/lang.sh +100 -0
  28. package/core/modules/npm.sh +122 -0
  29. package/core/modules/shell.sh +312 -0
  30. package/core/modules/ui.sh +115 -0
  31. package/core/tools/ai/all.sh +63 -0
  32. package/core/tools/ai/antigravity-cli/README.md +45 -0
  33. package/core/tools/ai/antigravity-cli/bin/agy +28 -0
  34. package/core/tools/ai/antigravity-cli/helper/agy_helper.c +39 -0
  35. package/core/tools/ai/antigravity-cli/install.sh +469 -0
  36. package/core/tools/ai/claude-code/README.md +45 -0
  37. package/core/tools/ai/claude-code/bin/claude +29 -0
  38. package/core/tools/ai/claude-code/helper/claude_helper.c +42 -0
  39. package/core/tools/ai/claude-code/install.sh +278 -0
  40. package/core/tools/ai/codegraph/README.md +43 -0
  41. package/core/tools/ai/codegraph/bin/codegraph +3 -0
  42. package/core/tools/ai/codegraph/install.sh +149 -0
  43. package/core/tools/ai/codex/README.md +44 -0
  44. package/core/tools/ai/codex/install.sh +104 -0
  45. package/core/tools/ai/command-code/README.md +62 -0
  46. package/core/tools/ai/command-code/install.sh +136 -0
  47. package/core/tools/ai/engram/README.md +44 -0
  48. package/core/tools/ai/engram/install.sh +127 -0
  49. package/core/tools/ai/freebuff/README.md +52 -0
  50. package/core/tools/ai/freebuff/bin/freebuff +28 -0
  51. package/core/tools/ai/freebuff/helper/freebuff_helper.c +47 -0
  52. package/core/tools/ai/freebuff/install.sh +301 -0
  53. package/core/tools/ai/gemini-cli/README.md +46 -0
  54. package/core/tools/ai/gemini-cli/install.sh +111 -0
  55. package/core/tools/ai/gentle-ai/README.md +42 -0
  56. package/core/tools/ai/gentle-ai/install.sh +253 -0
  57. package/core/tools/ai/gentle-ai/termux-patches.go +256 -0
  58. package/core/tools/ai/gga/README.md +49 -0
  59. package/core/tools/ai/gga/install.sh +134 -0
  60. package/core/tools/ai/hermes-agent/README.md +50 -0
  61. package/core/tools/ai/hermes-agent/install.sh +80 -0
  62. package/core/tools/ai/heygen/README.md +24 -0
  63. package/core/tools/ai/heygen/install.sh +126 -0
  64. package/core/tools/ai/kilocode-cli/README.md +45 -0
  65. package/core/tools/ai/kilocode-cli/bin/kilocode +21 -0
  66. package/core/tools/ai/kilocode-cli/helper/kilocode_helper.c +47 -0
  67. package/core/tools/ai/kilocode-cli/install.sh +179 -0
  68. package/core/tools/ai/kimchi-code/README.md +8 -0
  69. package/core/tools/ai/kimchi-code/install.sh +120 -0
  70. package/core/tools/ai/kimi-code/README.md +45 -0
  71. package/core/tools/ai/kimi-code/install.sh +111 -0
  72. package/core/tools/ai/kiro-cli/README.md +23 -0
  73. package/core/tools/ai/kiro-cli/install.sh +127 -0
  74. package/core/tools/ai/mimocode/README.md +43 -0
  75. package/core/tools/ai/mimocode/bin/mimo +28 -0
  76. package/core/tools/ai/mimocode/helper/mimocode_helper.c +47 -0
  77. package/core/tools/ai/mimocode/install.sh +287 -0
  78. package/core/tools/ai/minimax-cli/README.md +45 -0
  79. package/core/tools/ai/minimax-cli/install.sh +111 -0
  80. package/core/tools/ai/mistral-vibe/README.md +46 -0
  81. package/core/tools/ai/mistral-vibe/install.sh +119 -0
  82. package/core/tools/ai/odysseus/README.md +35 -0
  83. package/core/tools/ai/odysseus/install.sh +163 -0
  84. package/core/tools/ai/ollama/README.md +44 -0
  85. package/core/tools/ai/ollama/install.sh +78 -0
  86. package/core/tools/ai/openclaude/README.md +46 -0
  87. package/core/tools/ai/openclaude/install.sh +110 -0
  88. package/core/tools/ai/openclaw/README.md +47 -0
  89. package/core/tools/ai/openclaw/install.sh +112 -0
  90. package/core/tools/ai/opencode/README.md +51 -0
  91. package/core/tools/ai/opencode/bin/opencode +28 -0
  92. package/core/tools/ai/opencode/helper/opencode_helper.c +57 -0
  93. package/core/tools/ai/opencode/install.sh +290 -0
  94. package/core/tools/ai/pi/README.md +46 -0
  95. package/core/tools/ai/pi/install.sh +104 -0
  96. package/core/tools/ai/qwen-code/README.md +45 -0
  97. package/core/tools/ai/qwen-code/install.sh +111 -0
  98. package/core/tools/ai/seedance/README.md +22 -0
  99. package/core/tools/ai/seedance/install.sh +134 -0
  100. package/core/tools/ai/veo3/README.md +36 -0
  101. package/core/tools/ai/veo3/install.sh +151 -0
  102. package/core/tools/auto/all.sh +57 -0
  103. package/core/tools/auto/n8n/README.md +47 -0
  104. package/core/tools/auto/n8n/install.sh +102 -0
  105. package/core/tools/db/all.sh +60 -0
  106. package/core/tools/db/mariadb/README.md +43 -0
  107. package/core/tools/db/mariadb/install.sh +65 -0
  108. package/core/tools/db/mongodb/README.md +42 -0
  109. package/core/tools/db/mongodb/install.sh +73 -0
  110. package/core/tools/db/postgresql/README.md +45 -0
  111. package/core/tools/db/postgresql/install.sh +65 -0
  112. package/core/tools/db/sqlite/README.md +44 -0
  113. package/core/tools/db/sqlite/install.sh +65 -0
  114. package/core/tools/deploy/all.sh +39 -0
  115. package/core/tools/deploy/netlify/install.sh +41 -0
  116. package/core/tools/deploy/railway/install.sh +47 -0
  117. package/core/tools/deploy/vercel/install.sh +43 -0
  118. package/core/tools/dev/all.sh +75 -0
  119. package/core/tools/dev/bat/README.md +44 -0
  120. package/core/tools/dev/bat/install.sh +82 -0
  121. package/core/tools/dev/bc/README.md +44 -0
  122. package/core/tools/dev/bc/install.sh +82 -0
  123. package/core/tools/dev/cloudflared/README.md +43 -0
  124. package/core/tools/dev/cloudflared/install.sh +82 -0
  125. package/core/tools/dev/curl/README.md +43 -0
  126. package/core/tools/dev/curl/install.sh +82 -0
  127. package/core/tools/dev/fzf/README.md +44 -0
  128. package/core/tools/dev/fzf/install.sh +82 -0
  129. package/core/tools/dev/gh/README.md +43 -0
  130. package/core/tools/dev/gh/install.sh +82 -0
  131. package/core/tools/dev/html2text/README.md +44 -0
  132. package/core/tools/dev/html2text/install.sh +82 -0
  133. package/core/tools/dev/imagemagick/README.md +44 -0
  134. package/core/tools/dev/imagemagick/install.sh +82 -0
  135. package/core/tools/dev/jq/README.md +44 -0
  136. package/core/tools/dev/jq/install.sh +82 -0
  137. package/core/tools/dev/lsd/README.md +44 -0
  138. package/core/tools/dev/lsd/install.sh +82 -0
  139. package/core/tools/dev/make/README.md +44 -0
  140. package/core/tools/dev/make/install.sh +82 -0
  141. package/core/tools/dev/ncurses/README.md +42 -0
  142. package/core/tools/dev/ncurses/install.sh +82 -0
  143. package/core/tools/dev/proot/README.md +43 -0
  144. package/core/tools/dev/proot/install.sh +82 -0
  145. package/core/tools/dev/shfmt/README.md +44 -0
  146. package/core/tools/dev/shfmt/install.sh +82 -0
  147. package/core/tools/dev/tmate/README.md +44 -0
  148. package/core/tools/dev/tmate/install.sh +82 -0
  149. package/core/tools/dev/translate/README.md +44 -0
  150. package/core/tools/dev/translate/install.sh +82 -0
  151. package/core/tools/dev/tree/README.md +44 -0
  152. package/core/tools/dev/tree/install.sh +82 -0
  153. package/core/tools/dev/udocker/README.md +44 -0
  154. package/core/tools/dev/udocker/install.sh +82 -0
  155. package/core/tools/dev/wget/README.md +44 -0
  156. package/core/tools/dev/wget/install.sh +82 -0
  157. package/core/tools/editor/all.sh +58 -0
  158. package/core/tools/editor/neovim/README.md +43 -0
  159. package/core/tools/editor/neovim/install.sh +66 -0
  160. package/core/tools/editor/nvchad/README.md +45 -0
  161. package/core/tools/editor/nvchad/install.sh +110 -0
  162. package/core/tools/lang/all.sh +63 -0
  163. package/core/tools/lang/clang/README.md +43 -0
  164. package/core/tools/lang/clang/install.sh +79 -0
  165. package/core/tools/lang/golang/README.md +43 -0
  166. package/core/tools/lang/golang/install.sh +79 -0
  167. package/core/tools/lang/nodejs/README.md +43 -0
  168. package/core/tools/lang/nodejs/install.sh +79 -0
  169. package/core/tools/lang/perl/README.md +43 -0
  170. package/core/tools/lang/perl/install.sh +79 -0
  171. package/core/tools/lang/php/README.md +43 -0
  172. package/core/tools/lang/php/install.sh +79 -0
  173. package/core/tools/lang/python/README.md +43 -0
  174. package/core/tools/lang/python/install.sh +79 -0
  175. package/core/tools/lang/rust/README.md +43 -0
  176. package/core/tools/lang/rust/install.sh +79 -0
  177. package/core/tools/npm/all.sh +67 -0
  178. package/core/tools/npm/live-server/README.md +43 -0
  179. package/core/tools/npm/live-server/install.sh +95 -0
  180. package/core/tools/npm/localtunnel/README.md +43 -0
  181. package/core/tools/npm/localtunnel/install.sh +111 -0
  182. package/core/tools/npm/markserv/README.md +43 -0
  183. package/core/tools/npm/markserv/install.sh +94 -0
  184. package/core/tools/npm/ncu/README.md +43 -0
  185. package/core/tools/npm/ncu/install.sh +94 -0
  186. package/core/tools/npm/nestjs/README.md +43 -0
  187. package/core/tools/npm/nestjs/install.sh +94 -0
  188. package/core/tools/npm/ngrok/README.md +44 -0
  189. package/core/tools/npm/ngrok/install.sh +94 -0
  190. package/core/tools/npm/prettier/README.md +43 -0
  191. package/core/tools/npm/prettier/install.sh +94 -0
  192. package/core/tools/npm/psqlformat/README.md +43 -0
  193. package/core/tools/npm/psqlformat/install.sh +94 -0
  194. package/core/tools/npm/turbopack/README.md +8 -0
  195. package/core/tools/npm/turbopack/install.sh +41 -0
  196. package/core/tools/npm/typescript/README.md +43 -0
  197. package/core/tools/npm/typescript/install.sh +94 -0
  198. package/core/tools/npm/vercel/README.md +43 -0
  199. package/core/tools/npm/vercel/install.sh +94 -0
  200. package/core/tools/shell/all.sh +67 -0
  201. package/core/tools/shell/better-npm/README.md +43 -0
  202. package/core/tools/shell/better-npm/install.sh +85 -0
  203. package/core/tools/shell/fzf-tab/README.md +44 -0
  204. package/core/tools/shell/fzf-tab/install.sh +85 -0
  205. package/core/tools/shell/history-substring/README.md +43 -0
  206. package/core/tools/shell/history-substring/install.sh +85 -0
  207. package/core/tools/shell/powerlevel10k/README.md +43 -0
  208. package/core/tools/shell/powerlevel10k/install.sh +85 -0
  209. package/core/tools/shell/you-should-use/README.md +43 -0
  210. package/core/tools/shell/you-should-use/install.sh +85 -0
  211. package/core/tools/shell/zsh-autopair/README.md +44 -0
  212. package/core/tools/shell/zsh-autopair/install.sh +85 -0
  213. package/core/tools/shell/zsh-autosuggestions/README.md +43 -0
  214. package/core/tools/shell/zsh-autosuggestions/install.sh +85 -0
  215. package/core/tools/shell/zsh-completions/README.md +43 -0
  216. package/core/tools/shell/zsh-completions/install.sh +85 -0
  217. package/core/tools/shell/zsh-defer/README.md +43 -0
  218. package/core/tools/shell/zsh-defer/install.sh +85 -0
  219. package/core/tools/shell/zsh-syntax-highlighting/README.md +43 -0
  220. package/core/tools/shell/zsh-syntax-highlighting/install.sh +72 -0
  221. package/core/tools/ui/all.sh +61 -0
  222. package/core/tools/ui/banner/README.md +42 -0
  223. package/core/tools/ui/banner/install.sh +151 -0
  224. package/core/tools/ui/cursor/README.md +42 -0
  225. package/core/tools/ui/cursor/install.sh +58 -0
  226. package/core/tools/ui/extra-keys/README.md +43 -0
  227. package/core/tools/ui/extra-keys/install.sh +62 -0
  228. package/core/tools/ui/font/README.md +43 -0
  229. package/core/tools/ui/font/install.sh +63 -0
  230. package/core/utils/banner.sh +519 -0
  231. package/core/utils/bootstrap.sh +25 -0
  232. package/core/utils/colors.sh +31 -0
  233. package/core/utils/dialogrc +30 -0
  234. package/core/utils/env.sh +53 -0
  235. package/core/utils/log.sh +598 -0
  236. package/install.sh +272 -0
  237. package/package.json +43 -0
@@ -0,0 +1,519 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=all
3
+ [[ -n "$ZSH_VERSION" ]] && emulate -L bash 2>/dev/null || true
4
+ set -e 2>/dev/null || true
5
+
6
+ BANNER_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)"
7
+ BANNER_VERSION="$(grep "^OMNI_VERSION=" "$BANNER_SCRIPT_DIR/env.sh" 2>/dev/null | cut -d'"' -f2)"
8
+ [[ -z "$BANNER_VERSION" ]] && BANNER_VERSION="4.4.0"
9
+
10
+ ESC=$(printf '\033')
11
+
12
+ # TrueColor gradient: ciano -> azul -> roxo -> magenta -> rosa
13
+ tc() { printf '%s[38;2;%d;%d;%dm' "$ESC" "$1" "$2" "$3"; }
14
+
15
+ # 16-step TrueColor palette
16
+ TP=()
17
+ for i in $(seq 0 15); do
18
+ if (( i < 4 )); then
19
+ r=$(( 0 + i * 16 )); g=$(( 200 + i * 14 )); b=$(( 255 - i * 10 ))
20
+ elif (( i < 8 )); then
21
+ r=$(( 48 + (i-4) * 8 )); g=$(( 255 - (i-4) * 32 )); b=$(( 215 - (i-4) * 25 ))
22
+ elif (( i < 12 )); then
23
+ r=$(( 80 + (i-8) * 30 )); g=$(( 127 - (i-8) * 25 )); b=$(( 115 - (i-8) * 20 ))
24
+ else
25
+ r=$(( 200 + (i-12) * 14 )); g=$(( 27 + (i-12) * 5 )); b=$(( 35 + (i-12) * 20 ))
26
+ fi
27
+ (( r > 255 )) && r=255; (( g > 255 )) && g=255; (( b > 255 )) && b=255
28
+ (( r < 0 )) && r=0; (( g < 0 )) && g=0; (( b < 0 )) && b=0
29
+ TP+=("$(tc "$r" "$g" "$b")")
30
+ done
31
+
32
+ CYAN="${TP[0]}"
33
+ BLUE="${TP[4]}"
34
+ PURP="${TP[8]}"
35
+ MAG="${TP[12]}"
36
+ PINK=$(tc 255 80 140)
37
+ RED=$(tc 220 50 50)
38
+ WHITE="${ESC}[1;37m"
39
+ GRAY="${ESC}[0;90m"
40
+ DIM="${ESC}[2m"
41
+ NC="${ESC}[0m"
42
+
43
+ # Fixed colors for specific elements
44
+ RUBY=$(tc 220 50 60)
45
+ OBSIDIAN=$(tc 140 90 200)
46
+ GREEN1=$(tc 80 220 80)
47
+ GREEN2=$(tc 60 200 120)
48
+ C07="${TP[7]}"
49
+ C01="${TP[1]}"
50
+ C03="${TP[3]}"
51
+ C05="${TP[5]}"
52
+ C09="${TP[9]}"
53
+ C11="${TP[11]}"
54
+ C13="${TP[13]}"
55
+
56
+ _ansi_len() {
57
+ printf '%s' "$1" | sed 's/\x1b\[[0-9;]*m//g' | wc -m | tr -d ' '
58
+ }
59
+
60
+ _center() {
61
+ local text="$1" width="$2"
62
+ local vis; vis=$(_ansi_len "$text")
63
+ local total=$(( width - vis ))
64
+ local left=$(( total / 2 ))
65
+ local right=$(( total - left ))
66
+ printf '%*s' "$left" ''
67
+ printf '%s' "$text"
68
+ printf '%*s' "$right" ''
69
+ }
70
+
71
+ _repeat() {
72
+ local ch="$1" n="$2" out="" _z
73
+ for ((_z=0; _z<n; _z++)); do out+="$ch"; done
74
+ printf '%s' "$out"
75
+ }
76
+
77
+ _mirror() {
78
+ local s="$1" out="" i c
79
+ for (( i = ${#s} - 1; i >= 0; i-- )); do
80
+ c="${s:$i:1}"
81
+ case "$c" in
82
+ ┌) c=┐ ;; ┐) c=┌ ;;
83
+ └) c=┘ ;; ┘) c=└ ;;
84
+ ├) c=┤ ;; ┤) c=├ ;;
85
+ ┏) c=┓ ;; ┓) c=┏ ;;
86
+ ┗) c=┛ ;; ┛) c=┗ ;;
87
+ ┣) c=┫ ;; ┫) c=┣ ;;
88
+ ╭) c=╮ ;; ╮) c=╭ ;;
89
+ ╰) c=╯ ;; ╯) c=╰ ;;
90
+ ◤) c=◥ ;; ◥) c=◤ ;;
91
+ ◣) c=◢ ;; ◢) c=◣ ;;
92
+ esac
93
+ out+="$c"
94
+ done
95
+ printf '%s' "$out"
96
+ }
97
+
98
+ # ================================================================
99
+ # Counters
100
+ # ================================================================
101
+ _count_ai() { local c=0; for cmd in opencode claude gemini codex qwen vibe mimo hermes kimi ollama freebuff agy mmx pi engram codegraph command-code gentle-ai gga openclaude openclaw mistral-vibe minimax-cli antigravity-cli kiro heygen seedance veo3 odysseus kimchi; do command -v "$cmd" &>/dev/null && ((c++)); done; echo "$c"; }
102
+ _count_lang() { local c=0; for cmd in node python python3 rustc go clang php perl; do command -v "$cmd" &>/dev/null && ((c++)); done; echo "$c"; }
103
+ _count_db() { local c=0; command -v pg_ctl &>/dev/null && ((c++)); command -v mariadb &>/dev/null && ((c++)); command -v sqlite3 &>/dev/null && ((c++)); command -v mongod &>/dev/null && ((c++)); echo "$c"; }
104
+ _uptime() {
105
+ if [[ -f /proc/uptime ]]; then
106
+ local secs; secs=$(awk '{print int($1)}' /proc/uptime 2>/dev/null)
107
+ local d=$((secs/86400)) h=$((secs%86400/3600)) m=$((secs%3600/60))
108
+ if (( d>0 )); then printf "%dd %dh" "$d" "$h"
109
+ elif (( h>0 )); then printf "%dh %dm" "$h" "$m"
110
+ else printf "%dm" "$m"; fi
111
+ else echo "?"; fi
112
+ }
113
+ _ram_free() {
114
+ if [[ -f /proc/meminfo ]]; then
115
+ local kb; kb=$(grep MemAvailable /proc/meminfo 2>/dev/null | awk '{print $2}')
116
+ [[ -n "$kb" ]] && echo "$((kb/1024))MB" || echo "?"
117
+ else echo "?"; fi
118
+ }
119
+
120
+ # ================================================================
121
+ # OMNI letters design (8 wide x 7 tall)
122
+ # ================================================================
123
+ O=(
124
+ "╭────╮"
125
+ "│ ╭╮ │"
126
+ "│ ││ │"
127
+ "│ ││ │"
128
+ "│ ││ │"
129
+ "│ ╰╯ │"
130
+ "╰────╯"
131
+ )
132
+
133
+ M=(
134
+ "╭╮ ╭╮"
135
+ "││ ││"
136
+ "│╲ ╱│"
137
+ "│ ╲╱ │"
138
+ "│ ╭╮ │"
139
+ "│ ││ │"
140
+ "╰╯ ╰╯"
141
+ )
142
+
143
+ N=(
144
+ "╭────╮"
145
+ "││ │"
146
+ "││ │"
147
+ "│╲ │"
148
+ "│ ╲ │"
149
+ "│ ╲││"
150
+ "╰╯ ╰╯"
151
+ )
152
+
153
+ I=(
154
+ "╭────╮"
155
+ "│ │ │"
156
+ "│ │ │"
157
+ "│ │ │"
158
+ "│ │ │"
159
+ "│ │ │"
160
+ "╰────╯"
161
+ )
162
+
163
+ OMNI_LETTERS=(O M N I)
164
+ OMNI_W=8
165
+
166
+ # OMNI colors: gradient across letters
167
+ OMNI_COLORS=("${TP[1]}" "${TP[5]}" "${TP[9]}" "${TP[13]}")
168
+
169
+ # ================================================================
170
+ # CATALYST letters design (5 wide x 5 tall)
171
+ # ================================================================
172
+ C_A=(
173
+ "╭──╮"
174
+ "│╭╮│"
175
+ "││││"
176
+ "││││"
177
+ "╰╯╰╯"
178
+ )
179
+ C_T=(
180
+ "╭──╮"
181
+ " ││ "
182
+ " ││ "
183
+ " ││ "
184
+ " ╰╯ "
185
+ )
186
+ C_L=(
187
+ "╭ "
188
+ "│ "
189
+ "│ "
190
+ "│ "
191
+ "╰──╮"
192
+ )
193
+ C_Y=(
194
+ "╭──╮"
195
+ " ╲╱ "
196
+ " ││ "
197
+ " ││ "
198
+ " ╰╯ "
199
+ )
200
+ C_S=(
201
+ "╭──╮"
202
+ "│ "
203
+ "╰──╮"
204
+ " │"
205
+ "╰──╯"
206
+ )
207
+
208
+ C_C=(
209
+ "╭──╮"
210
+ "│ "
211
+ "│ "
212
+ "│ "
213
+ "╰──╯"
214
+ )
215
+
216
+ # Map CATALYST letters
217
+ CAT_MAP=(C_C C_A C_T C_A C_L C_Y C_S C_T)
218
+ CAT_W=5
219
+ CAT_H=5
220
+ CAT_COLORS=("${TP[0]}" "${TP[2]}" "${TP[4]}" "${TP[6]}" "${TP[8]}" "${TP[10]}" "${TP[12]}" "${TP[14]}")
221
+
222
+ # ================================================================
223
+ # Side circuit decorations
224
+ # ================================================================
225
+ SIDE_H=7
226
+ SIDE_W=4
227
+ DECOR_L=(
228
+ $'╭──╮'
229
+ $'│ ╰'
230
+ $'╰╮ '
231
+ $' │ '
232
+ $' ╰──'
233
+ $'╭╮ '
234
+ $'╰╯ '
235
+ )
236
+ DECOR_R=()
237
+ for row in "${DECOR_L[@]}"; do
238
+ DECOR_R+=("$(_mirror "$row")")
239
+ done
240
+
241
+ # ================================================================
242
+ # CATALYST side circuit decorations
243
+ # ================================================================
244
+ CAT_DECOR_L=(
245
+ "╭─╮ "
246
+ "│╰╮ "
247
+ "│ │ "
248
+ "╰╮│ "
249
+ " ╰╯ "
250
+ )
251
+ CAT_DECOR_R=()
252
+ for row in "${CAT_DECOR_L[@]}"; do
253
+ CAT_DECOR_R+=("$(_mirror "$row")")
254
+ done
255
+
256
+ # ================================================================
257
+ # Panel
258
+ # ================================================================
259
+ PANEL_HEADERS=("AI" "Lang" "DB" "Up" "RAM")
260
+ PANEL_ICONS=("◆" "</>" "⛁" "↗" "◫")
261
+
262
+ _panel_value() {
263
+ case $1 in
264
+ 0) _count_ai ;;
265
+ 1) _count_lang ;;
266
+ 2) _count_db ;;
267
+ 3) _uptime ;;
268
+ 4) _ram_free ;;
269
+ esac
270
+ }
271
+
272
+ # ================================================================
273
+ # Render
274
+ # ================================================================
275
+ _render() {
276
+ local cols="${COLUMNS:-$(tput cols 2>/dev/null || echo 80)}"
277
+ local W=$(( cols > 72 ? 68 : cols - 6 ))
278
+ (( W < 40 )) && W=40
279
+ local GAP_L=$(( (cols - W - 2) / 2 ))
280
+ (( GAP_L < 0 )) && GAP_L=0
281
+ local GAP_R=$(( cols - W - 2 - GAP_L ))
282
+ (( GAP_R < 0 )) && GAP_R=0
283
+
284
+ local pad_l; pad_l=$(printf '%*s' "$GAP_L" '')
285
+ local pad_r; pad_r=$(printf '%*s' "$GAP_R" '')
286
+ local sp_line; sp_line=$(printf '%*s' "$W" '')
287
+
288
+ # ---- Gradient frame line with tech connectors ----
289
+ local p1=$(( W / 4 )) p2=$(( W / 2 )) p3=$(( 3 * W / 4 ))
290
+ local top_frame="" bot_frame="" i
291
+ for (( i = 0; i < W; i++ )); do
292
+ local c_idx=$(( i * 16 / W ))
293
+ (( c_idx > 15 )) && c_idx=15
294
+ if (( i == 1 || i == W-2 )); then
295
+ top_frame+="${TP[$c_idx]}╌${NC}"
296
+ bot_frame+="${TP[$c_idx]}╌${NC}"
297
+ elif (( i == p1 || i == p2 || i == p3 )); then
298
+ top_frame+="${TP[$c_idx]}┬${NC}"
299
+ bot_frame+="${TP[$c_idx]}┴${NC}"
300
+ else
301
+ top_frame+="${TP[$c_idx]}─${NC}"
302
+ bot_frame+="${TP[$c_idx]}─${NC}"
303
+ fi
304
+ done
305
+
306
+ # ---- Top frame ----
307
+ echo "${pad_l}${TP[0]}╭${NC}${top_frame}${TP[15]}╮${NC}${pad_r}"
308
+
309
+ # ---- Header row ----
310
+ local hdr="${DIM}┄${NC}${DIM}┄${NC} ${TP[2]}◈${NC} ${WHITE}OMNI${NC} ${GRAY}${DIM}✦${NC} ${WHITE}SYSTEMS${NC} ${TP[2]}◈${NC} ${DIM}┄${NC}${DIM}┄${NC}"
311
+ echo "${pad_l}${TP[0]}│${NC}$(_center "$hdr" "$W")${TP[15]}│${NC}${pad_r}"
312
+
313
+ # ---- Empty row ----
314
+ echo "${pad_l}${TP[0]}│${NC}${sp_line}${TP[15]}│${NC}${pad_r}"
315
+
316
+ # ---- OMNI letters (7 rows) ----
317
+ local total_omni_w=$(( OMNI_W * 4 + 3 ))
318
+ for (( row_art = 0; row_art < 7; row_art++ )); do
319
+ local content=""
320
+ content+="${DIM}${DECOR_L[$row_art]}${NC} "
321
+ local l
322
+ for (( l = 0; l < 4; l++ )); do
323
+ local _arr="${OMNI_LETTERS[$l]}" _val
324
+ eval "_val=\"\${${_arr}[$row_art]}\""
325
+ content+="${OMNI_COLORS[$l]}${_val}${NC}"
326
+ (( l < 3 )) && content+=" "
327
+ done
328
+ content+=" ${DIM}${DECOR_R[$row_art]}${NC}"
329
+ echo "${pad_l}${TP[0]}│${NC}$(_center "$content" "$W")${TP[15]}│${NC}${pad_r}"
330
+ done
331
+
332
+ # ---- CATALYST (5 rows) ----
333
+ local total_cat_w=$(( CAT_W * 8 + 7 ))
334
+ for (( cat_row = 0; cat_row < CAT_H; cat_row++ )); do
335
+ local cat_line=""
336
+ cat_line+="${DIM}${CAT_DECOR_L[$cat_row]}${NC} "
337
+ for (( li = 0; li < 8; li++ )); do
338
+ local _carr="${CAT_MAP[$li]}" _cval
339
+ eval "_cval=\"\${${_carr}[$cat_row]}\""
340
+ cat_line+="${CAT_COLORS[$li]}${_cval}${NC}"
341
+ (( li < 7 )) && cat_line+=" "
342
+ done
343
+ cat_line+=" ${DIM}${CAT_DECOR_R[$cat_row]}${NC}"
344
+ echo "${pad_l}${TP[0]}│${NC}$(_center "$cat_line" "$W")${TP[15]}│${NC}${pad_r}"
345
+ done
346
+
347
+ # ---- Tech bus divider ----
348
+ local div_total=$(( W - 2 ))
349
+ local div_l=$(( (div_total - 3) / 2 ))
350
+ local div_r=$(( div_total - 3 - div_l ))
351
+ local dash_l="" dash_r="" j
352
+ for (( j = 0; j < div_l; j++ )); do
353
+ local m=$(( j % 4 ))
354
+ if (( m == 0 )); then dash_l+="─"
355
+ elif (( m == 1 )); then dash_l+="┄"
356
+ elif (( m == 2 )); then dash_l+="·"
357
+ else dash_l+="─"; fi
358
+ done
359
+ for (( j = 0; j < div_r; j++ )); do
360
+ local m=$(( j % 4 ))
361
+ if (( m == 0 )); then dash_r+="─"
362
+ elif (( m == 1 )); then dash_r+="┄"
363
+ elif (( m == 2 )); then dash_r+="·"
364
+ else dash_r+="─"; fi
365
+ done
366
+ local div_line="${DIM}${dash_l}${NC}${TP[3]}◈${NC}${DIM}${dash_r}${NC}"
367
+ echo "${pad_l}${TP[0]}│${NC}$(_center "$div_line" "$W")${TP[15]}│${NC}${pad_r}"
368
+
369
+ # ---- RUBY & OBSIDIAN ----
370
+ local gem_line="${TP[2]}◈${NC} ${RUBY}RUBY${NC} ${WHITE}&${NC} ${OBSIDIAN}OBSIDIAN${NC} ${TP[2]}◈${NC}"
371
+ echo "${pad_l}${TP[0]}│${NC}$(_center "$gem_line" "$W")${TP[15]}│${NC}${pad_r}"
372
+
373
+ # ---- Version ----
374
+ echo "${pad_l}${TP[0]}│${NC}$(_center "${GREEN2}Omni${NC} ${GREEN1}v${BANNER_VERSION}${NC}" "$W")${TP[15]}│${NC}${pad_r}"
375
+
376
+ # ---- Author ----
377
+ echo "${pad_l}${TP[0]}│${NC}$(_center "${GRAY}by${NC} ${WHITE}israel${NC} ${GRAY}marques${NC}" "$W")${TP[15]}│${NC}${pad_r}"
378
+
379
+ # ---- Empty row ----
380
+ echo "${pad_l}${TP[0]}│${NC}${sp_line}${TP[15]}│${NC}${pad_r}"
381
+
382
+ # ---- Info panel ----
383
+ local PW=$(( W - 4 ))
384
+ (( PW < 20 )) && PW=20
385
+ local phline; phline=$(_repeat '─' "$PW")
386
+
387
+ # Panel top
388
+ echo "${pad_l}${TP[0]}│${NC} ${TP[3]}╭${NC}${phline}${TP[11]}╮${NC} ${TP[15]}│${NC}${pad_r}"
389
+
390
+ # Panel header
391
+ local ph=" ${TP[3]}◈${NC} ${WHITE}STATUS${NC} ${TP[3]}◈${NC} "
392
+ echo "${pad_l}${TP[0]}│${NC} ${TP[3]}│${NC}$(_center "$ph" "$PW")${TP[11]}│${NC} ${TP[15]}│${NC}${pad_r}"
393
+
394
+ # Panel separator
395
+ local psep="" j
396
+ for (( j = 0; j < PW; j++ )); do
397
+ local m=$(( j % 4 ))
398
+ if (( m == 0 )); then psep+="─"
399
+ elif (( m == 1 )); then psep+="┄"
400
+ elif (( m == 2 )); then psep+="·"
401
+ else psep+="─"; fi
402
+ done
403
+ echo "${pad_l}${TP[0]}│${NC} ${TP[3]}│${NC}${DIM}${psep}${NC}${TP[11]}│${NC} ${TP[15]}│${NC}${pad_r}"
404
+
405
+ # Panel data row
406
+ local col_w=$(( (PW - 4) / 5 ))
407
+ local col_line=""
408
+ for (( i = 0; i < 5; i++ )); do
409
+ local val; val=$(_panel_value $i)
410
+ local entry="${TP[$(( i * 3 + 1 ))]}${PANEL_ICONS[$i]}${NC} ${WHITE}${PANEL_HEADERS[$i]}${NC} ${GREEN1}${val}${NC}"
411
+ local ev; ev=$(_ansi_len "$entry")
412
+ local epad=$(( (col_w - ev) / 2 ))
413
+ (( epad < 1 )) && epad=1
414
+ local epad2=$(( col_w - ev - epad ))
415
+ (( epad2 < 0 )) && epad2=0
416
+ col_line+="$(printf '%*s' "$epad" '')${entry}$(printf '%*s' "$epad2" '')"
417
+ (( i < 4 )) && col_line+="${GRAY}│${NC}"
418
+ done
419
+ echo "${pad_l}${TP[0]}│${NC} ${TP[3]}│${NC}${col_line}${TP[11]}│${NC} ${TP[15]}│${NC}${pad_r}"
420
+
421
+ # Panel bottom
422
+ echo "${pad_l}${TP[0]}│${NC} ${TP[3]}╰${NC}${phline}${TP[11]}╯${NC} ${TP[15]}│${NC}${pad_r}"
423
+
424
+ # ---- Empty row ----
425
+ echo "${pad_l}${TP[0]}│${NC}${sp_line}${TP[15]}│${NC}${pad_r}"
426
+
427
+ # ---- Decorative dot line ----
428
+ local dot_line="" j
429
+ for (( j = 0; j < W; j++ )); do
430
+ if (( j == W/2 )); then
431
+ dot_line+="${TP[3]}◈${NC}"
432
+ elif (( j % 5 == 0 )); then
433
+ dot_line+="${DIM}·${NC}"
434
+ elif (( j % 3 == 1 )); then
435
+ dot_line+="${GRAY}${DIM}┄${NC}"
436
+ else
437
+ dot_line+="${DIM}─${NC}"
438
+ fi
439
+ done
440
+ echo "${pad_l}${TP[0]}│${NC}${dot_line}${TP[15]}│${NC}${pad_r}"
441
+
442
+ # ---- Bottom card frame ----
443
+ echo "${pad_l}${TP[0]}│${NC}${DIM}╭${NC}$(printf '%*s' $((W-2)) '')${DIM}╮${NC}${TP[15]}│${NC}${pad_r}"
444
+
445
+ # ---- Run omni line ----
446
+ local run_content="${CYAN}>${NC} ${GREEN1}Run${NC} ${WHITE}omni${NC} ${GREEN1}to get started${NC} ${CYAN}_${NC}"
447
+ echo "${pad_l}${TP[0]}│${NC}${DIM}╰${NC}$(_center "$run_content" $((W-2)))${DIM}╯${NC}${TP[15]}│${NC}${pad_r}"
448
+
449
+ # ---- Bottom frame ----
450
+ echo "${pad_l}${TP[0]}╰${NC}${bot_frame}${TP[15]}╯${NC}${pad_r}"
451
+ }
452
+
453
+ echo
454
+ _render
455
+
456
+ # Cache banner for clear() override
457
+ _omni_banner_cache="${XDG_CACHE_HOME:-$HOME/.cache}/omni/banner_cache"
458
+ mkdir -p "$(dirname "$_omni_banner_cache")" 2>/dev/null
459
+ [[ -t 1 ]] && _render > "$_omni_banner_cache" 2>/dev/null
460
+
461
+ log_tip() { echo " ${TP[3]}●${NC} ${GRAY}Tip${NC} $*"; }
462
+
463
+ OMNI_TIPS=(
464
+ "Keep Omni updated: ${TP[3]}omni update core${NC}"
465
+ "Check your version: ${TP[3]}omni --version${NC}"
466
+ "Enable debug logs: ${TP[3]}export OMNI_DEBUG=1${NC}"
467
+ "Open framework docs: ${TP[3]}omni open omni${NC}"
468
+ "Install everything: ${TP[3]}omni install lang db dev npm${NC}"
469
+ "Install specific AI tools: ${TP[3]}omni install ai --opencode --ollama${NC}"
470
+ "See what's installed: ${TP[3]}omni list ai${NC}"
471
+ "Read tool docs: ${TP[3]}omni show ai --opencode${NC}"
472
+ "Update a specific tool: ${TP[3]}omni update ai --opencode${NC}"
473
+ "Update all AI tools: ${TP[3]}omni update ai${NC}"
474
+ "Update all databases: ${TP[3]}omni update db${NC}"
475
+ "Update ZSH plugins: ${TP[3]}omni update shell${NC}"
476
+ "Remove a module: ${TP[3]}omni uninstall npm${NC}"
477
+ "Install all languages: ${TP[3]}omni install lang${NC}"
478
+ "Install Python: ${TP[3]}omni install lang --python${NC}"
479
+ "Install Rust: ${TP[3]}omni install lang --rust${NC}"
480
+ "Install Go: ${TP[3]}omni install lang --golang${NC}"
481
+ "Start PostgreSQL: ${TP[3]}omni pg init${NC} then ${TP[3]}omni pg start${NC}"
482
+ "Open psql shell: ${TP[3]}omni pg shell${NC}"
483
+ "Install all AI agents: ${TP[3]}omni install ai${NC}"
484
+ "Install OpenCode: ${TP[3]}omni install ai --opencode${NC}"
485
+ "Install Claude Code: ${TP[3]}omni install ai --claude-code${NC}"
486
+ "Install Codex CLI: ${TP[3]}omni install ai --codex${NC}"
487
+ "Install Gemini CLI: ${TP[3]}omni install ai --gemini-cli${NC}"
488
+ "Install MiMo Code: ${TP[3]}omni install ai --mimocode${NC}"
489
+ "Install Neovim + NvChad: ${TP[3]}omni install editor${NC}"
490
+ "Fuzzy search: ${TP[3]}omni install dev --fzf${NC}"
491
+ "Modern ls: ${TP[3]}omni install dev --lsd${NC}"
492
+ "Syntax cat: ${TP[3]}omni install dev --bat${NC}"
493
+ "GitHub CLI: ${TP[3]}omni install dev --gh${NC}"
494
+ "Format shell scripts: ${TP[3]}omni install dev --shfmt${NC}"
495
+ "Process JSON: ${TP[3]}omni install dev --jq${NC}"
496
+ "Deploy to Vercel: ${TP[3]}omni install npm --vercel${NC}"
497
+ "TypeScript: ${TP[3]}omni install npm --typescript${NC}"
498
+ "Install ZSH + plugins: ${TP[3]}omni install shell${NC}"
499
+ "Customize Termux UI: ${TP[3]}omni install ui${NC}"
500
+ "Install banner: ${TP[3]}omni install ui --banner${NC}"
501
+ "Set API keys: ${TP[3]}omni env set${NC}"
502
+ "Second brain: ${TP[3]}omni brain init${NC}"
503
+ "Save memories: ${TP[3]}omni brain save${NC}"
504
+ "Voice-to-AI: ${TP[3]}omni voice opencode${NC}"
505
+ "Init Next.js: ${TP[3]}cd my-app && omni init next${NC}"
506
+ "Init Express: ${TP[3]}cd api && omni init express${NC}"
507
+ )
508
+
509
+ _tip_index_file="${XDG_CACHE_HOME:-$HOME/.cache}/omni/.last_tip_index"
510
+ if [[ ${#OMNI_TIPS[@]} -gt 0 ]]; then
511
+ last_index=-1
512
+ [[ -f "$_tip_index_file" ]] && last_index=$(cat "$_tip_index_file" 2>/dev/null || echo "-1")
513
+ new_index=$last_index
514
+ while [[ "$new_index" == "$last_index" ]]; do new_index=$(( RANDOM % ${#OMNI_TIPS[@]} )); done
515
+ echo "$new_index" >"$_tip_index_file"
516
+ _tip="${OMNI_TIPS[$new_index]:-}"
517
+ [[ -n "$_tip" ]] && { echo; log_tip "$_tip"; }
518
+ fi
519
+ echo
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # evitar redeclaraciones
4
+ [[ -n "${__OMNI_BOOTSTRAP_LOADED:-}" ]] && return
5
+ __OMNI_BOOTSTRAP_LOADED=1
6
+
7
+ # registro de imports
8
+ declare -A __OMNI_IMPORTED
9
+
10
+ import() {
11
+ local base="${OMNI_PATH}"
12
+ local path="${1//@/$base}.sh"
13
+
14
+ if [[ -n "${__OMNI_IMPORTED[$path]}" ]]; then
15
+ return
16
+ fi
17
+
18
+ if [[ ! -f "$path" ]]; then
19
+ echo "omni: import error: $path not found" >&2
20
+ exit 1
21
+ fi
22
+
23
+ __OMNI_IMPORTED[$path]=1
24
+ source "$path"
25
+ }
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # light colors
4
+ BLACK="\e[1;30m"
5
+ GRAY="\033[0;90m"
6
+ BLUE="\e[1;34m"
7
+ GREEN="\e[1;32m"
8
+ CYAN="\e[38;5;196m" # Ruby Red
9
+ RED="\e[1;31m"
10
+ PURPLE="\e[1;35m"
11
+ YELLOW="\e[1;33m"
12
+ NC="\e[1;37m" # no color or white
13
+
14
+ # dark colors
15
+ D_BLACK="\e[0;30m"
16
+ D_BLUE="\e[0;34m"
17
+ D_GREEN="\e[0;32m"
18
+ D_CYAN="\e[38;5;129m" # Obsidian Purple
19
+ D_RED="\e[0;31m"
20
+ D_PURPLE="\e[0;35m"
21
+ D_YELLOW="\e[0;33m"
22
+ D_NC="\e[0;37m" # no color or white
23
+
24
+ # background colors
25
+ BG_BLACK=$(setterm -background black)
26
+ BG_BLUE=$(setterm -background blue)
27
+ BG_GREEN=$(setterm -background green)
28
+ BG_CYAN=$(setterm -background cyan)
29
+ BG_RED=$(setterm -background red)
30
+ BG_YELLOW=$(setterm -background yellow)
31
+ BG_WHITE=$(setterm -background white)
@@ -0,0 +1,30 @@
1
+ use_shadow = OFF
2
+ use_colors = ON
3
+ screen_color = (WHITE,BLACK,OFF)
4
+ dialog_color = (WHITE,BLACK,OFF)
5
+ title_color = (RED,BLACK,ON)
6
+ border_color = (MAGENTA,BLACK,OFF)
7
+ button_active_color = (WHITE,RED,ON)
8
+ button_inactive_color = (WHITE,BLACK,OFF)
9
+ button_key_active_color = (WHITE,RED,ON)
10
+ button_key_inactive_color = (RED,BLACK,OFF)
11
+ button_label_active_color = (YELLOW,RED,ON)
12
+ button_label_inactive_color = (WHITE,BLACK,ON)
13
+ inputbox_color = (WHITE,BLACK,OFF)
14
+ inputbox_border_color = (MAGENTA,BLACK,OFF)
15
+ searchbox_color = (WHITE,BLACK,OFF)
16
+ searchbox_title_color = (RED,BLACK,ON)
17
+ searchbox_border_color = (MAGENTA,BLACK,OFF)
18
+ position_indicator_color = (RED,BLACK,ON)
19
+ menubox_color = (WHITE,BLACK,OFF)
20
+ menubox_border_color = (MAGENTA,BLACK,OFF)
21
+ item_color = (WHITE,BLACK,OFF)
22
+ item_selected_color = (WHITE,MAGENTA,ON)
23
+ tag_color = (RED,BLACK,ON)
24
+ tag_selected_color = (WHITE,MAGENTA,ON)
25
+ tag_key_color = (RED,BLACK,OFF)
26
+ tag_key_selected_color = (WHITE,MAGENTA,ON)
27
+ check_color = (RED,BLACK,ON)
28
+ check_selected_color = (WHITE,MAGENTA,ON)
29
+ uarrow_color = (MAGENTA,BLACK,ON)
30
+ darrow_color = (MAGENTA,BLACK,ON)
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env bash
2
+
3
+ OMNI_VERSION="1.0.0"
4
+
5
+ # -------------------------
6
+ # Directorios del usuario
7
+ # -------------------------
8
+
9
+ # configuración
10
+ OMNI_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/omni"
11
+
12
+ # cache
13
+ OMNI_CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/omni"
14
+
15
+ # datos del usuario
16
+ OMNI_DATA="${XDG_DATA_HOME:-$HOME/.local/share}/omni-data"
17
+
18
+ # -------------------------
19
+ # Rutas internas del CLI
20
+ # -------------------------
21
+
22
+ OMNI_BIN="$OMNI_PATH/bin"
23
+ OMNI_MODULES="$OMNI_PATH/modules"
24
+ OMNI_UTILS="$OMNI_PATH/utils"
25
+ OMNI_CLI="$OMNI_PATH/cli"
26
+
27
+ # -------------------------
28
+ # Crear directorios
29
+ # -------------------------
30
+
31
+ mkdir -p \
32
+ "$OMNI_CONFIG" \
33
+ "$OMNI_CACHE" \
34
+ "$OMNI_DATA"
35
+
36
+ # -------------------------
37
+ # TUI Colors - Ruby & Obsidian
38
+ # -------------------------
39
+ export DIALOGRC="$OMNI_UTILS/dialogrc"
40
+ export NEWT_COLORS='
41
+ root=,black
42
+ window=,black
43
+ border=magenta,black
44
+ textbox=white,black
45
+ button=white,red
46
+ actbutton=white,magenta
47
+ checkbox=magenta,black
48
+ actcheckbox=white,red
49
+ label=white,black
50
+ listbox=white,black
51
+ actlistbox=white,magenta
52
+ title=red,black
53
+ '