@krishivpb60/aether-ai-cli 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.
- package/.github/workflows/ci.yml +30 -0
- package/LICENSE +21 -0
- package/ORIGINAL_REQUEST.md +74 -0
- package/README.md +271 -0
- package/aether_pip/__init__.py +1 -0
- package/aether_pip/cli.py +49 -0
- package/bin/aether.js +10 -0
- package/package.json +46 -0
- package/setup.py +51 -0
- package/src/ai/fallback.js +179 -0
- package/src/ai/google.js +87 -0
- package/src/ai/providers.js +203 -0
- package/src/ai/router.js +114 -0
- package/src/ai/universal.js +465 -0
- package/src/ai/xai.js +50 -0
- package/src/chat.js +1034 -0
- package/src/cli.js +642 -0
- package/src/config.js +214 -0
- package/src/file-parser.js +94 -0
- package/src/modes.js +88 -0
- package/src/ui/banner.js +60 -0
- package/src/ui/spinner.js +43 -0
- package/src/ui/theme.js +169 -0
- package/test/config.test.js +182 -0
- package/test/fallback.test.js +105 -0
- package/test/file-parser.test.js +136 -0
- package/test/router.test.js +174 -0
- package/test/ux.test.js +128 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
strategy:
|
|
14
|
+
matrix:
|
|
15
|
+
node-version: [18.x, 20.x, 22.x]
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Use Node.js ${{ matrix.node-version }}
|
|
21
|
+
uses: actions/setup-node@v4
|
|
22
|
+
with:
|
|
23
|
+
node-version: ${{ matrix.node-version }}
|
|
24
|
+
cache: 'npm'
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: npm ci
|
|
28
|
+
|
|
29
|
+
- name: Run tests
|
|
30
|
+
run: npm test
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Krishiv PB (@Krylo-60)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Original User Request
|
|
2
|
+
|
|
3
|
+
## Initial Request — 2026-06-25T09:32:46-04:00
|
|
4
|
+
|
|
5
|
+
An all-in-one CLI command-line assistant called Aether AI CLI (`aether`). It features high-fidelity interactive terminal chat (using custom spinner, cyberpunk theme), multi-mode reasoning selection, file attachment parsing, secure API key configuration, and robust local offline JS mathematical fallbacks.
|
|
6
|
+
|
|
7
|
+
Working directory: C:\Users\naina\.gemini\antigravity\scratch\aether-ai-cli
|
|
8
|
+
Integrity mode: benchmark
|
|
9
|
+
|
|
10
|
+
## Requirements
|
|
11
|
+
|
|
12
|
+
### R1. High-Fidelity Cyberpunk Interactive Terminal Chat
|
|
13
|
+
- Provide a CLI tool (`aether`) that starts a continuous, interactive terminal chat.
|
|
14
|
+
- Display a stylized cyberpunk banner and colors, spinner indicators during API requests, and render assistant responses in formatted markdown.
|
|
15
|
+
- Support key CLI flags and commands (such as `--help`, `/quit`, `/exit`, `/clear`, `/modes`, `/providers`, etc.).
|
|
16
|
+
|
|
17
|
+
### R2. Dual Secure Configuration Management
|
|
18
|
+
- Allow users to store API keys and models locally in `~/.aether/config.json` via a CLI setup/config command.
|
|
19
|
+
- Support reading from environment variables (e.g., from `.env` or system variables) as a fallback/alternative so no API key errors occur.
|
|
20
|
+
- Mask all sensitive configuration values (like API keys) when listed/viewed.
|
|
21
|
+
|
|
22
|
+
### R3. File Attachment & Context Parsing
|
|
23
|
+
- Support passing files to the CLI or during chat (e.g. via syntax like `/attach <path>` or a CLI parameter).
|
|
24
|
+
- Parse the content of common file types (text, code, json, csv) and inject it into the prompt context.
|
|
25
|
+
|
|
26
|
+
### R4. Multi-Mode Reasoning & Routing
|
|
27
|
+
- Route user queries dynamically based on model availability and reasoning modes (e.g., Fast, Standard, Deep/Thinking reasoning).
|
|
28
|
+
- Support standard free and paid AI provider models (Gemini, Grok, etc.).
|
|
29
|
+
|
|
30
|
+
### R5. Offline Mathematical Fallback
|
|
31
|
+
- When no internet connection is available or API calls fail, fallback to a local JavaScript-based math/logic evaluation engine to solve equations or execute simple logic locally.
|
|
32
|
+
|
|
33
|
+
### R6. Git Initialization & GitHub Actions CI
|
|
34
|
+
- Initialize a local git repository in the workspace folder.
|
|
35
|
+
- Add all code files and create an initial commit.
|
|
36
|
+
- Define a GitHub Actions workflow `.github/workflows/ci.yml` to automatically run tests/linting.
|
|
37
|
+
|
|
38
|
+
### R7. Programmatic Test Suite
|
|
39
|
+
- Create automated unit tests (using Node's test runner) under the `test/` directory to verify:
|
|
40
|
+
- Configuration loading (priority order: file vs. environment variables).
|
|
41
|
+
- Context parsing of files.
|
|
42
|
+
- Multi-mode routing.
|
|
43
|
+
- Offline math fallback logic.
|
|
44
|
+
|
|
45
|
+
## Acceptance Criteria
|
|
46
|
+
|
|
47
|
+
### Installation & Help
|
|
48
|
+
- [ ] Running `npm link` or global install allows starting the CLI using `aether`.
|
|
49
|
+
- [ ] Running `aether --help` outputs comprehensive usage instructions and options.
|
|
50
|
+
|
|
51
|
+
### Interactive Chat & UI
|
|
52
|
+
- [ ] The CLI starts with a cyberpunk banner and colored interface.
|
|
53
|
+
- [ ] Spinning indicators are displayed while waiting for an API response.
|
|
54
|
+
- [ ] File attachments can be specified using a CLI argument or dynamic chat command (e.g., `/attach`).
|
|
55
|
+
|
|
56
|
+
### Key Management
|
|
57
|
+
- [ ] Interactive configuration command successfully creates/updates `~/.aether/config.json`.
|
|
58
|
+
- [ ] A fallback mechanism works when `~/.aether/config.json` is absent but environment variables are set.
|
|
59
|
+
- [ ] Listing the configuration masks keys (showing only prefix/suffix with dots).
|
|
60
|
+
|
|
61
|
+
### Math Fallback
|
|
62
|
+
- [ ] Running a math query when offline or with simulated network failure returns correct evaluation outputs from the local JS fallback engine.
|
|
63
|
+
|
|
64
|
+
### CI/CD and Tests
|
|
65
|
+
- [ ] Running `npm test` executes the unit test suite and passes successfully.
|
|
66
|
+
- [ ] A `.github/workflows/ci.yml` workflow file exists and defines linting and testing steps.
|
|
67
|
+
- [ ] Git repository is initialized in the working directory and a clean initial commit has been made.
|
|
68
|
+
|
|
69
|
+
## Follow-up — 2026-06-25T13:33:56Z
|
|
70
|
+
|
|
71
|
+
The user has specified an additional critical requirement:
|
|
72
|
+
"and also it should fell better then clude code and codex so it will be opensorce and free so it will blow i guess"
|
|
73
|
+
|
|
74
|
+
Ensure the CLI UX is absolutely premium, responsive, and visually stunning—outperforming tools like Claude Code and Codex CLI. It must feel extremely polished, fast, and feature-rich (cyberpunk ASCII art, interactive autocomplete/menu helpers, smooth animations, and perfect markdown rendering). Focus heavily on the UI polish and usability so that it stands out as a top-tier open-source tool.
|
package/README.md
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Aether AI CLI
|
|
2
|
+
|
|
3
|
+
> ⚡ **Universal AI Gateway** — 13+ providers, free & paid models, cyberpunk terminal
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@krylo-60/aether-ai-cli)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](https://nodejs.org)
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
╔═══════════════════════════════════════════════════════════╗
|
|
11
|
+
║ █████╗ ███████╗████████╗██╗ ██╗███████╗██████╗ ║
|
|
12
|
+
║ ██╔══██╗██╔════╝╚══██╔══╝██║ ██║██╔════╝██╔══██╗ ║
|
|
13
|
+
║ ███████║█████╗ ██║ ████████║█████╗ ██████╔╝ ║
|
|
14
|
+
║ ██╔══██║██╔══╝ ██║ ██╔══██║██╔══╝ ██╔══██╗ ║
|
|
15
|
+
║ ██║ ██║███████╗ ██║ ██║ ██║███████╗██║ ██║ ║
|
|
16
|
+
║ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ║
|
|
17
|
+
╚═══════════════════════════════════════════════════════════╝
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Aether Core AI v110** is a production-ready, globally installable command-line AI assistant that connects to **any AI provider in the world** — both free and paid. Chat with GPT-4o, Claude, Gemini, Llama, Mixtral, DeepSeek, and 50+ more models, all from one terminal.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## ✨ Features
|
|
25
|
+
|
|
26
|
+
- 🌐 **13+ AI Providers** — OpenAI, Anthropic, Google, Groq, Together, Mistral, OpenRouter, DeepSeek, Cerebras, Cohere, Perplexity, Fireworks, xAI
|
|
27
|
+
- 🆓 **Free Models Included** — Groq, Together AI, Cerebras, OpenRouter, and Cohere all offer generous free tiers
|
|
28
|
+
- 💬 **Interactive Chat** — Full terminal chat with slash commands, mode switching, and file attachments
|
|
29
|
+
- ⚡ **Single-Shot Queries** — Quick one-off questions directly from the CLI
|
|
30
|
+
- 🧠 **4 Reasoning Modes** — Synthesis, Research, Architect, Titan Fusion — each with unique system prompts
|
|
31
|
+
- 📎 **File Context Injection** — Attach code files, logs, or documents for context-aware AI responses
|
|
32
|
+
- 🔄 **Failover Mesh** — Automatic failback across all configured providers
|
|
33
|
+
- 🔢 **Local Math Solver** — Evaluates mathematical expressions without an API call
|
|
34
|
+
- 🤖 **Krylo Companion** — Offline cyberpunk companion bot when no API keys are configured
|
|
35
|
+
- 🔐 **Your Keys, Your Control** — API keys stored locally on YOUR machine, never transmitted anywhere
|
|
36
|
+
- 📤 **Export Conversations** — Save full chat history as Markdown files
|
|
37
|
+
- 🎨 **Cyberpunk UI** — Neon colors, ASCII art, signal bars, and mode badges
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 🚀 Quick Start
|
|
42
|
+
|
|
43
|
+
### Install globally
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install -g @krylo-60/aether-ai-cli
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Or run directly with npx
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npx @krylo-60/aether-ai-cli chat
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Setup (Interactive Wizard)
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
aether setup
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The wizard walks you through configuring providers — **start with free ones!**
|
|
62
|
+
|
|
63
|
+
### Or set keys manually
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Free providers (recommended to start)
|
|
67
|
+
aether config set GROQ_API_KEY gsk_your_key_here
|
|
68
|
+
aether config set GOOGLE_API_KEY AIza_your_key_here
|
|
69
|
+
aether config set OPENROUTER_API_KEY sk-or-your_key_here
|
|
70
|
+
|
|
71
|
+
# Paid providers
|
|
72
|
+
aether config set OPENAI_API_KEY sk-your_key_here
|
|
73
|
+
aether config set ANTHROPIC_API_KEY sk-ant-your_key_here
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Start chatting
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
aether chat
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Quick one-shot query
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
aether ask "Explain quantum computing in simple terms"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 📦 Supported Providers
|
|
91
|
+
|
|
92
|
+
| Provider | Key | Free Tier | Default Model |
|
|
93
|
+
|----------|-----|-----------|---------------|
|
|
94
|
+
| **Groq** | `GROQ_API_KEY` | ✅ Generous | `llama-3.3-70b-versatile` |
|
|
95
|
+
| **Together AI** | `TOGETHER_API_KEY` | ✅ Free credits | `Meta-Llama-3.1-70B-Instruct-Turbo` |
|
|
96
|
+
| **Cerebras** | `CEREBRAS_API_KEY` | ✅ Free tier | `llama-3.3-70b` |
|
|
97
|
+
| **OpenRouter** | `OPENROUTER_API_KEY` | ✅ Free models | `llama-3.1-70b-instruct:free` |
|
|
98
|
+
| **Google Gemini** | `GOOGLE_API_KEY` | ✅ Free tier | `gemini-2.5-flash` |
|
|
99
|
+
| **Cohere** | `COHERE_API_KEY` | ✅ Dev free | `command-r-plus` |
|
|
100
|
+
| **Fireworks AI** | `FIREWORKS_API_KEY` | ✅ Free tier | `llama-v3p1-70b-instruct` |
|
|
101
|
+
| **OpenAI** | `OPENAI_API_KEY` | 💳 Paid | `gpt-4o` |
|
|
102
|
+
| **Anthropic** | `ANTHROPIC_API_KEY` | 💳 Paid | `claude-sonnet-4` |
|
|
103
|
+
| **xAI** | `XAI_API_KEY` | 💳 Paid | `grok-2` |
|
|
104
|
+
| **Mistral** | `MISTRAL_API_KEY` | 💳 Paid | `mistral-large-latest` |
|
|
105
|
+
| **DeepSeek** | `DEEPSEEK_API_KEY` | 💳 Paid | `deepseek-chat` |
|
|
106
|
+
| **Perplexity** | `PERPLEXITY_API_KEY` | 💳 Paid | `sonar` |
|
|
107
|
+
|
|
108
|
+
> 💡 **Tip:** Start with **Groq** (fastest, free) or **Google Gemini** (most capable free tier). You can configure multiple providers and Aether will automatically failover between them!
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 🎮 Commands
|
|
113
|
+
|
|
114
|
+
### Core Commands
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
aether chat # Interactive chat session
|
|
118
|
+
aether ask "your question" # Single-shot query
|
|
119
|
+
aether setup # Guided provider setup wizard
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Configuration
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
aether config set <KEY> <value> # Set a config value
|
|
126
|
+
aether config get <KEY> # Get a config value
|
|
127
|
+
aether config list # List all config (keys masked)
|
|
128
|
+
aether config delete <KEY> # Delete a config key
|
|
129
|
+
aether config reset # Delete all config
|
|
130
|
+
aether config path # Show config file location
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Discovery
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
aether providers # List all 13+ supported providers
|
|
137
|
+
aether providers --free # Show only free-tier providers
|
|
138
|
+
aether models # List all available models
|
|
139
|
+
aether models groq # Models for a specific provider
|
|
140
|
+
aether modes # List reasoning modes
|
|
141
|
+
aether status # System status & active providers
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Flags
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
aether ask "prompt" --mode research # Use specific reasoning mode
|
|
148
|
+
aether ask "prompt" --file error.log # Attach file context
|
|
149
|
+
aether ask "prompt" --model gpt-4o # Override model
|
|
150
|
+
aether ask "prompt" --raw # Raw text output (for piping)
|
|
151
|
+
aether chat --mode architect # Start chat in specific mode
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 💬 Chat Commands
|
|
157
|
+
|
|
158
|
+
Inside interactive chat mode, use these slash commands:
|
|
159
|
+
|
|
160
|
+
| Command | Description |
|
|
161
|
+
|---------|-------------|
|
|
162
|
+
| `/help` | Show all commands |
|
|
163
|
+
| `/mode <name>` | Switch reasoning mode |
|
|
164
|
+
| `/modes` | List all modes with signal bars |
|
|
165
|
+
| `/attach <file>` | Attach a file for context |
|
|
166
|
+
| `/files` | List attached files |
|
|
167
|
+
| `/clear` | Remove attached files |
|
|
168
|
+
| `/providers` | Show active providers |
|
|
169
|
+
| `/export` | Export chat to Markdown |
|
|
170
|
+
| `/status` | Session status |
|
|
171
|
+
| `/exit` | End session |
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 🧠 Reasoning Modes
|
|
176
|
+
|
|
177
|
+
| Mode | Layer | Style | Signal |
|
|
178
|
+
|------|-------|-------|--------|
|
|
179
|
+
| **Synthesis** | v2.5 | Balanced, clean, direct | ████████░░ 80% |
|
|
180
|
+
| **Research** | v104 | Deep analysis, evidence-based | █████████░ 85% |
|
|
181
|
+
| **Architect** | v55 | Systems thinking, debugging | █████████░ 90% |
|
|
182
|
+
| **Titan Fusion** | v110 | Premium, maximum signal density | █████████░ 95% |
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 🔐 Security
|
|
187
|
+
|
|
188
|
+
- **Your keys stay on YOUR machine** — stored at `~/.aether/config.json`
|
|
189
|
+
- **No keys are bundled** in the package
|
|
190
|
+
- **No telemetry** — zero data collection
|
|
191
|
+
- **Keys are masked** when displayed (`aether config list`)
|
|
192
|
+
- **Environment variables** also supported as fallback
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 🔄 Failover Mesh
|
|
197
|
+
|
|
198
|
+
Aether routes your prompt through all configured providers automatically:
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
Your Prompt
|
|
202
|
+
↓
|
|
203
|
+
[Provider 1] → Success? → Response ✓
|
|
204
|
+
↓ (fail)
|
|
205
|
+
[Provider 2] → Success? → Response ✓
|
|
206
|
+
↓ (fail)
|
|
207
|
+
[Provider N] → Success? → Response ✓
|
|
208
|
+
↓ (all fail)
|
|
209
|
+
[Krylo Companion] → Local Response ✓
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
If a provider returns an error (rate limit, quota, etc.), Aether automatically tries the next one. Configure multiple free providers for maximum resilience!
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 📁 File Attachment
|
|
217
|
+
|
|
218
|
+
Attach code files, logs, configs, or documents for context-aware responses:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
# From CLI
|
|
222
|
+
aether ask "What's wrong with this code?" --file buggy.js
|
|
223
|
+
|
|
224
|
+
# In chat mode
|
|
225
|
+
/attach error.log
|
|
226
|
+
What errors are in this file?
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Supported file types:** `.js`, `.ts`, `.py`, `.html`, `.css`, `.json`, `.md`, `.txt`, `.log`, `.yaml`, `.xml`, `.toml`, `.sql`, `.go`, `.rs`, `.java`, `.c`, `.cpp`, `.rb`, `.php`, `.swift`, `.kt`, `.dart`, `.vue`, `.svelte`, `.sh`, `.bat`, `.ps1`, `.env`, `.csv`
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 🏗️ Development
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
# Clone the repo
|
|
237
|
+
git clone https://github.com/Krylo-60/aether-ai-cli.git
|
|
238
|
+
cd aether-ai-cli
|
|
239
|
+
|
|
240
|
+
# Install dependencies
|
|
241
|
+
npm install
|
|
242
|
+
|
|
243
|
+
# Link for local development
|
|
244
|
+
npm link
|
|
245
|
+
|
|
246
|
+
# Test
|
|
247
|
+
aether --help
|
|
248
|
+
aether status
|
|
249
|
+
aether ask "hello"
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## 📄 License
|
|
255
|
+
|
|
256
|
+
MIT License — see [LICENSE](LICENSE) for details.
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 👨💻 Author
|
|
261
|
+
|
|
262
|
+
**Krishiv PB** ([@Krylo-60](https://github.com/Krylo-60))
|
|
263
|
+
|
|
264
|
+
> *"Stay cyberpunk. ⚡"*
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
<p align="center">
|
|
269
|
+
<b>⚡ Aether Core AI v110 — Fusion Command Station ⚡</b><br>
|
|
270
|
+
<i>Universal AI Gateway for the Terminal</i>
|
|
271
|
+
</p>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Aether AI CLI Pip Package Wrapper
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
import subprocess
|
|
4
|
+
import shutil
|
|
5
|
+
|
|
6
|
+
def main():
|
|
7
|
+
# Find the Node.js entry point absolute path inside aether_pip/node_project
|
|
8
|
+
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
9
|
+
node_project_dir = os.path.join(script_dir, "node_project")
|
|
10
|
+
aether_js = os.path.join(node_project_dir, "bin", "aether.js")
|
|
11
|
+
|
|
12
|
+
# If not found globally, check dev layout relative to current working directory
|
|
13
|
+
if not os.path.exists(aether_js):
|
|
14
|
+
aether_js = os.path.join(os.getcwd(), "bin", "aether.js")
|
|
15
|
+
node_project_dir = os.getcwd()
|
|
16
|
+
|
|
17
|
+
if not shutil.which("node"):
|
|
18
|
+
print("Error: Node.js is required to run Aether AI CLI.", file=sys.stderr)
|
|
19
|
+
print("Please install Node.js (https://nodejs.org) and try again.", file=sys.stderr)
|
|
20
|
+
sys.exit(1)
|
|
21
|
+
|
|
22
|
+
# Check if node_modules exists in the node_project directory.
|
|
23
|
+
# If not, automatically run npm install inside that directory!
|
|
24
|
+
node_modules_dir = os.path.join(node_project_dir, "node_modules")
|
|
25
|
+
if not os.path.exists(node_modules_dir):
|
|
26
|
+
print("First-time launch check: Installing node dependencies via npm...")
|
|
27
|
+
npm_cmd = shutil.which("npm")
|
|
28
|
+
if not npm_cmd:
|
|
29
|
+
print("Error: npm is required to install Node dependencies.", file=sys.stderr)
|
|
30
|
+
print("Please install Node.js/npm and try again.", file=sys.stderr)
|
|
31
|
+
sys.exit(1)
|
|
32
|
+
|
|
33
|
+
# On Windows, run npm using shell=True to handle cmd/bat resolution
|
|
34
|
+
subprocess.run([npm_cmd, "install", "--no-audit", "--no-fund"], cwd=node_project_dir, shell=(os.name == "nt"))
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
# Run node aether.js passing all command line arguments
|
|
38
|
+
cmd = ["node", aether_js] + sys.argv[1:]
|
|
39
|
+
result = subprocess.run(cmd, check=False)
|
|
40
|
+
sys.exit(result.returncode)
|
|
41
|
+
except KeyboardInterrupt:
|
|
42
|
+
print("\nSession terminated by user.")
|
|
43
|
+
sys.exit(0)
|
|
44
|
+
except Exception as e:
|
|
45
|
+
print(f"Error running Aether: {e}", file=sys.stderr)
|
|
46
|
+
sys.exit(1)
|
|
47
|
+
|
|
48
|
+
if __name__ == "__main__":
|
|
49
|
+
main()
|
package/bin/aether.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// ═══════════════════════════════════════════════════════════
|
|
4
|
+
// AETHER AI CLI — Entry Point
|
|
5
|
+
// Universal AI Gateway — 13+ Providers, Free & Paid
|
|
6
|
+
// ═══════════════════════════════════════════════════════════
|
|
7
|
+
|
|
8
|
+
import { createCLI } from "../src/cli.js";
|
|
9
|
+
|
|
10
|
+
createCLI(process.argv);
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@krishivpb60/aether-ai-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Aether Core AI — A cyberpunk command-line AI assistant with multi-mode reasoning, 12-node failover mesh, file context injection, and offline fallbacks.",
|
|
5
|
+
"main": "src/cli.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"aether": "bin/aether.js"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"start": "node bin/aether.js",
|
|
12
|
+
"test": "node --test"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"ai",
|
|
16
|
+
"cli",
|
|
17
|
+
"gemini",
|
|
18
|
+
"grok",
|
|
19
|
+
"xai",
|
|
20
|
+
"chatbot",
|
|
21
|
+
"aether",
|
|
22
|
+
"cyberpunk",
|
|
23
|
+
"terminal",
|
|
24
|
+
"assistant"
|
|
25
|
+
],
|
|
26
|
+
"author": "Krishiv PB <krylobloxyt@gmail.com> (https://github.com/Krylo-60)",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/Krylo-60/aether-ai-cli.git"
|
|
31
|
+
},
|
|
32
|
+
"homepage": "https://github.com/Krylo-60/aether-ai-cli#readme",
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18.0.0"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"chalk": "^5.3.0",
|
|
41
|
+
"commander": "^12.1.0",
|
|
42
|
+
"marked": "^14.0.0",
|
|
43
|
+
"marked-terminal": "^7.2.0",
|
|
44
|
+
"ora": "^8.1.0"
|
|
45
|
+
}
|
|
46
|
+
}
|
package/setup.py
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
import os
|
|
3
|
+
import shutil
|
|
4
|
+
|
|
5
|
+
# Copy Node project files into aether_pip/node_project for clean packaging
|
|
6
|
+
dest_dir = os.path.join('aether_pip', 'node_project')
|
|
7
|
+
if os.path.exists(dest_dir):
|
|
8
|
+
shutil.rmtree(dest_dir)
|
|
9
|
+
os.makedirs(dest_dir)
|
|
10
|
+
|
|
11
|
+
# Copy directories
|
|
12
|
+
shutil.copytree('bin', os.path.join(dest_dir, 'bin'))
|
|
13
|
+
shutil.copytree('src', os.path.join(dest_dir, 'src'))
|
|
14
|
+
shutil.copyfile('package.json', os.path.join(dest_dir, 'package.json'))
|
|
15
|
+
if os.path.exists('package-lock.json'):
|
|
16
|
+
shutil.copyfile('package-lock.json', os.path.join(dest_dir, 'package-lock.json'))
|
|
17
|
+
|
|
18
|
+
def package_files(directory):
|
|
19
|
+
paths = []
|
|
20
|
+
for (path, directories, filenames) in os.walk(directory):
|
|
21
|
+
for filename in filenames:
|
|
22
|
+
rel_path = os.path.relpath(os.path.join(path, filename), 'aether_pip')
|
|
23
|
+
paths.append(rel_path)
|
|
24
|
+
return paths
|
|
25
|
+
|
|
26
|
+
setup(
|
|
27
|
+
name="aether-ai-cli",
|
|
28
|
+
version="1.0.0",
|
|
29
|
+
author="Krishiv PB",
|
|
30
|
+
author_email="krylobloxyt@gmail.com",
|
|
31
|
+
description="Aether Core AI v110 — Universal AI Gateway CLI (Python Wrapper)",
|
|
32
|
+
long_description=open("README.md", "r", encoding="utf-8").read() if os.path.exists("README.md") else "",
|
|
33
|
+
long_description_content_type="text/markdown",
|
|
34
|
+
url="https://github.com/Krylo-60/aether-ai-cli",
|
|
35
|
+
packages=find_packages(),
|
|
36
|
+
package_data={
|
|
37
|
+
"aether_pip": package_files(os.path.join('aether_pip', 'node_project')),
|
|
38
|
+
},
|
|
39
|
+
include_package_data=True,
|
|
40
|
+
entry_points={
|
|
41
|
+
"console_scripts": [
|
|
42
|
+
"aether-pip=aether_pip.cli:main",
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
classifiers=[
|
|
46
|
+
"Programming Language :: Python :: 3",
|
|
47
|
+
"License :: OSI Approved :: MIT License",
|
|
48
|
+
"Operating System :: OS Independent",
|
|
49
|
+
],
|
|
50
|
+
python_requires=">=3.6",
|
|
51
|
+
)
|