@majkapp/majk-chat-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.
Files changed (38) hide show
  1. package/README.md +746 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +1001 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/interactive/interactive.d.ts +27 -0
  7. package/dist/interactive/interactive.d.ts.map +1 -0
  8. package/dist/interactive/interactive.js +361 -0
  9. package/dist/interactive/interactive.js.map +1 -0
  10. package/dist/tools/bash.tool.d.ts +11 -0
  11. package/dist/tools/bash.tool.d.ts.map +1 -0
  12. package/dist/tools/bash.tool.js +140 -0
  13. package/dist/tools/bash.tool.js.map +1 -0
  14. package/dist/tools/filesystem.tool.d.ts +20 -0
  15. package/dist/tools/filesystem.tool.d.ts.map +1 -0
  16. package/dist/tools/filesystem.tool.js +312 -0
  17. package/dist/tools/filesystem.tool.js.map +1 -0
  18. package/dist/utils/config.d.ts +8 -0
  19. package/dist/utils/config.d.ts.map +1 -0
  20. package/dist/utils/config.js +140 -0
  21. package/dist/utils/config.js.map +1 -0
  22. package/dist/utils/credentials.d.ts +45 -0
  23. package/dist/utils/credentials.d.ts.map +1 -0
  24. package/dist/utils/credentials.js +265 -0
  25. package/dist/utils/credentials.js.map +1 -0
  26. package/dist/utils/models.d.ts +10 -0
  27. package/dist/utils/models.d.ts.map +1 -0
  28. package/dist/utils/models.js +56 -0
  29. package/dist/utils/models.js.map +1 -0
  30. package/dist/utils/output.d.ts +133 -0
  31. package/dist/utils/output.d.ts.map +1 -0
  32. package/dist/utils/output.js +306 -0
  33. package/dist/utils/output.js.map +1 -0
  34. package/dist/utils/tool-filter.d.ts +35 -0
  35. package/dist/utils/tool-filter.d.ts.map +1 -0
  36. package/dist/utils/tool-filter.js +94 -0
  37. package/dist/utils/tool-filter.js.map +1 -0
  38. package/package.json +64 -0
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.OutputHandler = void 0;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const uuid_1 = require("uuid");
42
+ const process = __importStar(require("process"));
43
+ class OutputHandler {
44
+ format;
45
+ options;
46
+ sessionId = (0, uuid_1.v4)();
47
+ startTime = Date.now();
48
+ turnCount = 0;
49
+ finalResult = '';
50
+ totalUsage = {
51
+ input_tokens: 0,
52
+ output_tokens: 0,
53
+ server_tool_use: { web_search_requests: 0 }
54
+ };
55
+ constructor(format = 'text', options = {}) {
56
+ this.format = format;
57
+ this.options = options;
58
+ }
59
+ /**
60
+ * Initialize stream-json session
61
+ */
62
+ initializeSession(tools, mcpServers = [], model = '') {
63
+ if (this.format === 'stream-json') {
64
+ const init = {
65
+ type: 'system',
66
+ subtype: 'init',
67
+ cwd: this.options.cwd || process.cwd(),
68
+ session_id: this.sessionId,
69
+ tools,
70
+ mcp_servers: mcpServers,
71
+ model,
72
+ permissionMode: 'default',
73
+ slash_commands: [],
74
+ apiKeySource: 'environment',
75
+ output_style: 'default',
76
+ uuid: (0, uuid_1.v4)()
77
+ };
78
+ console.log(JSON.stringify(init));
79
+ }
80
+ }
81
+ /**
82
+ * Output a complete message
83
+ */
84
+ outputMessage(role, content, usage, toolCalls) {
85
+ this.turnCount++;
86
+ if (this.format === 'text') {
87
+ if (role === 'assistant') {
88
+ console.log(chalk_1.default.cyan('\nAssistant:'));
89
+ console.log(content);
90
+ }
91
+ else if (role === 'user') {
92
+ console.log(chalk_1.default.green('\nUser:'));
93
+ console.log(content);
94
+ }
95
+ }
96
+ else if (this.format === 'stream-json') {
97
+ // Text content message
98
+ const textMessage = {
99
+ type: role,
100
+ message: {
101
+ id: `msg_${(0, uuid_1.v4)().replace(/-/g, '')}`,
102
+ type: 'message',
103
+ role,
104
+ model: this.options.model,
105
+ content: [{
106
+ type: 'text',
107
+ text: content
108
+ }],
109
+ stop_reason: null,
110
+ stop_sequence: null,
111
+ usage: usage ? {
112
+ input_tokens: usage.prompt_tokens || 0,
113
+ cache_creation_input_tokens: 0,
114
+ cache_read_input_tokens: 0,
115
+ cache_creation: {
116
+ ephemeral_5m_input_tokens: 0,
117
+ ephemeral_1h_input_tokens: 0
118
+ },
119
+ output_tokens: usage.completion_tokens || 0,
120
+ service_tier: 'standard'
121
+ } : undefined
122
+ },
123
+ parent_tool_use_id: null,
124
+ session_id: this.sessionId,
125
+ uuid: (0, uuid_1.v4)()
126
+ };
127
+ console.log(JSON.stringify(textMessage));
128
+ // Track usage
129
+ if (usage) {
130
+ this.totalUsage.input_tokens += usage.prompt_tokens || 0;
131
+ this.totalUsage.output_tokens += usage.completion_tokens || 0;
132
+ }
133
+ // Store final result for summary
134
+ if (role === 'assistant') {
135
+ this.finalResult = content;
136
+ }
137
+ // Output tool calls as separate messages
138
+ if (toolCalls && toolCalls.length > 0) {
139
+ for (const toolCall of toolCalls) {
140
+ this.outputToolCallMessage(toolCall);
141
+ }
142
+ }
143
+ }
144
+ }
145
+ /**
146
+ * Output a tool call as a message
147
+ */
148
+ outputToolCallMessage(toolCall) {
149
+ const toolMessage = {
150
+ type: 'assistant',
151
+ message: {
152
+ id: `msg_${(0, uuid_1.v4)().replace(/-/g, '')}`,
153
+ type: 'message',
154
+ role: 'assistant',
155
+ model: this.options.model,
156
+ content: [{
157
+ type: 'tool_use',
158
+ id: toolCall.id || `toolu_${(0, uuid_1.v4)().replace(/-/g, '')}`,
159
+ name: toolCall.function.name,
160
+ input: JSON.parse(toolCall.function.arguments)
161
+ }],
162
+ stop_reason: null,
163
+ stop_sequence: null,
164
+ usage: {
165
+ input_tokens: 0,
166
+ output_tokens: 0,
167
+ service_tier: 'standard'
168
+ }
169
+ },
170
+ parent_tool_use_id: null,
171
+ session_id: this.sessionId,
172
+ uuid: (0, uuid_1.v4)()
173
+ };
174
+ console.log(JSON.stringify(toolMessage));
175
+ }
176
+ /**
177
+ * Output a tool call (legacy method for text format)
178
+ */
179
+ outputToolCall(toolName, args) {
180
+ if (this.format === 'text') {
181
+ console.log(chalk_1.default.magenta(`\n🔧 Calling tool: ${toolName}`));
182
+ console.log(chalk_1.default.gray(JSON.stringify(args, null, 2)));
183
+ }
184
+ // For stream-json, tool calls are handled in outputMessage
185
+ }
186
+ /**
187
+ * Output a tool result
188
+ */
189
+ outputToolResult(toolUseId, result) {
190
+ if (this.format === 'text') {
191
+ console.log(chalk_1.default.blue(`\n✅ Tool result:`));
192
+ if (typeof result === 'string') {
193
+ console.log(result);
194
+ }
195
+ else {
196
+ console.log(JSON.stringify(result, null, 2));
197
+ }
198
+ }
199
+ else if (this.format === 'stream-json') {
200
+ const resultMessage = {
201
+ type: 'user',
202
+ message: {
203
+ type: 'message',
204
+ role: 'user',
205
+ content: [{
206
+ type: 'tool_result',
207
+ tool_use_id: toolUseId,
208
+ content: typeof result === 'string' ? result : JSON.stringify(result)
209
+ }]
210
+ },
211
+ parent_tool_use_id: null,
212
+ session_id: this.sessionId,
213
+ uuid: (0, uuid_1.v4)()
214
+ };
215
+ console.log(JSON.stringify(resultMessage));
216
+ }
217
+ }
218
+ /**
219
+ * Output an error
220
+ */
221
+ outputError(error) {
222
+ const errorMessage = error instanceof Error ? error.message : error;
223
+ if (this.format === 'text') {
224
+ console.error(chalk_1.default.red('\n❌ Error:'), errorMessage);
225
+ }
226
+ else if (this.format === 'stream-json') {
227
+ const result = {
228
+ type: 'result',
229
+ subtype: 'error',
230
+ is_error: true,
231
+ duration_ms: Date.now() - this.startTime,
232
+ duration_api_ms: 0,
233
+ num_turns: this.turnCount,
234
+ result: errorMessage,
235
+ session_id: this.sessionId,
236
+ total_cost_usd: 0,
237
+ usage: this.totalUsage,
238
+ permission_denials: [],
239
+ uuid: (0, uuid_1.v4)()
240
+ };
241
+ console.log(JSON.stringify(result));
242
+ }
243
+ }
244
+ /**
245
+ * Output completion signal
246
+ */
247
+ outputComplete(usage, apiDuration = 0) {
248
+ if (this.format === 'text') {
249
+ if (usage) {
250
+ console.log(chalk_1.default.gray(`\n📊 Tokens: ${usage.total_tokens} (prompt: ${usage.prompt_tokens}, completion: ${usage.completion_tokens})`));
251
+ }
252
+ }
253
+ else if (this.format === 'stream-json') {
254
+ // Update final usage
255
+ if (usage) {
256
+ this.totalUsage.input_tokens = usage.prompt_tokens || 0;
257
+ this.totalUsage.output_tokens = usage.completion_tokens || 0;
258
+ }
259
+ const result = {
260
+ type: 'result',
261
+ subtype: 'success',
262
+ is_error: false,
263
+ duration_ms: Date.now() - this.startTime,
264
+ duration_api_ms: apiDuration,
265
+ num_turns: this.turnCount,
266
+ result: this.finalResult,
267
+ session_id: this.sessionId,
268
+ total_cost_usd: this.calculateCost(this.totalUsage),
269
+ usage: {
270
+ ...this.totalUsage,
271
+ service_tier: 'standard'
272
+ },
273
+ permission_denials: [],
274
+ uuid: (0, uuid_1.v4)()
275
+ };
276
+ console.log(JSON.stringify(result));
277
+ }
278
+ }
279
+ /**
280
+ * Start a spinner (only for text format)
281
+ */
282
+ startSpinner(message) {
283
+ if (this.format === 'text') {
284
+ const ora = require('ora');
285
+ return ora(message).start();
286
+ }
287
+ return null;
288
+ }
289
+ /**
290
+ * Calculate approximate cost (simplified)
291
+ */
292
+ calculateCost(usage) {
293
+ // Rough cost calculation - you may want to make this more accurate
294
+ const inputCost = (usage.input_tokens || 0) * 0.000003; // $3 per 1M tokens
295
+ const outputCost = (usage.output_tokens || 0) * 0.000015; // $15 per 1M tokens
296
+ return inputCost + outputCost;
297
+ }
298
+ /**
299
+ * Get session ID
300
+ */
301
+ getSessionId() {
302
+ return this.sessionId;
303
+ }
304
+ }
305
+ exports.OutputHandler = OutputHandler;
306
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Tool filtering utilities with wildcard and pattern support
3
+ */
4
+ export interface ToolPattern {
5
+ pattern: string;
6
+ regex: RegExp;
7
+ }
8
+ /**
9
+ * Parse tool patterns from a string (comma or space separated)
10
+ * Supports wildcards (*) and specific patterns like "Bash(git:*)"
11
+ */
12
+ export declare function parseToolPatterns(input: string | undefined): ToolPattern[];
13
+ /**
14
+ * Check if a tool name matches any of the patterns
15
+ */
16
+ export declare function matchesPattern(toolName: string, patterns: ToolPattern[]): boolean;
17
+ /**
18
+ * Filter tool list based on allowed and disallowed patterns
19
+ * Disallowed patterns take precedence over allowed patterns
20
+ */
21
+ export declare function filterTools(tools: string[], allowedPatterns: ToolPattern[], disallowedPatterns: ToolPattern[]): string[];
22
+ /**
23
+ * Create a tool filter function for use in tool registries
24
+ */
25
+ export declare function createToolFilter(allowedInput?: string, disallowedInput?: string): (toolName: string) => boolean;
26
+ /**
27
+ * Examples of supported patterns:
28
+ * - "mcp__*" - All MCP tools
29
+ * - "mcp__filesystem__*" - All filesystem MCP tools
30
+ * - "Bash" - Exact match for Bash tool
31
+ * - "Bash(git:*)" - Bash tool with git commands (if supported by tool)
32
+ * - "Edit,Read" - Multiple specific tools
33
+ * - "mcp__* Edit Read" - Mix of wildcards and specific tools
34
+ */
35
+ //# sourceMappingURL=tool-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-filter.d.ts","sourceRoot":"","sources":["../../src/utils/tool-filter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,EAAE,CA4B1E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAIjF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EAAE,EACf,eAAe,EAAE,WAAW,EAAE,EAC9B,kBAAkB,EAAE,WAAW,EAAE,GAChC,MAAM,EAAE,CAeV;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,GACvB,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAkB/B;AAED;;;;;;;;GAQG"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * Tool filtering utilities with wildcard and pattern support
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseToolPatterns = parseToolPatterns;
7
+ exports.matchesPattern = matchesPattern;
8
+ exports.filterTools = filterTools;
9
+ exports.createToolFilter = createToolFilter;
10
+ /**
11
+ * Parse tool patterns from a string (comma or space separated)
12
+ * Supports wildcards (*) and specific patterns like "Bash(git:*)"
13
+ */
14
+ function parseToolPatterns(input) {
15
+ if (!input)
16
+ return [];
17
+ // Split by comma or space, filter empty strings
18
+ const patterns = input
19
+ .split(/[,\s]+/)
20
+ .map(p => p.trim())
21
+ .filter(p => p.length > 0);
22
+ return patterns.map(pattern => {
23
+ // Convert pattern to regex
24
+ let regexPattern = pattern
25
+ // Escape special regex characters except * and ()
26
+ .replace(/[.+?^${}|[\]\\]/g, '\\$&')
27
+ // Convert * to .* for wildcard matching
28
+ .replace(/\*/g, '.*')
29
+ // Handle parentheses patterns like Bash(git:*)
30
+ .replace(/\(/g, '\\(')
31
+ .replace(/\)/g, '\\)');
32
+ // Ensure exact match (not partial)
33
+ regexPattern = `^${regexPattern}$`;
34
+ return {
35
+ pattern,
36
+ regex: new RegExp(regexPattern, 'i')
37
+ };
38
+ });
39
+ }
40
+ /**
41
+ * Check if a tool name matches any of the patterns
42
+ */
43
+ function matchesPattern(toolName, patterns) {
44
+ if (patterns.length === 0)
45
+ return false;
46
+ return patterns.some(p => p.regex.test(toolName));
47
+ }
48
+ /**
49
+ * Filter tool list based on allowed and disallowed patterns
50
+ * Disallowed patterns take precedence over allowed patterns
51
+ */
52
+ function filterTools(tools, allowedPatterns, disallowedPatterns) {
53
+ return tools.filter(tool => {
54
+ // If disallowed, reject immediately
55
+ if (matchesPattern(tool, disallowedPatterns)) {
56
+ return false;
57
+ }
58
+ // If no allowed patterns specified, allow all (except disallowed)
59
+ if (allowedPatterns.length === 0) {
60
+ return true;
61
+ }
62
+ // Check if matches allowed patterns
63
+ return matchesPattern(tool, allowedPatterns);
64
+ });
65
+ }
66
+ /**
67
+ * Create a tool filter function for use in tool registries
68
+ */
69
+ function createToolFilter(allowedInput, disallowedInput) {
70
+ const allowedPatterns = parseToolPatterns(allowedInput);
71
+ const disallowedPatterns = parseToolPatterns(disallowedInput);
72
+ return (toolName) => {
73
+ // Disallowed takes precedence
74
+ if (matchesPattern(toolName, disallowedPatterns)) {
75
+ return false;
76
+ }
77
+ // If no allowed patterns, allow all (except disallowed)
78
+ if (allowedPatterns.length === 0) {
79
+ return true;
80
+ }
81
+ // Must match at least one allowed pattern
82
+ return matchesPattern(toolName, allowedPatterns);
83
+ };
84
+ }
85
+ /**
86
+ * Examples of supported patterns:
87
+ * - "mcp__*" - All MCP tools
88
+ * - "mcp__filesystem__*" - All filesystem MCP tools
89
+ * - "Bash" - Exact match for Bash tool
90
+ * - "Bash(git:*)" - Bash tool with git commands (if supported by tool)
91
+ * - "Edit,Read" - Multiple specific tools
92
+ * - "mcp__* Edit Read" - Mix of wildcards and specific tools
93
+ */
94
+ //# sourceMappingURL=tool-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-filter.js","sourceRoot":"","sources":["../../src/utils/tool-filter.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAWH,8CA4BC;AAKD,wCAIC;AAMD,kCAmBC;AAKD,4CAqBC;AA5FD;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,KAAyB;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,gDAAgD;IAChD,MAAM,QAAQ,GAAG,KAAK;SACnB,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE7B,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QAC5B,2BAA2B;QAC3B,IAAI,YAAY,GAAG,OAAO;YACxB,kDAAkD;aACjD,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC;YACpC,wCAAwC;aACvC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;YACrB,+CAA+C;aAC9C,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEzB,mCAAmC;QACnC,YAAY,GAAG,IAAI,YAAY,GAAG,CAAC;QAEnC,OAAO;YACL,OAAO;YACP,KAAK,EAAE,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC;SACrC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,QAAgB,EAAE,QAAuB;IACtE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,SAAgB,WAAW,CACzB,KAAe,EACf,eAA8B,EAC9B,kBAAiC;IAEjC,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACzB,oCAAoC;QACpC,IAAI,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,kEAAkE;QAClE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,oCAAoC;QACpC,OAAO,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAC9B,YAAqB,EACrB,eAAwB;IAExB,MAAM,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAE9D,OAAO,CAAC,QAAgB,EAAE,EAAE;QAC1B,8BAA8B;QAC9B,IAAI,cAAc,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wDAAwD;QACxD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0CAA0C;QAC1C,OAAO,cAAc,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@majkapp/majk-chat-cli",
3
+ "version": "1.0.0",
4
+ "description": "CLI for multi-provider LLM chat interactions",
5
+ "main": "dist/cli.js",
6
+ "bin": {
7
+ "majk-chat": "./dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist/**/*",
11
+ "README.md",
12
+ "package.json"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "ts-node src/cli.ts",
17
+ "test": "jest",
18
+ "clean": "rm -rf dist",
19
+ "prepare": "echo 'Skipping build in prepare - use npm run build from root'"
20
+ },
21
+ "keywords": [
22
+ "cli",
23
+ "llm",
24
+ "chat",
25
+ "openai",
26
+ "anthropic",
27
+ "bedrock",
28
+ "azure"
29
+ ],
30
+ "author": "Jules White",
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "@majkapp/majk-chat-core": "file:../majk-chat-core",
34
+ "@majkapp/majk-chat-mcp": "file:../majk-chat-mcp",
35
+ "@majkapp/majk-chat-basic-tools": "file:../majk-chat-basic-tools",
36
+ "@majkapp/majk-chat-sessions": "file:../majk-chat-sessions",
37
+ "chalk": "^4.1.2",
38
+ "commander": "^12.0.0",
39
+ "dotenv": "^16.4.0",
40
+ "fs-extra": "^11.2.0",
41
+ "inquirer": "^8.2.7",
42
+ "ora": "^5.4.1",
43
+ "readline": "^1.3.0",
44
+ "uuid": "^9.0.1",
45
+ "yaml": "^2.4.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/fs-extra": "^11.0.0",
49
+ "@types/inquirer": "^9.0.0",
50
+ "@types/jest": "^30.0.0",
51
+ "@types/node": "^20.14.0",
52
+ "@types/uuid": "^9.0.7",
53
+ "jest": "^29.7.0",
54
+ "ts-jest": "^29.1.5",
55
+ "ts-node": "^10.9.2",
56
+ "typescript": "^5.5.0"
57
+ },
58
+ "engines": {
59
+ "node": ">=18.0.0"
60
+ },
61
+ "publishConfig": {
62
+ "access": "public"
63
+ }
64
+ }