@claudemax/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/LICENSE +21 -0
- package/README.md +183 -0
- package/dist/commands/ask.d.ts +7 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +70 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/chat.d.ts +7 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +152 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/config.d.ts +7 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +155 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/history.d.ts +7 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +158 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/usage.d.ts +7 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +37 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +43 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +136 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/config-manager.d.ts +45 -0
- package/dist/lib/config-manager.d.ts.map +1 -0
- package/dist/lib/config-manager.js +146 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/formatter.d.ts +42 -0
- package/dist/lib/formatter.d.ts.map +1 -0
- package/dist/lib/formatter.js +158 -0
- package/dist/lib/formatter.js.map +1 -0
- package/dist/lib/history-manager.d.ts +45 -0
- package/dist/lib/history-manager.d.ts.map +1 -0
- package/dist/lib/history-manager.js +163 -0
- package/dist/lib/history-manager.js.map +1 -0
- package/dist/lib/model-aliases.d.ts +22 -0
- package/dist/lib/model-aliases.d.ts.map +1 -0
- package/dist/lib/model-aliases.js +53 -0
- package/dist/lib/model-aliases.js.map +1 -0
- package/dist/lib/stream-handler.d.ts +37 -0
- package/dist/lib/stream-handler.d.ts.map +1 -0
- package/dist/lib/stream-handler.js +104 -0
- package/dist/lib/stream-handler.js.map +1 -0
- package/dist/types/index.d.ts +122 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 ClaudeAPI.Dev
|
|
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.
|
package/README.md
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# ClaudeAPI CLI
|
|
2
|
+
|
|
3
|
+
Official command-line interface for [ClaudeAPI.Dev](https://claudeapi.dev) - interact with Claude AI directly from your terminal.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🚀 **Interactive Chat** - Multi-turn conversations with Claude
|
|
8
|
+
- ⚡ **One-Shot Queries** - Quick questions with instant answers
|
|
9
|
+
- 📊 **Usage Tracking** - Monitor your API usage and balance
|
|
10
|
+
- 🎨 **Colored Output** - Beautiful terminal interface
|
|
11
|
+
- 💾 **History Management** - Save and replay conversations
|
|
12
|
+
- ⚙️ **Easy Configuration** - Simple API key setup
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install -g @claudemax/cli
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
### 1. Configure API Key
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
claudemax config set api-key YOUR_API_KEY
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Get your API key at: https://claudeapi.dev/dashboard/api-keys
|
|
29
|
+
|
|
30
|
+
### 2. Start Chatting
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
claudemax chat
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 3. Ask Quick Questions
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
claudemax ask "What is quantum computing?"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Commands
|
|
43
|
+
|
|
44
|
+
### `chat` - Interactive Chat Mode
|
|
45
|
+
|
|
46
|
+
Start a multi-turn conversation with Claude:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
claudemax chat
|
|
50
|
+
claudemax chat --model opus-4-5
|
|
51
|
+
claudemax chat --system "You are a helpful coding assistant"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
- `--model <model>` - Choose model (opus, sonnet, haiku)
|
|
56
|
+
- `--system <prompt>` - Set system prompt
|
|
57
|
+
- `--max-tokens <number>` - Maximum response length
|
|
58
|
+
|
|
59
|
+
### `ask` - One-Shot Query
|
|
60
|
+
|
|
61
|
+
Ask a single question:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
claudemax ask "Explain machine learning"
|
|
65
|
+
claudemax ask --model sonnet "Write a Python function to sort a list"
|
|
66
|
+
claudemax ask --quiet "Generate JSON" | jq .
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Options:
|
|
70
|
+
- `--model <model>` - Choose model (opus, sonnet, haiku)
|
|
71
|
+
- `--max-tokens <number>` - Maximum response length
|
|
72
|
+
- `--quiet` - Suppress usage stats (pipe-friendly)
|
|
73
|
+
|
|
74
|
+
### `config` - Manage Configuration
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Set API key
|
|
78
|
+
claudemax config set api-key YOUR_KEY
|
|
79
|
+
|
|
80
|
+
# Set default model
|
|
81
|
+
claudemax config set model sonnet
|
|
82
|
+
|
|
83
|
+
# View configuration
|
|
84
|
+
claudemax config list
|
|
85
|
+
|
|
86
|
+
# Reset to defaults
|
|
87
|
+
claudemax config reset
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### `usage` - Check Usage Stats
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
claudemax usage
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Shows:
|
|
97
|
+
- Current balance
|
|
98
|
+
- Requests today/this month
|
|
99
|
+
- Tokens used
|
|
100
|
+
- Estimated costs
|
|
101
|
+
|
|
102
|
+
### `history` - Manage Conversation History
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# List saved conversations
|
|
106
|
+
claudemax history list
|
|
107
|
+
|
|
108
|
+
# Load a conversation
|
|
109
|
+
claudemax history load <id>
|
|
110
|
+
|
|
111
|
+
# Clear history
|
|
112
|
+
claudemax history clear
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Configuration
|
|
116
|
+
|
|
117
|
+
Config file location: `~/.claudemax/config.json`
|
|
118
|
+
|
|
119
|
+
Default configuration:
|
|
120
|
+
```json
|
|
121
|
+
{
|
|
122
|
+
"apiKey": "",
|
|
123
|
+
"baseUrl": "https://api.claudeapi.dev",
|
|
124
|
+
"defaultModel": "claude-sonnet-4-5",
|
|
125
|
+
"maxTokens": 4096,
|
|
126
|
+
"temperature": 1.0
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Models
|
|
131
|
+
|
|
132
|
+
Short names for convenience:
|
|
133
|
+
- `opus` → `claude-opus-4-5` (Most capable)
|
|
134
|
+
- `sonnet` → `claude-sonnet-4-5` (Balanced)
|
|
135
|
+
- `haiku` → `claude-haiku-4` (Fast & cheap)
|
|
136
|
+
|
|
137
|
+
## Examples
|
|
138
|
+
|
|
139
|
+
### Code Generation
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
claudemax ask "Write a Python function to calculate fibonacci numbers"
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Interactive Debugging
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
claudemax chat --system "You are an expert debugger"
|
|
149
|
+
> I'm getting a null pointer exception in my Java code
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Pipe Output
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
claudemax ask --quiet "Generate 10 random usernames" > usernames.txt
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Generate Reports
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
claudemax ask "Analyze this data and create a report" < data.csv > report.md
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Pricing
|
|
165
|
+
|
|
166
|
+
ClaudeAPI.Dev is 80% cheaper than Anthropic's official API:
|
|
167
|
+
|
|
168
|
+
| Model | Cost |
|
|
169
|
+
|-------|------|
|
|
170
|
+
| Opus 4.5 | $3/1M input, $15/1M output |
|
|
171
|
+
| Sonnet 4.5 | $3/1M input, $15/1M output |
|
|
172
|
+
| Haiku 4 | $0.8/1M input, $4/1M output |
|
|
173
|
+
|
|
174
|
+
## Support
|
|
175
|
+
|
|
176
|
+
- **Website**: https://claudeapi.dev
|
|
177
|
+
- **Documentation**: https://docs.claudeapi.dev
|
|
178
|
+
- **Issues**: https://github.com/claudeapi-dev/claudeapi-cli/issues
|
|
179
|
+
- **Email**: support@claudeapi.dev
|
|
180
|
+
|
|
181
|
+
## License
|
|
182
|
+
|
|
183
|
+
MIT © ClaudeAPI.Dev
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,UAAU,SAsEnB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ask command - One-shot query to Claude
|
|
4
|
+
* Sends a single message and displays the response
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.askCommand = void 0;
|
|
8
|
+
const commander_1 = require("commander");
|
|
9
|
+
const api_client_1 = require("../lib/api-client");
|
|
10
|
+
const config_manager_1 = require("../lib/config-manager");
|
|
11
|
+
const model_aliases_1 = require("../lib/model-aliases");
|
|
12
|
+
const formatter_1 = require("../lib/formatter");
|
|
13
|
+
const stream_handler_1 = require("../lib/stream-handler");
|
|
14
|
+
exports.askCommand = new commander_1.Command('ask')
|
|
15
|
+
.description('Ask Claude a question (one-shot query)')
|
|
16
|
+
.argument('<prompt>', 'Question or prompt to send')
|
|
17
|
+
.option('-m, --model <model>', 'Model to use (opus, sonnet, haiku)', 'sonnet')
|
|
18
|
+
.option('-t, --max-tokens <number>', 'Maximum tokens in response', '4096')
|
|
19
|
+
.option('-q, --quiet', 'Suppress usage stats (pipe-friendly)', false)
|
|
20
|
+
.option('-s, --system <prompt>', 'System prompt')
|
|
21
|
+
.action(async (prompt, options) => {
|
|
22
|
+
try {
|
|
23
|
+
// Load and validate config
|
|
24
|
+
const config = (0, config_manager_1.loadConfig)();
|
|
25
|
+
const error = (0, config_manager_1.validateConfig)(config);
|
|
26
|
+
if (error) {
|
|
27
|
+
(0, formatter_1.formatError)(new Error(error), 'configuration_error');
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
// Resolve model name
|
|
31
|
+
const model = (0, model_aliases_1.resolveModelName)(options.model || config.defaultModel);
|
|
32
|
+
const maxTokens = parseInt(options.maxTokens, 10) || config.maxTokens;
|
|
33
|
+
// Create API client
|
|
34
|
+
const client = new api_client_1.ClaudeAPIClient(config.apiKey, config.baseUrl);
|
|
35
|
+
// Prepare request
|
|
36
|
+
const request = {
|
|
37
|
+
model,
|
|
38
|
+
messages: [{ role: 'user', content: prompt }],
|
|
39
|
+
max_tokens: maxTokens,
|
|
40
|
+
system: options.system,
|
|
41
|
+
temperature: config.temperature,
|
|
42
|
+
};
|
|
43
|
+
// Stream response
|
|
44
|
+
const events = client.streamMessage(request);
|
|
45
|
+
// Track usage
|
|
46
|
+
let inputTokens = 0;
|
|
47
|
+
let outputTokens = 0;
|
|
48
|
+
let fullText = '';
|
|
49
|
+
await (0, stream_handler_1.processStream)(events, (text) => {
|
|
50
|
+
process.stdout.write(text);
|
|
51
|
+
fullText += text;
|
|
52
|
+
}, (usage) => {
|
|
53
|
+
inputTokens = usage.inputTokens;
|
|
54
|
+
outputTokens = usage.outputTokens;
|
|
55
|
+
});
|
|
56
|
+
// Newline after response
|
|
57
|
+
console.log();
|
|
58
|
+
// Show usage stats (to stderr so it doesn't pollute piped output)
|
|
59
|
+
if (!options.quiet) {
|
|
60
|
+
console.error(); // Extra newline
|
|
61
|
+
(0, formatter_1.formatUsage)({ input_tokens: inputTokens, output_tokens: outputTokens }, model);
|
|
62
|
+
}
|
|
63
|
+
process.exit(0);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
(0, formatter_1.formatError)(error);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=ask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,WAAW,SA2IpB,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Chat command - Interactive conversation with Claude
|
|
4
|
+
* Multi-turn conversation with context preservation
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.chatCommand = void 0;
|
|
11
|
+
const commander_1 = require("commander");
|
|
12
|
+
const prompts_1 = __importDefault(require("prompts"));
|
|
13
|
+
const api_client_1 = require("../lib/api-client");
|
|
14
|
+
const config_manager_1 = require("../lib/config-manager");
|
|
15
|
+
const model_aliases_1 = require("../lib/model-aliases");
|
|
16
|
+
const formatter_1 = require("../lib/formatter");
|
|
17
|
+
const stream_handler_1 = require("../lib/stream-handler");
|
|
18
|
+
const history_manager_1 = require("../lib/history-manager");
|
|
19
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
20
|
+
exports.chatCommand = new commander_1.Command('chat')
|
|
21
|
+
.description('Start an interactive chat with Claude')
|
|
22
|
+
.option('-m, --model <model>', 'Model to use (opus, sonnet, haiku)', 'sonnet')
|
|
23
|
+
.option('-t, --max-tokens <number>', 'Maximum tokens per response', '4096')
|
|
24
|
+
.option('-s, --system <prompt>', 'System prompt')
|
|
25
|
+
.action(async (options) => {
|
|
26
|
+
try {
|
|
27
|
+
// Load and validate config
|
|
28
|
+
const config = (0, config_manager_1.loadConfig)();
|
|
29
|
+
const error = (0, config_manager_1.validateConfig)(config);
|
|
30
|
+
if (error) {
|
|
31
|
+
(0, formatter_1.formatError)(new Error(error), 'configuration_error');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
// Resolve model name
|
|
35
|
+
const model = (0, model_aliases_1.resolveModelName)(options.model || config.defaultModel);
|
|
36
|
+
const maxTokens = parseInt(options.maxTokens, 10) || config.maxTokens;
|
|
37
|
+
// Create API client
|
|
38
|
+
const client = new api_client_1.ClaudeAPIClient(config.apiKey, config.baseUrl);
|
|
39
|
+
// Get user balance
|
|
40
|
+
let balance;
|
|
41
|
+
try {
|
|
42
|
+
const stats = await client.getUserStats();
|
|
43
|
+
balance = stats.user.balance;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Ignore error, balance is optional
|
|
47
|
+
}
|
|
48
|
+
// Show welcome message
|
|
49
|
+
(0, formatter_1.formatWelcome)(model, balance);
|
|
50
|
+
// Conversation state
|
|
51
|
+
const messages = [];
|
|
52
|
+
let totalInputTokens = 0;
|
|
53
|
+
let totalOutputTokens = 0;
|
|
54
|
+
let totalCost = 0;
|
|
55
|
+
let messageCount = 0;
|
|
56
|
+
// Chat loop
|
|
57
|
+
while (true) {
|
|
58
|
+
// Get user input
|
|
59
|
+
const response = await (0, prompts_1.default)({
|
|
60
|
+
type: 'text',
|
|
61
|
+
name: 'message',
|
|
62
|
+
message: chalk_1.default.blue('You:'),
|
|
63
|
+
});
|
|
64
|
+
// Check for exit
|
|
65
|
+
if (!response.message || response.message.toLowerCase() === 'exit') {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
const userMessage = response.message.trim();
|
|
69
|
+
if (!userMessage)
|
|
70
|
+
continue;
|
|
71
|
+
// Add user message to conversation
|
|
72
|
+
messages.push({ role: 'user', content: userMessage });
|
|
73
|
+
messageCount++;
|
|
74
|
+
// Prepare request
|
|
75
|
+
const request = {
|
|
76
|
+
model,
|
|
77
|
+
messages,
|
|
78
|
+
max_tokens: maxTokens,
|
|
79
|
+
system: options.system,
|
|
80
|
+
temperature: config.temperature,
|
|
81
|
+
};
|
|
82
|
+
try {
|
|
83
|
+
// Stream response
|
|
84
|
+
const events = client.streamMessage(request);
|
|
85
|
+
// Show assistant label
|
|
86
|
+
console.log(chalk_1.default.green.bold('Assistant: '));
|
|
87
|
+
// Track usage and collect response
|
|
88
|
+
let inputTokens = 0;
|
|
89
|
+
let outputTokens = 0;
|
|
90
|
+
let assistantResponse = '';
|
|
91
|
+
await (0, stream_handler_1.processStream)(events, (text) => {
|
|
92
|
+
process.stdout.write(text);
|
|
93
|
+
assistantResponse += text;
|
|
94
|
+
}, (usage) => {
|
|
95
|
+
inputTokens = usage.inputTokens;
|
|
96
|
+
outputTokens = usage.outputTokens;
|
|
97
|
+
});
|
|
98
|
+
// Newline after response
|
|
99
|
+
console.log();
|
|
100
|
+
// Add assistant response to conversation
|
|
101
|
+
messages.push({ role: 'assistant', content: assistantResponse });
|
|
102
|
+
// Update totals
|
|
103
|
+
totalInputTokens += inputTokens;
|
|
104
|
+
totalOutputTokens += outputTokens;
|
|
105
|
+
totalCost += calculateCost(inputTokens, outputTokens, model);
|
|
106
|
+
// Show usage for this message
|
|
107
|
+
const totalTokens = inputTokens + outputTokens;
|
|
108
|
+
const messageCost = calculateCost(inputTokens, outputTokens, model);
|
|
109
|
+
console.log(chalk_1.default.gray(`\n📊 ${totalTokens.toLocaleString()} tokens · $${messageCost.toFixed(4)}\n`));
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
(0, formatter_1.formatError)(error);
|
|
113
|
+
console.log(); // Extra newline before next prompt
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Show session summary
|
|
117
|
+
const totalTokens = totalInputTokens + totalOutputTokens;
|
|
118
|
+
(0, formatter_1.formatSessionSummary)(totalTokens, totalCost, messageCount);
|
|
119
|
+
// Save conversation to history (if there were any messages)
|
|
120
|
+
if (messages.length > 0) {
|
|
121
|
+
const conversationId = (0, history_manager_1.saveConversation)(model, messages, {
|
|
122
|
+
totalTokens,
|
|
123
|
+
totalCost,
|
|
124
|
+
messageCount,
|
|
125
|
+
});
|
|
126
|
+
console.log(chalk_1.default.gray(`Conversation saved: ${conversationId}\n`));
|
|
127
|
+
}
|
|
128
|
+
process.exit(0);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
(0, formatter_1.formatError)(error);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
/**
|
|
136
|
+
* Calculate cost based on token usage and model
|
|
137
|
+
*/
|
|
138
|
+
function calculateCost(inputTokens, outputTokens, model) {
|
|
139
|
+
const pricing = {
|
|
140
|
+
'opus': { input: 3, output: 15 },
|
|
141
|
+
'sonnet': { input: 3, output: 15 },
|
|
142
|
+
'haiku': { input: 0.8, output: 4 },
|
|
143
|
+
'claude-opus-4-5': { input: 3, output: 15 },
|
|
144
|
+
'claude-sonnet-4-5': { input: 3, output: 15 },
|
|
145
|
+
'claude-haiku-4': { input: 0.8, output: 4 },
|
|
146
|
+
};
|
|
147
|
+
const modelPricing = pricing[model] || pricing['sonnet'];
|
|
148
|
+
const inputCost = (inputTokens / 1_000_000) * modelPricing.input;
|
|
149
|
+
const outputCost = (outputTokens / 1_000_000) * modelPricing.output;
|
|
150
|
+
return inputCost + outputCost;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,aAAa,SAKS,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Config command - Manage ClaudeAPI CLI configuration
|
|
4
|
+
* Set, get, list, and reset configuration values
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.configCommand = void 0;
|
|
11
|
+
const commander_1 = require("commander");
|
|
12
|
+
const config_manager_1 = require("../lib/config-manager");
|
|
13
|
+
const formatter_1 = require("../lib/formatter");
|
|
14
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
15
|
+
exports.configCommand = new commander_1.Command('config')
|
|
16
|
+
.description('Manage configuration')
|
|
17
|
+
.addCommand(createSetCommand())
|
|
18
|
+
.addCommand(createGetCommand())
|
|
19
|
+
.addCommand(createListCommand())
|
|
20
|
+
.addCommand(createResetCommand());
|
|
21
|
+
/**
|
|
22
|
+
* config set - Set a configuration value
|
|
23
|
+
*/
|
|
24
|
+
function createSetCommand() {
|
|
25
|
+
return new commander_1.Command('set')
|
|
26
|
+
.description('Set a configuration value')
|
|
27
|
+
.argument('<key>', 'Configuration key (api-key, base-url, model, max-tokens, temperature)')
|
|
28
|
+
.argument('<value>', 'Configuration value')
|
|
29
|
+
.action((key, value) => {
|
|
30
|
+
try {
|
|
31
|
+
// Normalize key (allow both kebab-case and camelCase)
|
|
32
|
+
const normalizedKey = normalizeConfigKey(key);
|
|
33
|
+
// Validate key
|
|
34
|
+
const validKeys = ['apiKey', 'baseUrl', 'defaultModel', 'maxTokens', 'temperature'];
|
|
35
|
+
if (!validKeys.includes(normalizedKey)) {
|
|
36
|
+
console.error(chalk_1.default.red(`Invalid config key: ${key}`));
|
|
37
|
+
console.error(chalk_1.default.yellow('Valid keys:'), validKeys.join(', '));
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
// Parse value based on key
|
|
41
|
+
let parsedValue = value;
|
|
42
|
+
if (normalizedKey === 'maxTokens') {
|
|
43
|
+
parsedValue = parseInt(value, 10);
|
|
44
|
+
if (isNaN(parsedValue) || parsedValue < 1) {
|
|
45
|
+
console.error(chalk_1.default.red('max-tokens must be a positive number'));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (normalizedKey === 'temperature') {
|
|
50
|
+
parsedValue = parseFloat(value);
|
|
51
|
+
if (isNaN(parsedValue) || parsedValue < 0 || parsedValue > 1) {
|
|
52
|
+
console.error(chalk_1.default.red('temperature must be between 0 and 1'));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Set value
|
|
57
|
+
(0, config_manager_1.setConfigValue)(normalizedKey, parsedValue);
|
|
58
|
+
console.log(chalk_1.default.green('✓ Configuration updated'));
|
|
59
|
+
console.log(chalk_1.default.white(` ${key}:`), chalk_1.default.yellow(value));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
(0, formatter_1.formatError)(error);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* config get - Get a configuration value
|
|
69
|
+
*/
|
|
70
|
+
function createGetCommand() {
|
|
71
|
+
return new commander_1.Command('get')
|
|
72
|
+
.description('Get a configuration value')
|
|
73
|
+
.argument('<key>', 'Configuration key')
|
|
74
|
+
.action((key) => {
|
|
75
|
+
try {
|
|
76
|
+
const normalizedKey = normalizeConfigKey(key);
|
|
77
|
+
const value = (0, config_manager_1.getConfigValue)(normalizedKey);
|
|
78
|
+
if (value === undefined) {
|
|
79
|
+
console.error(chalk_1.default.red(`Configuration key not found: ${key}`));
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
// Mask API key
|
|
83
|
+
const displayValue = normalizedKey === 'apiKey' && value
|
|
84
|
+
? maskApiKey(value)
|
|
85
|
+
: value;
|
|
86
|
+
console.log(chalk_1.default.yellow(String(displayValue)));
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
(0, formatter_1.formatError)(error);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* config list - List all configuration values
|
|
96
|
+
*/
|
|
97
|
+
function createListCommand() {
|
|
98
|
+
return new commander_1.Command('list')
|
|
99
|
+
.description('List all configuration values')
|
|
100
|
+
.action(() => {
|
|
101
|
+
try {
|
|
102
|
+
const config = (0, config_manager_1.loadConfig)();
|
|
103
|
+
(0, formatter_1.formatConfig)(config);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
(0, formatter_1.formatError)(error);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* config reset - Reset configuration to defaults
|
|
113
|
+
*/
|
|
114
|
+
function createResetCommand() {
|
|
115
|
+
return new commander_1.Command('reset')
|
|
116
|
+
.description('Reset configuration to defaults')
|
|
117
|
+
.action(() => {
|
|
118
|
+
try {
|
|
119
|
+
(0, config_manager_1.resetConfig)();
|
|
120
|
+
console.log(chalk_1.default.green('✓ Configuration reset to defaults'));
|
|
121
|
+
console.log(chalk_1.default.gray(' Run "claudemax config list" to see current values'));
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
(0, formatter_1.formatError)(error);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Normalize config key from kebab-case to camelCase
|
|
131
|
+
*/
|
|
132
|
+
function normalizeConfigKey(key) {
|
|
133
|
+
const keyMap = {
|
|
134
|
+
'api-key': 'apiKey',
|
|
135
|
+
'apikey': 'apiKey',
|
|
136
|
+
'base-url': 'baseUrl',
|
|
137
|
+
'baseurl': 'baseUrl',
|
|
138
|
+
'model': 'defaultModel',
|
|
139
|
+
'default-model': 'defaultModel',
|
|
140
|
+
'defaultmodel': 'defaultModel',
|
|
141
|
+
'max-tokens': 'maxTokens',
|
|
142
|
+
'maxtokens': 'maxTokens',
|
|
143
|
+
'temperature': 'temperature',
|
|
144
|
+
};
|
|
145
|
+
return keyMap[key.toLowerCase()] || key;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Mask API key for display
|
|
149
|
+
*/
|
|
150
|
+
function maskApiKey(key) {
|
|
151
|
+
if (key.length <= 16)
|
|
152
|
+
return '***';
|
|
153
|
+
return key.substring(0, 12) + '***' + key.substring(key.length - 4);
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,cAAc,SAKQ,CAAC"}
|