nexusforge-cli 1.0.0 → 1.0.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/README.md +128 -0
- package/dist/services/auth.d.ts.map +1 -1
- package/dist/services/auth.js +12 -3
- package/dist/services/auth.js.map +1 -1
- package/package.json +1 -1
- package/src/services/auth.ts +11 -3
package/README.md
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# NexusForge CLI
|
|
2
|
+
|
|
3
|
+
AI-powered development companion for your terminal. Like Claude Code, but for NexusForge.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
███╗ ██╗███████╗██╗ ██╗██╗ ██╗███████╗
|
|
7
|
+
████╗ ██║██╔════╝╚██╗██╔╝██║ ██║██╔════╝
|
|
8
|
+
██╔██╗ ██║█████╗ ╚███╔╝ ██║ ██║███████╗
|
|
9
|
+
██║╚██╗██║██╔══╝ ██╔██╗ ██║ ██║╚════██║
|
|
10
|
+
██║ ╚████║███████╗██╔╝ ██╗╚██████╔╝███████║
|
|
11
|
+
╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝
|
|
12
|
+
███████╗ ██████╗ ██████╗ ██████╗ ███████╗
|
|
13
|
+
██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝
|
|
14
|
+
█████╗ ██║ ██║██████╔╝██║ ███╗█████╗
|
|
15
|
+
██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝
|
|
16
|
+
██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗
|
|
17
|
+
╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install -g nexusforge-cli
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Quick Start
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Start NexusForge CLI
|
|
30
|
+
nexusforge
|
|
31
|
+
|
|
32
|
+
# First run will open browser for authentication
|
|
33
|
+
# After auth, you're ready to chat!
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Features
|
|
37
|
+
|
|
38
|
+
- **Interactive AI Chat** - Chat with NexusForge AI directly in your terminal
|
|
39
|
+
- **Browser Authentication** - Secure OAuth-style device authorization flow
|
|
40
|
+
- **Command Execution** - AI can suggest and execute shell commands
|
|
41
|
+
- **File Operations** - Read files into context with `/read`
|
|
42
|
+
- **Session Sync** - Sync conversations between CLI and web UI
|
|
43
|
+
- **Slash Commands** - Quick actions with `/help`, `/clear`, `/history`, and more
|
|
44
|
+
|
|
45
|
+
## Commands
|
|
46
|
+
|
|
47
|
+
### CLI Arguments
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
nexusforge # Start interactive chat
|
|
51
|
+
nexusforge login # Authenticate with browser
|
|
52
|
+
nexusforge logout # Clear saved credentials
|
|
53
|
+
nexusforge status # Check connection status
|
|
54
|
+
nexusforge --session <token> # Sync with web session
|
|
55
|
+
nexusforge --model <name> # Use specific model
|
|
56
|
+
nexusforge --cwd <path> # Set working directory
|
|
57
|
+
nexusforge --version # Show version
|
|
58
|
+
nexusforge --help # Show help
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Slash Commands (in chat)
|
|
62
|
+
|
|
63
|
+
| Command | Description |
|
|
64
|
+
|---------|-------------|
|
|
65
|
+
| `/help` | Show available commands |
|
|
66
|
+
| `/exit`, `/quit`, `/q` | Exit CLI |
|
|
67
|
+
| `/clear`, `/c` | Clear screen |
|
|
68
|
+
| `/history` | Show conversation history |
|
|
69
|
+
| `/resume [id]` | Resume previous conversation |
|
|
70
|
+
| `/model [name]` | Get or set the model |
|
|
71
|
+
| `/status` | Show connection status |
|
|
72
|
+
| `/read <path>` | Read a file into context |
|
|
73
|
+
| `/exec <cmd>` | Execute a shell command |
|
|
74
|
+
|
|
75
|
+
## Authentication
|
|
76
|
+
|
|
77
|
+
On first run, NexusForge CLI uses a secure device authorization flow:
|
|
78
|
+
|
|
79
|
+
1. CLI displays a verification URL
|
|
80
|
+
2. Open the URL in your browser
|
|
81
|
+
3. Log in to NexusForge (if not already)
|
|
82
|
+
4. Click "Authorize CLI"
|
|
83
|
+
5. CLI automatically receives your token
|
|
84
|
+
|
|
85
|
+
Your credentials are stored securely in `~/.nexusforge/config.json`.
|
|
86
|
+
|
|
87
|
+
## Session Sync
|
|
88
|
+
|
|
89
|
+
Sync conversations between the web UI and CLI:
|
|
90
|
+
|
|
91
|
+
1. In the web UI, click the **Terminal** button in the header
|
|
92
|
+
2. A command is copied to your clipboard
|
|
93
|
+
3. Paste and run in your terminal: `nexusforge --session <token>`
|
|
94
|
+
4. Your web conversation continues in the CLI
|
|
95
|
+
|
|
96
|
+
## Configuration
|
|
97
|
+
|
|
98
|
+
Config is stored at `~/.nexusforge/config.json`:
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"apiUrl": "https://nexusconnectbridge.automatanexus.com/api/v1/bridge",
|
|
103
|
+
"accessToken": "...",
|
|
104
|
+
"username": "your-username",
|
|
105
|
+
"defaultModel": "NexusForge",
|
|
106
|
+
"autoExecute": true
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Requirements
|
|
111
|
+
|
|
112
|
+
- Node.js 18+
|
|
113
|
+
- NexusForge account ([Sign up](https://nexusforge.automatanexus.com))
|
|
114
|
+
|
|
115
|
+
## Platform Support
|
|
116
|
+
|
|
117
|
+
- **Linux** - Full support
|
|
118
|
+
- **macOS** - Full support
|
|
119
|
+
- **Windows** - Full support (including WSL)
|
|
120
|
+
|
|
121
|
+
## Links
|
|
122
|
+
|
|
123
|
+
- [NexusForge Web](https://nexusforge.automatanexus.com)
|
|
124
|
+
- [AutomataNexus](https://automatanexus.com)
|
|
125
|
+
|
|
126
|
+
## License
|
|
127
|
+
|
|
128
|
+
MIT - AutomataNexus, LLC
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAiFxD;AAwED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAqBlD;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,IAAI,CAG7B;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS7E"}
|
package/dist/services/auth.js
CHANGED
|
@@ -39,11 +39,20 @@ export async function startDeviceAuth() {
|
|
|
39
39
|
console.log('');
|
|
40
40
|
// Try to open browser automatically
|
|
41
41
|
try {
|
|
42
|
-
|
|
42
|
+
// Use open with wait: false to not block
|
|
43
|
+
await open(deviceCodeResponse.verification_uri_complete, { wait: false });
|
|
43
44
|
displaySystemMessage('Browser opened automatically', 'info');
|
|
44
45
|
}
|
|
45
|
-
catch {
|
|
46
|
-
|
|
46
|
+
catch (err) {
|
|
47
|
+
// Try WSL-specific approach
|
|
48
|
+
try {
|
|
49
|
+
const { exec } = await import('child_process');
|
|
50
|
+
exec(`cmd.exe /c start "" "${deviceCodeResponse.verification_uri_complete}"`);
|
|
51
|
+
displaySystemMessage('Browser opened via Windows', 'info');
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
displaySystemMessage('Could not open browser. Please copy the URL above.', 'warning');
|
|
55
|
+
}
|
|
47
56
|
}
|
|
48
57
|
console.log('');
|
|
49
58
|
// Step 3: Poll for authorization
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAG7C,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,YAAY;AAC3C,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,iBAAiB;AAEhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,oBAAoB,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC;QACH,8BAA8B;QAC9B,MAAM,kBAAkB,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE3D,mCAAmC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,kBAAkB,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,kBAAkB,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,oCAAoC;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/services/auth.ts
CHANGED
|
@@ -47,10 +47,18 @@ export async function startDeviceAuth(): Promise<boolean> {
|
|
|
47
47
|
|
|
48
48
|
// Try to open browser automatically
|
|
49
49
|
try {
|
|
50
|
-
|
|
50
|
+
// Use open with wait: false to not block
|
|
51
|
+
await open(deviceCodeResponse.verification_uri_complete, { wait: false });
|
|
51
52
|
displaySystemMessage('Browser opened automatically', 'info');
|
|
52
|
-
} catch {
|
|
53
|
-
|
|
53
|
+
} catch (err) {
|
|
54
|
+
// Try WSL-specific approach
|
|
55
|
+
try {
|
|
56
|
+
const { exec } = await import('child_process');
|
|
57
|
+
exec(`cmd.exe /c start "" "${deviceCodeResponse.verification_uri_complete}"`);
|
|
58
|
+
displaySystemMessage('Browser opened via Windows', 'info');
|
|
59
|
+
} catch {
|
|
60
|
+
displaySystemMessage('Could not open browser. Please copy the URL above.', 'warning');
|
|
61
|
+
}
|
|
54
62
|
}
|
|
55
63
|
|
|
56
64
|
console.log('');
|