aether-code 0.32.0 → 0.32.2

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/package.json CHANGED
@@ -1,75 +1,77 @@
1
- {
2
- "name": "aether-code",
3
- "version": "0.32.0",
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
- "homepage": "https://trynoguard.com",
6
- "repository": {
7
- "type": "git",
8
- "url": "https://github.com/dannyphantomx64/aether-code"
9
- },
10
- "license": "MIT",
11
- "type": "module",
12
- "bin": {
13
- "aether": "bin/aether-code.js"
14
- },
15
- "files": [
16
- "bin",
17
- "src",
18
- "skills",
19
- "README.md",
20
- "LICENSE"
21
- ],
22
- "engines": {
23
- "node": ">=18"
24
- },
25
- "scripts": {
26
- "lint": "node --check bin/aether-code.js src/agent.js src/api.js src/config.js src/render.js src/tools.js src/diff.js src/repl.js src/mcp.js src/mcp-cli.js src/mcp-registry.js src/skills.js src/update-check.js src/ink-input.js",
27
- "test": "node --test \"test/**/*.test.js\"",
28
- "prepublishOnly": "npm run lint && npm test"
29
- },
30
- "keywords": [
31
- "aether",
32
- "ai",
33
- "ai-agent",
34
- "ai-cli",
35
- "ai-coding-assistant",
36
- "ai-coding-agent",
37
- "ai-pair-programmer",
38
- "agent",
39
- "agentic",
40
- "agentic-ai",
41
- "cli",
42
- "claude-code",
43
- "claude-code-alternative",
44
- "cursor-alternative",
45
- "coding-agent",
46
- "code-generation",
47
- "developer-tools",
48
- "llm",
49
- "llm-agent",
50
- "llm-tools",
51
- "mcp",
52
- "mcp-client",
53
- "model-context-protocol",
54
- "modelcontextprotocol",
55
- "ida-pro",
56
- "reverse-engineering",
57
- "roblox",
58
- "uncensored",
59
- "uncensored-ai",
60
- "uncensored-llm",
61
- "terminal",
62
- "tool-use",
63
- "tool-calling",
64
- "trynoguard"
65
- ],
66
- "dependencies": {
67
- "@modelcontextprotocol/sdk": "^1.29.0",
68
- "ink": "^7.1.0",
69
- "ink-text-input": "^6.0.0",
70
- "react": "^19.2.7"
71
- },
72
- "devDependencies": {
73
- "ink-testing-library": "^4.0.0"
74
- }
75
- }
1
+ {
2
+ "name": "aether-code",
3
+ "version": "0.32.2",
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
+ "homepage": "https://trynoguard.com",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/dannyphantomx64/aether-code"
9
+ },
10
+ "license": "MIT",
11
+ "type": "module",
12
+ "bin": {
13
+ "aether": "bin/aether-code.js"
14
+ },
15
+ "files": [
16
+ "bin",
17
+ "src",
18
+ "scripts",
19
+ "skills",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "engines": {
24
+ "node": ">=18"
25
+ },
26
+ "scripts": {
27
+ "postinstall": "node scripts/postinstall.js",
28
+ "lint": "node --check bin/aether-code.js src/agent.js src/api.js src/config.js src/render.js src/tools.js src/diff.js src/repl.js src/mcp.js src/mcp-cli.js src/mcp-registry.js src/skills.js src/update-check.js src/ink-input.js scripts/postinstall.js",
29
+ "test": "node --test \"test/**/*.test.js\"",
30
+ "prepublishOnly": "npm run lint && npm test"
31
+ },
32
+ "keywords": [
33
+ "aether",
34
+ "ai",
35
+ "ai-agent",
36
+ "ai-cli",
37
+ "ai-coding-assistant",
38
+ "ai-coding-agent",
39
+ "ai-pair-programmer",
40
+ "agent",
41
+ "agentic",
42
+ "agentic-ai",
43
+ "cli",
44
+ "claude-code",
45
+ "claude-code-alternative",
46
+ "cursor-alternative",
47
+ "coding-agent",
48
+ "code-generation",
49
+ "developer-tools",
50
+ "llm",
51
+ "llm-agent",
52
+ "llm-tools",
53
+ "mcp",
54
+ "mcp-client",
55
+ "model-context-protocol",
56
+ "modelcontextprotocol",
57
+ "ida-pro",
58
+ "reverse-engineering",
59
+ "roblox",
60
+ "uncensored",
61
+ "uncensored-ai",
62
+ "uncensored-llm",
63
+ "terminal",
64
+ "tool-use",
65
+ "tool-calling",
66
+ "trynoguard"
67
+ ],
68
+ "dependencies": {
69
+ "@modelcontextprotocol/sdk": "^1.29.0",
70
+ "ink": "^7.1.0",
71
+ "ink-text-input": "^6.0.0",
72
+ "react": "^19.2.7"
73
+ },
74
+ "devDependencies": {
75
+ "ink-testing-library": "^4.0.0"
76
+ }
77
+ }
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * postinstall — auto-fix PATH on Windows so `aether` works immediately
4
+ * after `npm install -g aether-code`.
5
+ *
6
+ * On non-Windows or when PATH already contains the npm bin dir, this is a no-op.
7
+ */
8
+
9
+ import { execFileSync } from "node:child_process";
10
+ import process from "node:process";
11
+ import path from "node:path";
12
+ import fs from "node:fs";
13
+
14
+ const IS_WIN = process.platform === "win32";
15
+ const IS_GLOBAL = isGlobalInstall();
16
+
17
+ function run(cmd, args) {
18
+ return execFileSync(cmd, args, {
19
+ encoding: "utf8",
20
+ timeout: 15_000,
21
+ windowsHide: true,
22
+ }).trim();
23
+ }
24
+
25
+ function isGlobalInstall() {
26
+ if (process.env.npm_config_global === "true") return true;
27
+
28
+ try {
29
+ const prefix = run("npm", ["config", "get", "prefix"]);
30
+ const selfDir = path.resolve(process.cwd());
31
+ return selfDir.toLowerCase().startsWith(prefix.toLowerCase());
32
+ } catch {
33
+ return false;
34
+ }
35
+ }
36
+
37
+ function getNpmBinDir() {
38
+ try {
39
+ const prefix = run("npm", ["config", "get", "prefix"]);
40
+ // On Windows binaries live directly in the prefix dir
41
+ return IS_WIN ? prefix : path.join(prefix, "bin");
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+
47
+ function isInPath(dir) {
48
+ if (!dir) return false;
49
+ const sep = IS_WIN ? ";" : ":";
50
+ const pathDirs = (process.env.PATH || "").split(sep).map((d) => {
51
+ try {
52
+ return path.resolve(d).toLowerCase();
53
+ } catch {
54
+ return d.toLowerCase();
55
+ }
56
+ });
57
+ return pathDirs.includes(path.resolve(dir).toLowerCase());
58
+ }
59
+
60
+ function readWindowsUserPath() {
61
+ try {
62
+ return run("powershell.exe", [
63
+ "-NoProfile",
64
+ "-Command",
65
+ "[Environment]::GetEnvironmentVariable('Path', 'User')",
66
+ ]);
67
+ } catch {
68
+ return "";
69
+ }
70
+ }
71
+
72
+ function writeWindowsUserPath(newPath) {
73
+ run("powershell.exe", [
74
+ "-NoProfile",
75
+ "-Command",
76
+ `[Environment]::SetEnvironmentVariable('Path', '${newPath.replace(/'/g, "''")}', 'User')`,
77
+ ]);
78
+ }
79
+
80
+ function addToWindowsUserPath(dir) {
81
+ try {
82
+ const currentUserPath = readWindowsUserPath();
83
+
84
+ const pathEntries = currentUserPath
85
+ .split(";")
86
+ .filter(Boolean)
87
+ .map((p) => {
88
+ try {
89
+ return path.resolve(p).toLowerCase();
90
+ } catch {
91
+ return p.toLowerCase();
92
+ }
93
+ });
94
+
95
+ if (pathEntries.includes(path.resolve(dir).toLowerCase())) {
96
+ return "already_set";
97
+ }
98
+
99
+ const newPath = currentUserPath ? `${currentUserPath};${dir}` : dir;
100
+ writeWindowsUserPath(newPath);
101
+ return "added";
102
+ } catch {
103
+ return "failed";
104
+ }
105
+ }
106
+
107
+ function verifyBinaryExists(binDir) {
108
+ if (!binDir) return false;
109
+ const shimName = IS_WIN ? "aether.cmd" : "aether";
110
+ return fs.existsSync(path.join(binDir, shimName));
111
+ }
112
+
113
+ // ── ANSI helpers ────────────────────────────────────────────────────────────────
114
+
115
+ const RESET = "\x1b[0m";
116
+ const GREEN = "\x1b[32m";
117
+ const YELLOW = "\x1b[33m";
118
+ const CYAN = "\x1b[36m";
119
+ const BOLD = "\x1b[1m";
120
+ const DIM = "\x1b[2m";
121
+
122
+ function banner(lines) {
123
+ console.log("");
124
+ for (const l of lines) console.log(l);
125
+ console.log("");
126
+ }
127
+
128
+ // ── main ────────────────────────────────────────────────────────────────────────
129
+
130
+ function main() {
131
+ if (!IS_GLOBAL) return;
132
+
133
+ const binDir = getNpmBinDir();
134
+ if (!binDir) return;
135
+
136
+ // Already good — nothing to do
137
+ if (isInPath(binDir) && verifyBinaryExists(binDir)) return;
138
+
139
+ if (IS_WIN && !isInPath(binDir)) {
140
+ const result = addToWindowsUserPath(binDir);
141
+
142
+ if (result === "added") {
143
+ banner([
144
+ `${GREEN}${BOLD} ✔ aether${RESET}${GREEN} has been added to your PATH automatically.${RESET}`,
145
+ `${YELLOW} ⚡ Restart your terminal${RESET}${DIM}, then run:${RESET}`,
146
+ `${CYAN} aether${RESET}`,
147
+ ]);
148
+ } else if (result === "already_set") {
149
+ banner([
150
+ `${GREEN}${BOLD} ✔ aether${RESET}${GREEN} is installed.${RESET}`,
151
+ `${YELLOW} ⚡ Restart your terminal${RESET}${DIM}, then run:${RESET}`,
152
+ `${CYAN} aether${RESET}`,
153
+ ]);
154
+ } else {
155
+ banner([
156
+ `${GREEN}${BOLD} ✔ aether${RESET}${GREEN} is installed but your PATH needs updating.${RESET}`,
157
+ `${YELLOW} Run this once to fix it:${RESET}`,
158
+ ``,
159
+ `${CYAN} powershell -Command "[Environment]::SetEnvironmentVariable('Path', $env:Path + ';${binDir}', 'User')"${RESET}`,
160
+ ``,
161
+ `${DIM} Then restart your terminal and run: ${RESET}${CYAN}aether${RESET}`,
162
+ ]);
163
+ }
164
+ return;
165
+ }
166
+
167
+ if (!IS_WIN && !isInPath(binDir)) {
168
+ const shell = process.env.SHELL || "/bin/bash";
169
+ const rcFile = shell.includes("zsh") ? "~/.zshrc" : "~/.bashrc";
170
+
171
+ banner([
172
+ `${GREEN}${BOLD} ✔ aether${RESET}${GREEN} is installed but not in your PATH.${RESET}`,
173
+ `${YELLOW} Add this to ${rcFile}:${RESET}`,
174
+ ``,
175
+ `${CYAN} export PATH="${binDir}:$PATH"${RESET}`,
176
+ ``,
177
+ `${DIM} Then restart your terminal and run: ${RESET}${CYAN}aether${RESET}`,
178
+ ]);
179
+ }
180
+ }
181
+
182
+ main();