matex-cli 1.1.2 → 1.1.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,WAAW,SA6FlB,CAAC"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,WAAW,SAuJlB,CAAC"}
@@ -1,4 +1,37 @@
1
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
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -13,6 +46,7 @@ const spinner_1 = require("../utils/spinner");
13
46
  exports.chatCommand = new commander_1.Command('chat')
14
47
  .description('Start an interactive chat session with MATEX AI')
15
48
  .option('-m, --model <model>', 'AI model to use (matexcodex, matexai, elite, matexspirit)', config_1.configManager.getDefaultModel())
49
+ .option('-x, --execute', 'Auto-prompt for command execution')
16
50
  .action(async (options) => {
17
51
  try {
18
52
  // Check for API key
@@ -27,9 +61,32 @@ exports.chatCommand = new commander_1.Command('chat')
27
61
  // Welcome message
28
62
  console.log(chalk_1.default.bold.cyan('\nšŸ¤– MATEX AI Interactive Chat'));
29
63
  console.log(chalk_1.default.gray(`Model: ${options.model}`));
64
+ if (!options.execute) {
65
+ console.log(chalk_1.default.yellow('šŸ’” Tip: Run with --execute to enable auto-fix & shell commands'));
66
+ }
30
67
  console.log(chalk_1.default.gray('Type "exit" or "quit" to end the session\n'));
31
- // Conversation history
32
- const messages = [];
68
+ // Get current directory context
69
+ const fs = require('fs');
70
+ let files = '';
71
+ try {
72
+ files = fs.readdirSync(process.cwd()).slice(0, 20).join(', ');
73
+ }
74
+ catch (e) { }
75
+ // Conversation history with System Prompt
76
+ const messages = [
77
+ {
78
+ role: 'system',
79
+ content: `You are MATEX AI.
80
+ 1. **STYLE RULES:**
81
+ - Use clean, professional, conversational text (Claude-style).
82
+ - **NO MARKDOWN formatting** (no **bold**, headers, etc). Use plain text.
83
+ - Use markdown ONLY for code blocks.
84
+ - Be concise.
85
+ 2. **CONTEXT:**
86
+ - Current files: ${files}
87
+ - If useful, you can execute shell commands by wrapping them in code blocks.`
88
+ }
89
+ ];
33
90
  // Chat loop
34
91
  while (true) {
35
92
  // Get user input
@@ -52,38 +109,74 @@ exports.chatCommand = new commander_1.Command('chat')
52
109
  }
53
110
  // Add user message to history
54
111
  messages.push({ role: 'user', content: userMessage });
55
- // Show thinking indicator
56
- spinner_1.spinner.start('Thinking...');
57
- try {
58
- // Send request
59
- const response = await client.chat({
60
- messages: messages,
61
- model: options.model,
62
- temperature: 0.7,
63
- max_tokens: 4000,
64
- stream: false,
65
- });
66
- spinner_1.spinner.stop();
67
- // Add assistant response to history
68
- messages.push({ role: 'assistant', content: response });
69
- // Display response
70
- console.log(chalk_1.default.cyan('AI:'), chalk_1.default.white(response));
71
- console.log();
72
- }
73
- catch (error) {
74
- spinner_1.spinner.fail('Request failed');
75
- if (error.message.includes('403')) {
76
- console.error(chalk_1.default.red('āŒ Invalid or revoked API key.'));
77
- break;
78
- }
79
- else if (error.message.includes('429')) {
80
- console.error(chalk_1.default.red('āŒ Rate limit exceeded. Please wait a moment.'));
112
+ // Agentic Loop
113
+ let loopCount = 0;
114
+ const MAX_LOOPS = 5;
115
+ while (loopCount < MAX_LOOPS) {
116
+ loopCount++;
117
+ if (loopCount > 1) {
118
+ spinner_1.spinner.start('Analyzing result & Validating...');
81
119
  }
82
120
  else {
83
- console.error(chalk_1.default.red(`āŒ Error: ${error.message}`));
121
+ spinner_1.spinner.start('Thinking...');
122
+ }
123
+ try {
124
+ const response = await client.chat({
125
+ messages: messages,
126
+ model: options.model,
127
+ temperature: 0.7,
128
+ max_tokens: 4000,
129
+ stream: false,
130
+ });
131
+ spinner_1.spinner.stop();
132
+ // Add assistant response to history
133
+ messages.push({ role: 'assistant', content: response });
134
+ // Display response
135
+ console.log(chalk_1.default.cyan(loopCount > 1 ? `AI (Auto-Fix Attempt ${loopCount - 1}):` : 'AI:'), chalk_1.default.white(response));
136
+ console.log();
137
+ // Execute commands if requested
138
+ if (options.execute) {
139
+ const { executeWithPermission } = await Promise.resolve().then(() => __importStar(require('../utils/command-executor')));
140
+ const result = await executeWithPermission(response);
141
+ if (result.executed) {
142
+ if (result.success) {
143
+ if (loopCount > 1) {
144
+ console.log(chalk_1.default.green('āœ… Fix succeeded!'));
145
+ }
146
+ break;
147
+ }
148
+ else {
149
+ console.log(chalk_1.default.yellow('\n↺ Command failed. Asking AI to fix...'));
150
+ messages.push({
151
+ role: 'user',
152
+ content: `āŒ Command failed with error:\n${result.error}\n\nPlease fix this. If the file doesn't exist, create it first.`
153
+ });
154
+ continue;
155
+ }
156
+ }
157
+ else {
158
+ break;
159
+ }
160
+ }
161
+ else {
162
+ break;
163
+ }
164
+ }
165
+ catch (error) {
166
+ spinner_1.spinner.fail('Request failed');
167
+ if (error.message.includes('403')) {
168
+ console.error(chalk_1.default.red('āŒ Invalid or revoked API key.'));
169
+ process.exit(1);
170
+ }
171
+ else if (error.message.includes('429')) {
172
+ console.error(chalk_1.default.red('āŒ Rate limit exceeded. Please wait a moment.'));
173
+ }
174
+ else {
175
+ console.error(chalk_1.default.red(`āŒ Error: ${error.message}`));
176
+ }
177
+ messages.pop(); // Remove failed user message
178
+ break;
84
179
  }
85
- // Remove failed message from history
86
- messages.pop();
87
180
  }
88
181
  }
89
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,UAAU,SAoGjB,CAAC"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,UAAU,SAsJjB,CAAC"}
@@ -1,4 +1,37 @@
1
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
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -10,7 +43,6 @@ const inquirer_1 = __importDefault(require("inquirer"));
10
43
  const config_1 = require("../utils/config");
11
44
  const client_1 = require("../api/client");
12
45
  const spinner_1 = require("../utils/spinner");
13
- const command_executor_1 = require("../utils/command-executor");
14
46
  exports.devCommand = new commander_1.Command('dev')
15
47
  .description('Start interactive development session with MATEXCodex')
16
48
  .option('-m, --model <model>', 'AI model to use', 'matexcodex')
@@ -30,12 +62,22 @@ exports.devCommand = new commander_1.Command('dev')
30
62
  console.log(chalk_1.default.cyan.bold('\nšŸš€ MATEX Development Session'));
31
63
  console.log(chalk_1.default.gray('━'.repeat(50)));
32
64
  console.log(chalk_1.default.white(`Model: ${chalk_1.default.cyan(options.model)}`));
65
+ if (!options.execute) {
66
+ console.log(chalk_1.default.yellow('šŸ’” Tip: Run with --execute to enable auto-fix & shell commands'));
67
+ }
33
68
  console.log(chalk_1.default.gray('Type your requests, or "exit" to quit\n'));
34
69
  // Conversation history
35
70
  const messages = [
36
71
  {
37
72
  role: 'system',
38
- content: 'You are MATEXCodex, an expert software development assistant. Help the user build their application step by step. Provide complete, production-ready code with explanations. Be concise but thorough.'
73
+ content: `You are MATEXCodex, an expert software development assistant.
74
+ 1. Help the user build their application step by step.
75
+ 2. **STYLE RULES:**
76
+ - Use clean, professional, conversational text (Claude-style).
77
+ - **NO MARKDOWN formatting** in your text (no **bold**, no # headers, no --- rules).
78
+ - ONLY use markdown for code blocks.
79
+ - Be concise but thorough.
80
+ 3. Provide complete, production-ready code.`
39
81
  }
40
82
  ];
41
83
  // Interactive loop
@@ -62,33 +104,75 @@ exports.devCommand = new commander_1.Command('dev')
62
104
  // Add user message to history
63
105
  messages.push({ role: 'user', content: userInput });
64
106
  // Show thinking indicator
65
- spinner_1.spinner.start('Thinking...');
66
- try {
67
- // Send request
68
- const response = await client.chat({
69
- messages,
70
- model: options.model,
71
- temperature: 0.3,
72
- max_tokens: 8000,
73
- stream: false,
74
- });
75
- spinner_1.spinner.stop();
76
- // Add assistant response to history
77
- messages.push({ role: 'assistant', content: response });
78
- // Display response
79
- console.log(chalk_1.default.green('\nMATEXCodex:'));
80
- console.log(chalk_1.default.white(response));
81
- console.log();
82
- // Execute commands if requested
83
- if (options.execute) {
84
- await (0, command_executor_1.executeWithPermission)(response);
107
+ // Agentic Loop
108
+ let loopCount = 0;
109
+ const MAX_LOOPS = 5;
110
+ let currentPrompt = userInput;
111
+ while (loopCount < MAX_LOOPS) {
112
+ loopCount++;
113
+ if (loopCount > 1) {
114
+ spinner_1.spinner.start('Analyzing result & Validating...');
115
+ }
116
+ else {
117
+ spinner_1.spinner.start('Thinking...');
118
+ }
119
+ try {
120
+ // Send request
121
+ const response = await client.chat({
122
+ messages,
123
+ model: options.model,
124
+ temperature: 0.3,
125
+ max_tokens: 8000,
126
+ stream: false,
127
+ });
128
+ spinner_1.spinner.stop();
129
+ // Add assistant response to history ONLY if it's the first loop or a fix
130
+ // We don't want to clutter history with failed attempts unless necessary for context?
131
+ // Actually, maintaining history of failures is good for context.
132
+ messages.push({ role: 'assistant', content: response });
133
+ // Display response
134
+ console.log(chalk_1.default.green(`\nMATEXCodex${loopCount > 1 ? ` (Auto-Fix Attempt ${loopCount - 1})` : ''}:`));
135
+ console.log(chalk_1.default.white(response));
136
+ console.log();
137
+ // Execute commands if requested (or default to true for "seamless" experience?
138
+ // User asked for "seamless", but prompt still asks permission.
139
+ // We'll keep permission for safety but loop on failure.)
140
+ if (options.execute) {
141
+ const { executeWithPermission } = await Promise.resolve().then(() => __importStar(require('../utils/command-executor')));
142
+ const result = await executeWithPermission(response);
143
+ if (result.executed) {
144
+ if (result.success) {
145
+ if (loopCount > 1) {
146
+ console.log(chalk_1.default.green('āœ… Fix succeeded!'));
147
+ }
148
+ break; // Success, exit loop and wait for next user input
149
+ }
150
+ else {
151
+ // Failure - Loop back
152
+ console.log(chalk_1.default.yellow('\n↺ Command failed. Asking AI to fix...'));
153
+ // Add error to history
154
+ messages.push({
155
+ role: 'user',
156
+ content: `āŒ Command failed with error:\n${result.error}\n\nPlease fix this. If the file doesn't exist, create it first. Or use a different command.`
157
+ });
158
+ // Continue loop
159
+ continue;
160
+ }
161
+ }
162
+ else {
163
+ break; // No commands to execute
164
+ }
165
+ }
166
+ else {
167
+ break; // Execution not enabled
168
+ }
169
+ }
170
+ catch (error) {
171
+ spinner_1.spinner.fail('Request failed');
172
+ console.error(chalk_1.default.red(`Error: ${error.message}\n`));
173
+ messages.pop(); // Remove failed user message if request failed entirely
174
+ break;
85
175
  }
86
- }
87
- catch (error) {
88
- spinner_1.spinner.fail('Request failed');
89
- console.error(chalk_1.default.red(`Error: ${error.message}\n`));
90
- // Remove the failed user message
91
- messages.pop();
92
176
  }
93
177
  }
94
178
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matex-cli",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "Official CLI tool for MATEX AI - Access powerful AI models from your terminal",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -8,6 +8,7 @@ import { spinner } from '../utils/spinner';
8
8
  export const chatCommand = new Command('chat')
9
9
  .description('Start an interactive chat session with MATEX AI')
10
10
  .option('-m, --model <model>', 'AI model to use (matexcodex, matexai, elite, matexspirit)', configManager.getDefaultModel())
11
+ .option('-x, --execute', 'Auto-prompt for command execution')
11
12
  .action(async (options: any) => {
12
13
  try {
13
14
  // Check for API key
@@ -24,10 +25,33 @@ export const chatCommand = new Command('chat')
24
25
  // Welcome message
25
26
  console.log(chalk.bold.cyan('\nšŸ¤– MATEX AI Interactive Chat'));
26
27
  console.log(chalk.gray(`Model: ${options.model}`));
28
+ if (!options.execute) {
29
+ console.log(chalk.yellow('šŸ’” Tip: Run with --execute to enable auto-fix & shell commands'));
30
+ }
27
31
  console.log(chalk.gray('Type "exit" or "quit" to end the session\n'));
28
32
 
29
- // Conversation history
30
- const messages: ChatMessage[] = [];
33
+ // Get current directory context
34
+ const fs = require('fs');
35
+ let files = '';
36
+ try {
37
+ files = fs.readdirSync(process.cwd()).slice(0, 20).join(', ');
38
+ } catch (e) { }
39
+
40
+ // Conversation history with System Prompt
41
+ const messages: ChatMessage[] = [
42
+ {
43
+ role: 'system',
44
+ content: `You are MATEX AI.
45
+ 1. **STYLE RULES:**
46
+ - Use clean, professional, conversational text (Claude-style).
47
+ - **NO MARKDOWN formatting** (no **bold**, headers, etc). Use plain text.
48
+ - Use markdown ONLY for code blocks.
49
+ - Be concise.
50
+ 2. **CONTEXT:**
51
+ - Current files: ${files}
52
+ - If useful, you can execute shell commands by wrapping them in code blocks.`
53
+ }
54
+ ];
31
55
 
32
56
  // Chat loop
33
57
  while (true) {
@@ -55,42 +79,76 @@ export const chatCommand = new Command('chat')
55
79
  // Add user message to history
56
80
  messages.push({ role: 'user', content: userMessage });
57
81
 
58
- // Show thinking indicator
59
- spinner.start('Thinking...');
60
-
61
- try {
62
- // Send request
63
- const response = await client.chat({
64
- messages: messages,
65
- model: options.model,
66
- temperature: 0.7,
67
- max_tokens: 4000,
68
- stream: false,
69
- });
70
-
71
- spinner.stop();
72
-
73
- // Add assistant response to history
74
- messages.push({ role: 'assistant', content: response });
82
+ // Agentic Loop
83
+ let loopCount = 0;
84
+ const MAX_LOOPS = 5;
75
85
 
76
- // Display response
77
- console.log(chalk.cyan('AI:'), chalk.white(response));
78
- console.log();
86
+ while (loopCount < MAX_LOOPS) {
87
+ loopCount++;
79
88
 
80
- } catch (error: any) {
81
- spinner.fail('Request failed');
82
-
83
- if (error.message.includes('403')) {
84
- console.error(chalk.red('āŒ Invalid or revoked API key.'));
85
- break;
86
- } else if (error.message.includes('429')) {
87
- console.error(chalk.red('āŒ Rate limit exceeded. Please wait a moment.'));
89
+ if (loopCount > 1) {
90
+ spinner.start('Analyzing result & Validating...');
88
91
  } else {
89
- console.error(chalk.red(`āŒ Error: ${error.message}`));
92
+ spinner.start('Thinking...');
90
93
  }
91
94
 
92
- // Remove failed message from history
93
- messages.pop();
95
+ try {
96
+ const response = await client.chat({
97
+ messages: messages,
98
+ model: options.model,
99
+ temperature: 0.7,
100
+ max_tokens: 4000,
101
+ stream: false,
102
+ });
103
+
104
+ spinner.stop();
105
+
106
+ // Add assistant response to history
107
+ messages.push({ role: 'assistant', content: response });
108
+
109
+ // Display response
110
+ console.log(chalk.cyan(loopCount > 1 ? `AI (Auto-Fix Attempt ${loopCount - 1}):` : 'AI:'), chalk.white(response));
111
+ console.log();
112
+
113
+ // Execute commands if requested
114
+ if (options.execute) {
115
+ const { executeWithPermission } = await import('../utils/command-executor');
116
+ const result = await executeWithPermission(response);
117
+
118
+ if (result.executed) {
119
+ if (result.success) {
120
+ if (loopCount > 1) {
121
+ console.log(chalk.green('āœ… Fix succeeded!'));
122
+ }
123
+ break;
124
+ } else {
125
+ console.log(chalk.yellow('\n↺ Command failed. Asking AI to fix...'));
126
+ messages.push({
127
+ role: 'user',
128
+ content: `āŒ Command failed with error:\n${result.error}\n\nPlease fix this. If the file doesn't exist, create it first.`
129
+ });
130
+ continue;
131
+ }
132
+ } else {
133
+ break;
134
+ }
135
+ } else {
136
+ break;
137
+ }
138
+
139
+ } catch (error: any) {
140
+ spinner.fail('Request failed');
141
+ if (error.message.includes('403')) {
142
+ console.error(chalk.red('āŒ Invalid or revoked API key.'));
143
+ process.exit(1);
144
+ } else if (error.message.includes('429')) {
145
+ console.error(chalk.red('āŒ Rate limit exceeded. Please wait a moment.'));
146
+ } else {
147
+ console.error(chalk.red(`āŒ Error: ${error.message}`));
148
+ }
149
+ messages.pop(); // Remove failed user message
150
+ break;
151
+ }
94
152
  }
95
153
  }
96
154
 
@@ -27,13 +27,23 @@ export const devCommand = new Command('dev')
27
27
  console.log(chalk.cyan.bold('\nšŸš€ MATEX Development Session'));
28
28
  console.log(chalk.gray('━'.repeat(50)));
29
29
  console.log(chalk.white(`Model: ${chalk.cyan(options.model)}`));
30
+ if (!options.execute) {
31
+ console.log(chalk.yellow('šŸ’” Tip: Run with --execute to enable auto-fix & shell commands'));
32
+ }
30
33
  console.log(chalk.gray('Type your requests, or "exit" to quit\n'));
31
34
 
32
35
  // Conversation history
33
36
  const messages: ChatMessage[] = [
34
37
  {
35
38
  role: 'system',
36
- content: 'You are MATEXCodex, an expert software development assistant. Help the user build their application step by step. Provide complete, production-ready code with explanations. Be concise but thorough.'
39
+ content: `You are MATEXCodex, an expert software development assistant.
40
+ 1. Help the user build their application step by step.
41
+ 2. **STYLE RULES:**
42
+ - Use clean, professional, conversational text (Claude-style).
43
+ - **NO MARKDOWN formatting** in your text (no **bold**, no # headers, no --- rules).
44
+ - ONLY use markdown for code blocks.
45
+ - Be concise but thorough.
46
+ 3. Provide complete, production-ready code.`
37
47
  }
38
48
  ];
39
49
 
@@ -66,39 +76,79 @@ export const devCommand = new Command('dev')
66
76
  messages.push({ role: 'user', content: userInput });
67
77
 
68
78
  // Show thinking indicator
69
- spinner.start('Thinking...');
70
-
71
- try {
72
- // Send request
73
- const response = await client.chat({
74
- messages,
75
- model: options.model,
76
- temperature: 0.3,
77
- max_tokens: 8000,
78
- stream: false,
79
- });
80
-
81
- spinner.stop();
82
-
83
- // Add assistant response to history
84
- messages.push({ role: 'assistant', content: response });
85
-
86
- // Display response
87
- console.log(chalk.green('\nMATEXCodex:'));
88
- console.log(chalk.white(response));
89
- console.log();
90
-
91
- // Execute commands if requested
92
- if (options.execute) {
93
- await executeWithPermission(response);
79
+ // Agentic Loop
80
+ let loopCount = 0;
81
+ const MAX_LOOPS = 5;
82
+ let currentPrompt = userInput;
83
+
84
+ while (loopCount < MAX_LOOPS) {
85
+ loopCount++;
86
+
87
+ if (loopCount > 1) {
88
+ spinner.start('Analyzing result & Validating...');
89
+ } else {
90
+ spinner.start('Thinking...');
94
91
  }
95
92
 
96
- } catch (error: any) {
97
- spinner.fail('Request failed');
98
- console.error(chalk.red(`Error: ${error.message}\n`));
99
-
100
- // Remove the failed user message
101
- messages.pop();
93
+ try {
94
+ // Send request
95
+ const response = await client.chat({
96
+ messages,
97
+ model: options.model,
98
+ temperature: 0.3,
99
+ max_tokens: 8000,
100
+ stream: false,
101
+ });
102
+
103
+ spinner.stop();
104
+
105
+ // Add assistant response to history ONLY if it's the first loop or a fix
106
+ // We don't want to clutter history with failed attempts unless necessary for context?
107
+ // Actually, maintaining history of failures is good for context.
108
+ messages.push({ role: 'assistant', content: response });
109
+
110
+ // Display response
111
+ console.log(chalk.green(`\nMATEXCodex${loopCount > 1 ? ` (Auto-Fix Attempt ${loopCount - 1})` : ''}:`));
112
+ console.log(chalk.white(response));
113
+ console.log();
114
+
115
+ // Execute commands if requested (or default to true for "seamless" experience?
116
+ // User asked for "seamless", but prompt still asks permission.
117
+ // We'll keep permission for safety but loop on failure.)
118
+ if (options.execute) {
119
+ const { executeWithPermission } = await import('../utils/command-executor');
120
+ const result = await executeWithPermission(response);
121
+
122
+ if (result.executed) {
123
+ if (result.success) {
124
+ if (loopCount > 1) {
125
+ console.log(chalk.green('āœ… Fix succeeded!'));
126
+ }
127
+ break; // Success, exit loop and wait for next user input
128
+ } else {
129
+ // Failure - Loop back
130
+ console.log(chalk.yellow('\n↺ Command failed. Asking AI to fix...'));
131
+
132
+ // Add error to history
133
+ messages.push({
134
+ role: 'user',
135
+ content: `āŒ Command failed with error:\n${result.error}\n\nPlease fix this. If the file doesn't exist, create it first. Or use a different command.`
136
+ });
137
+ // Continue loop
138
+ continue;
139
+ }
140
+ } else {
141
+ break; // No commands to execute
142
+ }
143
+ } else {
144
+ break; // Execution not enabled
145
+ }
146
+ } catch (error: any) {
147
+ spinner.fail('Request failed');
148
+ console.error(chalk.red(`Error: ${error.message}\n`));
149
+ messages.pop(); // Remove failed user message if request failed entirely
150
+ break;
151
+ }
102
152
  }
103
153
  }
104
154