aether-code 0.13.0 → 0.14.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.
@@ -26,7 +26,7 @@ import {
26
26
  import readline from "node:readline";
27
27
  import { c, errorLine, divider } from "../src/render.js";
28
28
 
29
- const VERSION = "0.13.0";
29
+ const VERSION = "0.14.0";
30
30
 
31
31
  /**
32
32
  * Try to start MCP servers from ~/.aether/mcp.json. Returns a started
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aether-code",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Uncensored AI coding agent for your terminal — Claude Code alternative with MCP support. Reads code, writes files, runs commands. Drives IDA Pro, Roblox Studio, Wireshark, Blender, and any MCP server. No refusal layer.",
5
5
  "homepage": "https://trynoguard.com",
6
6
  "repository": {
package/src/repl.js CHANGED
@@ -15,7 +15,7 @@ import { fetchBalance, AetherError } from "./api.js";
15
15
  import { runSetup } from "./setup.js";
16
16
  import { c, errorLine } from "./render.js";
17
17
 
18
- const VERSION = "0.13.0";
18
+ const VERSION = "0.14.0";
19
19
  const MODEL_NAME = "Aether Core";
20
20
 
21
21
  const SHORTCUTS = `
@@ -221,17 +221,30 @@ async function handleSlash(line, state) {
221
221
 
222
222
  /* ───────── banner + status ───────── */
223
223
 
224
+ const visLen = (s) => s.replace(/\x1b\[[0-9;]*m/g, "").length;
225
+ const shortenPath = (p, max) => (p.length <= max ? p : "..." + p.slice(p.length - max + 3));
226
+
224
227
  function printBanner(state) {
228
+ const cols = process.stdout.columns || 80;
229
+ const W = Math.max(40, Math.min(cols - 1, 64));
230
+ // Brand-coloured rules top + bottom; content is indented with no right
231
+ // border, so nothing can misalign regardless of terminal font/width.
232
+ const rule = c.magenta("─".repeat(W));
233
+ const mode = state.autoYes ? "auto-yes" : "review mode";
234
+
225
235
  console.log("");
226
- console.log(c.bold(c.magenta(`aether-code`)) + c.gray(` v${VERSION}`));
227
- console.log(
228
- c.gray(`${MODEL_NAME} (1M context) · uncensored · `) +
229
- c.cyan(state.autoYes ? "auto-yes" : "review mode") +
230
- (state.balance != null ? c.gray(` · ${state.balance.toLocaleString()} credits`) : ""),
231
- );
232
- console.log(c.gray(state.cwd));
233
- console.log("");
234
- console.log(c.gray(`Type ${c.cyan("/help")} for shortcuts. ${c.cyan("/exit")} or Ctrl+C twice to quit.`));
236
+ console.log(rule);
237
+ console.log(` ${c.bold(c.magenta("aether-code"))}${c.gray(" v" + VERSION)}`);
238
+ console.log(` ${c.gray(`${MODEL_NAME} · 1M context · uncensored`)}`);
239
+ console.log(` ${c.gray(mode)}${state.balance != null ? c.gray(` · ${state.balance.toLocaleString()} credits`) : ""}`);
240
+ console.log(` ${c.gray(shortenPath(state.cwd, W - 2))}`);
241
+ console.log(rule);
242
+
243
+ // Bottom status bar: shortcuts on the left, mode on the right (Claude-style).
244
+ const left = ` ${c.cyan("/help")}${c.dim(" shortcuts")} ${c.cyan("/exit")}${c.dim(" quit")}`;
245
+ const right = `${c.cyan(mode)}${c.dim(" · ")}${c.gray(MODEL_NAME)} `;
246
+ const gap = Math.max(3, cols - visLen(left) - visLen(right) - 1);
247
+ console.log(left + " ".repeat(gap) + right);
235
248
  console.log("");
236
249
  }
237
250