matex-cli 1.2.14 → 1.2.16
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/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +6 -2
- package/dist/api/client.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +56 -36
- package/dist/commands/dev.js.map +1 -1
- package/dist/utils/command-executor.d.ts.map +1 -1
- package/dist/utils/command-executor.js +37 -6
- package/dist/utils/command-executor.js.map +1 -1
- package/dist/utils/patcher.d.ts +15 -0
- package/dist/utils/patcher.d.ts.map +1 -1
- package/dist/utils/patcher.js +63 -22
- package/dist/utils/patcher.js.map +1 -1
- package/dist/utils/tui.d.ts +5 -1
- package/dist/utils/tui.d.ts.map +1 -1
- package/dist/utils/tui.js +29 -7
- package/dist/utils/tui.js.map +1 -1
- package/package.json +1 -1
- package/src/api/client.ts +6 -2
- package/src/commands/dev.ts +53 -35
- package/src/utils/command-executor.ts +43 -6
- package/src/utils/patcher.ts +70 -24
- package/src/utils/tui.ts +33 -8
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAmE;IAcxG;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAmE;IAcxG;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IA4DzF;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBjD;;OAEG;YACW,uBAAuB;IA+BrC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IAKjC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAY3C"}
|
package/dist/api/client.js
CHANGED
|
@@ -65,8 +65,12 @@ class MatexAPIClient {
|
|
|
65
65
|
}
|
|
66
66
|
catch (error) {
|
|
67
67
|
if (error.response) {
|
|
68
|
-
//
|
|
69
|
-
|
|
68
|
+
// Try to extract detail from data if possible (standard FastAPI error format)
|
|
69
|
+
let detail = error.response.statusText;
|
|
70
|
+
if (error.response.data && error.response.data.detail) {
|
|
71
|
+
detail = error.response.data.detail;
|
|
72
|
+
}
|
|
73
|
+
throw new Error(`API Error: ${detail}`);
|
|
70
74
|
}
|
|
71
75
|
else {
|
|
72
76
|
throw new Error(`Request failed: ${error.message}`);
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAe7C,MAAa,cAAc;IAKvB,YAAY,MAAc,EAAE,UAAkB,0DAA0D;QACpG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE;gBACL,WAAW,EAAE,IAAI,CAAC,MAAM;gBACxB,cAAc,EAAE,kBAAkB;aACrC;YACD,OAAO,EAAE,KAAK,EAAE,aAAa;SAChC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,OAAoB,EAAE,OAAgC;QACnE,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;gBACpD,GAAG,OAAO;gBACV,GAAG,EAAE,UAAU;aAClB,EAAE;gBACC,YAAY,EAAE,QAAQ;aACzB,CAAC,CAAC;YAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACnC,IAAI,YAAY,GAAG,EAAE,CAAC;gBACtB,IAAI,MAAM,GAAG,EAAE,CAAC;gBAEhB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBACvC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAE3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,gCAAgC;oBAE5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;wBAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;4BAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;4BAC5C,IAAI,OAAO,KAAK,QAAQ;gCAAE,SAAS;4BAEnC,IAAI,CAAC;gCACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gCACnC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oCACjB,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC;oCAC/B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gCAC5B,CAAC;4BACL,CAAC;4BAAC,OAAO,CAAC,EAAE,CAAC;gCACT,+BAA+B;4BACnC,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBACzB,OAAO,CAAC,YAAY,CAAC,CAAC;gBAC1B,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;oBACrC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjB,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.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;AAUpC,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,UAAU,SAiQjB,CAAC"}
|
package/dist/commands/dev.js
CHANGED
|
@@ -145,23 +145,25 @@ ${repoMap}`
|
|
|
145
145
|
const MAX_LOOPS = 10;
|
|
146
146
|
while (loopCount < MAX_LOOPS) {
|
|
147
147
|
loopCount++;
|
|
148
|
-
if (loopCount > 1) {
|
|
149
|
-
spinner_1.spinner.start('Analyzing result & Validating...');
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
spinner_1.spinner.start('Thinking...');
|
|
153
|
-
}
|
|
154
148
|
try {
|
|
149
|
+
if (loopCount > 1) {
|
|
150
|
+
spinner_1.spinner.start('Analyzing result & Validating...');
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
spinner_1.spinner.start('Thinking...');
|
|
154
|
+
}
|
|
155
155
|
let fullResponse = '';
|
|
156
156
|
let buffer = '';
|
|
157
157
|
let hasStarted = false;
|
|
158
158
|
let inCodeBlock = false;
|
|
159
|
-
let
|
|
159
|
+
let codeBuffer = '';
|
|
160
|
+
let codeLang = 'bash';
|
|
161
|
+
let lastRole = '';
|
|
160
162
|
tui_1.TUI.drawStatusBar('Swarm is processing...');
|
|
161
163
|
await client.chatStream({
|
|
162
164
|
messages,
|
|
163
|
-
model: options.model,
|
|
164
|
-
temperature: 0.3,
|
|
165
|
+
model: options.model,
|
|
166
|
+
temperature: 0.3,
|
|
165
167
|
max_tokens: 8000,
|
|
166
168
|
}, (chunk) => {
|
|
167
169
|
if (!hasStarted) {
|
|
@@ -169,14 +171,12 @@ ${repoMap}`
|
|
|
169
171
|
hasStarted = true;
|
|
170
172
|
}
|
|
171
173
|
buffer += chunk;
|
|
172
|
-
fullResponse += chunk;
|
|
174
|
+
fullResponse += chunk;
|
|
173
175
|
const lines = buffer.split('\n');
|
|
174
176
|
buffer = lines.pop() || '';
|
|
175
177
|
for (const line of lines) {
|
|
176
178
|
let content = line.trim();
|
|
177
|
-
|
|
178
|
-
continue;
|
|
179
|
-
// 1. Agent Detection
|
|
179
|
+
// 1. Agent Detection & Cleanup
|
|
180
180
|
const agentMatch = line.match(/\[(Ajay Vai|Sunil Dai|Sandip Dai|Narayan Dai)\]/);
|
|
181
181
|
if (agentMatch) {
|
|
182
182
|
const tag = agentMatch[1];
|
|
@@ -185,39 +185,58 @@ ${repoMap}`
|
|
|
185
185
|
tag === 'Sandip Dai' ? 'Frontend' : 'Syntax';
|
|
186
186
|
const color = tag === 'Ajay Vai' ? chalk_1.default.magenta :
|
|
187
187
|
tag === 'Sunil Dai' ? chalk_1.default.blue :
|
|
188
|
-
tag === 'Sandip Dai' ? chalk_1.default.hex('#FF69B4') :
|
|
188
|
+
tag === 'Sandip Dai' ? chalk_1.default.hex('#FF69B4') :
|
|
189
189
|
chalk_1.default.green;
|
|
190
|
-
if (tag !== lastRole
|
|
191
|
-
|
|
190
|
+
if (tag !== lastRole) {
|
|
191
|
+
tui_1.TUI.log(`\n${color.bold(`[${tag}]`)}`);
|
|
192
192
|
lastRole = tag;
|
|
193
193
|
}
|
|
194
|
-
content =
|
|
195
|
-
if (!content)
|
|
194
|
+
content = line.replace(`[${tag}]`, '').trim();
|
|
195
|
+
if (!content && !inCodeBlock)
|
|
196
196
|
continue;
|
|
197
197
|
}
|
|
198
|
-
// 2. Code Block
|
|
198
|
+
// 2. Code Block Handling
|
|
199
199
|
if (content.startsWith('```')) {
|
|
200
|
-
inCodeBlock
|
|
201
|
-
|
|
202
|
-
|
|
200
|
+
if (inCodeBlock) {
|
|
201
|
+
// Closing block - Draw it!
|
|
202
|
+
tui_1.TUI.drawCodeContainer('Generated Block', codeLang, codeBuffer);
|
|
203
|
+
codeBuffer = '';
|
|
204
|
+
inCodeBlock = false;
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
// Opening block
|
|
208
|
+
inCodeBlock = true;
|
|
209
|
+
codeLang = content.replace('```', '').trim() || 'bash';
|
|
210
|
+
if (options.execute) {
|
|
211
|
+
tui_1.TUI.log(chalk_1.default.gray(' ⚡ Building technical block...'));
|
|
212
|
+
}
|
|
203
213
|
}
|
|
204
214
|
continue;
|
|
205
215
|
}
|
|
206
|
-
// 3. Output logic
|
|
207
216
|
if (inCodeBlock) {
|
|
208
|
-
|
|
209
|
-
console.log(chalk_1.default.blue(line));
|
|
210
|
-
}
|
|
217
|
+
codeBuffer += line + '\n';
|
|
211
218
|
}
|
|
212
|
-
else {
|
|
213
|
-
|
|
219
|
+
else if (content) {
|
|
220
|
+
// Clean up unwanted characters from text output
|
|
221
|
+
const cleanContent = content
|
|
222
|
+
.replace(/\*\*%?\*/g, '')
|
|
223
|
+
.replace(/\*\*:\*\*/g, ':')
|
|
224
|
+
.trim();
|
|
225
|
+
if (cleanContent)
|
|
226
|
+
tui_1.TUI.log(chalk_1.default.gray(cleanContent));
|
|
214
227
|
}
|
|
215
228
|
}
|
|
216
229
|
});
|
|
217
230
|
spinner_1.spinner.stop();
|
|
218
|
-
// Final flush
|
|
219
|
-
if (buffer.trim()
|
|
220
|
-
|
|
231
|
+
// Final flush for remaining buffer
|
|
232
|
+
if (buffer.trim()) {
|
|
233
|
+
if (inCodeBlock) {
|
|
234
|
+
codeBuffer += buffer;
|
|
235
|
+
tui_1.TUI.drawCodeContainer('Generated Block', codeLang, codeBuffer);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
tui_1.TUI.log(chalk_1.default.gray(buffer.trim()));
|
|
239
|
+
}
|
|
221
240
|
}
|
|
222
241
|
// Add assistant response to history
|
|
223
242
|
messages.push({ role: 'assistant', content: fullResponse });
|
|
@@ -229,7 +248,7 @@ ${repoMap}`
|
|
|
229
248
|
const result = await executeWithPermission(response);
|
|
230
249
|
if (result.executed) {
|
|
231
250
|
if (result.success) {
|
|
232
|
-
|
|
251
|
+
tui_1.TUI.log(chalk_1.default.gray('↺ Feeding output to AI...'));
|
|
233
252
|
messages.push({
|
|
234
253
|
role: 'user',
|
|
235
254
|
content: `✅ Command executed successfully. Output:\n${result.output}\n\nProceed to the next step.`
|
|
@@ -237,7 +256,7 @@ ${repoMap}`
|
|
|
237
256
|
continue;
|
|
238
257
|
}
|
|
239
258
|
else {
|
|
240
|
-
|
|
259
|
+
tui_1.TUI.log(chalk_1.default.yellow('\n↺ Command failed. Asking AI to fix...'));
|
|
241
260
|
messages.push({
|
|
242
261
|
role: 'user',
|
|
243
262
|
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.`
|
|
@@ -255,14 +274,15 @@ ${repoMap}`
|
|
|
255
274
|
}
|
|
256
275
|
catch (error) {
|
|
257
276
|
spinner_1.spinner.fail('Request failed');
|
|
258
|
-
|
|
277
|
+
tui_1.TUI.log(chalk_1.default.red(`Error: ${error.message}\n`));
|
|
259
278
|
messages.pop();
|
|
260
279
|
break;
|
|
261
280
|
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
281
|
+
} // end while (loopCount)
|
|
282
|
+
} // end while (true)
|
|
264
283
|
}
|
|
265
284
|
catch (error) {
|
|
285
|
+
tui_1.TUI.exit(); // Restore terminal state on fatal error
|
|
266
286
|
console.error(chalk_1.default.red(`\n❌ Error: ${error.message}`));
|
|
267
287
|
process.exit(1);
|
|
268
288
|
}
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-executor.d.ts","sourceRoot":"","sources":["../../src/utils/command-executor.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CA0BhE;AA0BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAmB1D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CA4B3E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAYjH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"command-executor.d.ts","sourceRoot":"","sources":["../../src/utils/command-executor.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CA0BhE;AA0BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAmB1D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CA4B3E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAYjH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA+GtF;AAED;;GAEG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,OAAO,CAAqE;IAEpF,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAQrC,UAAU;iBAVwB,MAAM;mBAAa,IAAI;iBAAW,OAAO;;IAc3E,KAAK;CAGR;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -136,10 +136,42 @@ async function executeCommand(command, shell) {
|
|
|
136
136
|
async function executeWithPermission(response) {
|
|
137
137
|
const commands = extractCommands(response);
|
|
138
138
|
const patches = patcher_1.Patcher.parseEditBlocks(response);
|
|
139
|
-
|
|
139
|
+
const files = patcher_1.Patcher.parseFileBlocks(response);
|
|
140
|
+
if (commands.length === 0 && patches.length === 0 && files.length === 0) {
|
|
140
141
|
return { success: true, executed: false };
|
|
141
142
|
}
|
|
142
|
-
// 1. Handle
|
|
143
|
+
// 1. Handle New File Creation
|
|
144
|
+
for (const file of files) {
|
|
145
|
+
let showFull = false;
|
|
146
|
+
let decided = false;
|
|
147
|
+
while (!decided) {
|
|
148
|
+
const isTruncated = patcher_1.Patcher.showDiff(file, showFull);
|
|
149
|
+
const choices = [
|
|
150
|
+
{ name: '✅ Create this new file brother', value: 'create' },
|
|
151
|
+
{ name: '⏭️ Skip', value: 'skip' }
|
|
152
|
+
];
|
|
153
|
+
if (isTruncated && !showFull) {
|
|
154
|
+
choices.splice(1, 0, { name: '🔍 View Full Code', value: 'full' });
|
|
155
|
+
}
|
|
156
|
+
const { action } = await inquirer_1.default.prompt([{
|
|
157
|
+
type: 'list',
|
|
158
|
+
name: 'action',
|
|
159
|
+
message: chalk_1.default.cyan(`Create ${file.filePath}?`),
|
|
160
|
+
choices: choices
|
|
161
|
+
}]);
|
|
162
|
+
if (action === 'full') {
|
|
163
|
+
showFull = true;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (action === 'create') {
|
|
167
|
+
const result = patcher_1.Patcher.createFile(file);
|
|
168
|
+
if (!result.success)
|
|
169
|
+
return { success: false, executed: true, error: result.error };
|
|
170
|
+
}
|
|
171
|
+
decided = true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// 2. Handle Shell Commands
|
|
143
175
|
for (let i = 0; i < commands.length; i++) {
|
|
144
176
|
const command = commands[i];
|
|
145
177
|
const shouldExecute = await askPermission(command);
|
|
@@ -159,7 +191,7 @@ async function executeWithPermission(response) {
|
|
|
159
191
|
}
|
|
160
192
|
}
|
|
161
193
|
}
|
|
162
|
-
//
|
|
194
|
+
// 3. Handle Surgical Patches
|
|
163
195
|
for (const patch of patches) {
|
|
164
196
|
let showFull = false;
|
|
165
197
|
let decided = false;
|
|
@@ -167,7 +199,7 @@ async function executeWithPermission(response) {
|
|
|
167
199
|
const isTruncated = patcher_1.Patcher.showDiff(patch, showFull);
|
|
168
200
|
const choices = [
|
|
169
201
|
{ name: '✅ Apply this surgical patch brother', value: 'apply' },
|
|
170
|
-
{ name: '⏭️ Skip
|
|
202
|
+
{ name: '⏭️ Skip', value: 'skip' }
|
|
171
203
|
];
|
|
172
204
|
if (isTruncated && !showFull) {
|
|
173
205
|
choices.splice(1, 0, { name: '🔍 View Full Diff', value: 'full' });
|
|
@@ -175,12 +207,11 @@ async function executeWithPermission(response) {
|
|
|
175
207
|
const { action } = await inquirer_1.default.prompt([{
|
|
176
208
|
type: 'list',
|
|
177
209
|
name: 'action',
|
|
178
|
-
message: chalk_1.default.cyan(`
|
|
210
|
+
message: chalk_1.default.cyan(`Patch ${patch.filePath}?`),
|
|
179
211
|
choices: choices
|
|
180
212
|
}]);
|
|
181
213
|
if (action === 'full') {
|
|
182
214
|
showFull = true;
|
|
183
|
-
// Loop will repeat and show full diff
|
|
184
215
|
continue;
|
|
185
216
|
}
|
|
186
217
|
if (action === 'apply') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../src/utils/command-executor.ts"],"names":[],"mappings":";;;;;;AAmBA,0CA0BC;AA6BD,8CAmBC;AAKD,sCA4BC;AAKD,wCAYC;AAeD,
|
|
1
|
+
{"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../src/utils/command-executor.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/patcher.d.ts
CHANGED
|
@@ -15,6 +15,21 @@ export declare class Patcher {
|
|
|
15
15
|
* >>>> REPLACE
|
|
16
16
|
*/
|
|
17
17
|
static parseEditBlocks(response: string): EditBlock[];
|
|
18
|
+
/**
|
|
19
|
+
* Parse file creation blocks from AI response
|
|
20
|
+
* Format:
|
|
21
|
+
* <file path="path/to/file.ext">
|
|
22
|
+
* content
|
|
23
|
+
* </file>
|
|
24
|
+
*/
|
|
25
|
+
static parseFileBlocks(response: string): EditBlock[];
|
|
26
|
+
/**
|
|
27
|
+
* Create a new file (and its directories)
|
|
28
|
+
*/
|
|
29
|
+
static createFile(block: EditBlock): {
|
|
30
|
+
success: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
};
|
|
18
33
|
/**
|
|
19
34
|
* Apply a surgical patch to a file
|
|
20
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patcher.d.ts","sourceRoot":"","sources":["../../src/utils/patcher.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,OAAO;IAChB;;;;;;;;;OASG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;
|
|
1
|
+
{"version":3,"file":"patcher.d.ts","sourceRoot":"","sources":["../../src/utils/patcher.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,OAAO;IAChB;;;;;;;;;OASG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;IAgBrD;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;IAgBrD;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAoBzE;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IA2CzE;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,GAAE,OAAe,GAAG,OAAO;CA4DpE"}
|
package/dist/utils/patcher.js
CHANGED
|
@@ -21,7 +21,6 @@ class Patcher {
|
|
|
21
21
|
*/
|
|
22
22
|
static parseEditBlocks(response) {
|
|
23
23
|
const blocks = [];
|
|
24
|
-
// Match filename followed by search/replace block
|
|
25
24
|
const blockRegex = /\*\*([^*]+)\*\*\s*<<<< SEARCH\n([\s\S]*?)\n====\n([\s\S]*?)\n>>>> REPLACE/g;
|
|
26
25
|
let match;
|
|
27
26
|
while ((match = blockRegex.exec(response)) !== null) {
|
|
@@ -33,6 +32,46 @@ class Patcher {
|
|
|
33
32
|
}
|
|
34
33
|
return blocks;
|
|
35
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse file creation blocks from AI response
|
|
37
|
+
* Format:
|
|
38
|
+
* <file path="path/to/file.ext">
|
|
39
|
+
* content
|
|
40
|
+
* </file>
|
|
41
|
+
*/
|
|
42
|
+
static parseFileBlocks(response) {
|
|
43
|
+
const blocks = [];
|
|
44
|
+
const fileRegex = /<file path="([^"]+)">\n([\s\S]*?)\n<\/file>/g;
|
|
45
|
+
let match;
|
|
46
|
+
while ((match = fileRegex.exec(response)) !== null) {
|
|
47
|
+
blocks.push({
|
|
48
|
+
filePath: match[1].trim(),
|
|
49
|
+
search: '', // Not used for new files
|
|
50
|
+
replace: match[2]
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return blocks;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create a new file (and its directories)
|
|
57
|
+
*/
|
|
58
|
+
static createFile(block) {
|
|
59
|
+
tui_1.TUI.drawStatusBar(`Creating File: ${block.filePath}...`);
|
|
60
|
+
try {
|
|
61
|
+
const fullPath = path_1.default.resolve(process.cwd(), block.filePath);
|
|
62
|
+
const dir = path_1.default.dirname(fullPath);
|
|
63
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
64
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
fs_1.default.writeFileSync(fullPath, block.replace, 'utf8');
|
|
67
|
+
tui_1.TUI.drawStatusBar(`✅ Success: ${block.filePath} created.`);
|
|
68
|
+
return { success: true };
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
tui_1.TUI.drawStatusBar(`❌ Error: ${err.message}`);
|
|
72
|
+
return { success: false, error: err.message };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
36
75
|
/**
|
|
37
76
|
* Apply a surgical patch to a file
|
|
38
77
|
*/
|
|
@@ -48,7 +87,7 @@ class Patcher {
|
|
|
48
87
|
// Normalize and trim for better matching robustness
|
|
49
88
|
const normalizedContent = content.replace(/\r\n/g, '\n');
|
|
50
89
|
const normalizedSearch = block.search.replace(/\r\n/g, '\n').trim();
|
|
51
|
-
const normalizedReplace = block.replace.replace(/\r\n/g, '\n')
|
|
90
|
+
const normalizedReplace = block.replace.replace(/\r\n/g, '\n');
|
|
52
91
|
if (!normalizedContent.includes(normalizedSearch)) {
|
|
53
92
|
// Try a fuzzy match by trimming internal lines as well
|
|
54
93
|
const fuzzyContent = normalizedContent.split('\n').map(l => l.trimEnd()).join('\n');
|
|
@@ -60,9 +99,8 @@ class Patcher {
|
|
|
60
99
|
error: `Search block not found in ${block.filePath}. Please ensure the code snippet matches exactly (ignoring trailing whitespace).`
|
|
61
100
|
};
|
|
62
101
|
}
|
|
63
|
-
// If fuzzy match worked, we can still try to replace but it's riskier.
|
|
64
|
-
// For now, let's stick to strict-ish matching but with trimmed ends.
|
|
65
102
|
}
|
|
103
|
+
// Perform replacement on normalized content
|
|
66
104
|
const updatedContent = normalizedContent.replace(normalizedSearch, normalizedReplace);
|
|
67
105
|
fs_1.default.writeFileSync(fullPath, updatedContent, 'utf8');
|
|
68
106
|
tui_1.TUI.drawStatusBar(`✅ Success: ${block.filePath} patched.`);
|
|
@@ -78,33 +116,36 @@ class Patcher {
|
|
|
78
116
|
*/
|
|
79
117
|
static showDiff(block, full = false) {
|
|
80
118
|
const width = Math.min(process.stdout.columns || 80, 100);
|
|
81
|
-
const searchLines = block.search.split('\n');
|
|
119
|
+
const searchLines = (block.search || '').split('\n');
|
|
82
120
|
const replaceLines = block.replace.split('\n');
|
|
83
|
-
const
|
|
121
|
+
const isNewFile = !block.search;
|
|
122
|
+
const isLarge = replaceLines.length > 8;
|
|
84
123
|
const shouldTruncate = isLarge && !full;
|
|
85
124
|
const displaySearch = shouldTruncate ? searchLines.slice(0, 5) : searchLines;
|
|
86
125
|
const displayReplace = shouldTruncate ? replaceLines.slice(0, 5) : replaceLines;
|
|
87
126
|
process.stdout.write('\n');
|
|
88
127
|
// 1. Title Bar with Traffic Lights
|
|
89
|
-
const
|
|
128
|
+
const type = isNewFile ? '🆕 NEW FILE' : '📂 PATCH';
|
|
129
|
+
const title = ` ${type}: ${block.filePath} `;
|
|
90
130
|
const trafficLights = chalk_1.default.red('●') + ' ' + chalk_1.default.yellow('●') + ' ' + chalk_1.default.green('●');
|
|
91
|
-
const remainingWidth = width - 12 - title.length;
|
|
92
131
|
console.log(chalk_1.default.gray('┏' + '━'.repeat(width - 2) + '┓'));
|
|
93
|
-
console.log(chalk_1.default.gray('┃ ') + trafficLights + chalk_1.default.cyan.bold(title).padEnd(width - 10) + chalk_1.default.gray(' ┃'));
|
|
132
|
+
console.log(chalk_1.default.gray('┃ ') + trafficLights + ' ' + chalk_1.default.cyan.bold(title).padEnd(width - 10) + chalk_1.default.gray(' ┃'));
|
|
94
133
|
console.log(chalk_1.default.gray('┣' + '━'.repeat(width - 2) + '┫'));
|
|
95
|
-
// 2. Search Block (Deletions)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
134
|
+
// 2. Search Block (Deletions) - Only for patches
|
|
135
|
+
if (!isNewFile) {
|
|
136
|
+
displaySearch.forEach((line) => {
|
|
137
|
+
const prefix = chalk_1.default.red('┃ ') + chalk_1.default.bgRed.white(' - ') + ' ';
|
|
138
|
+
const content = chalk_1.default.red(line.substring(0, width - 10));
|
|
139
|
+
console.log(prefix + content.padEnd(width - 8) + chalk_1.default.gray(' ┃'));
|
|
140
|
+
});
|
|
141
|
+
if (shouldTruncate && searchLines.length > 5) {
|
|
142
|
+
console.log(chalk_1.default.red('┃ ') + chalk_1.default.gray(` ... (${searchLines.length - 5} more lines hidden)`).padEnd(width - 5) + chalk_1.default.gray(' ┃'));
|
|
143
|
+
}
|
|
144
|
+
// Separator between search and replace
|
|
145
|
+
console.log(chalk_1.default.gray('┣' + '╍'.repeat(width - 2) + '┫'));
|
|
103
146
|
}
|
|
104
|
-
// 3.
|
|
105
|
-
|
|
106
|
-
// 4. Replace Block (Additions)
|
|
107
|
-
displayReplace.forEach((line, idx) => {
|
|
147
|
+
// 3. Replace Block (Additions)
|
|
148
|
+
displayReplace.forEach((line) => {
|
|
108
149
|
const prefix = chalk_1.default.green('┃ ') + chalk_1.default.bgGreen.black(' + ') + ' ';
|
|
109
150
|
const content = chalk_1.default.green(line.substring(0, width - 10));
|
|
110
151
|
console.log(prefix + content.padEnd(width - 8) + chalk_1.default.gray(' ┃'));
|
|
@@ -112,7 +153,7 @@ class Patcher {
|
|
|
112
153
|
if (shouldTruncate && replaceLines.length > 5) {
|
|
113
154
|
console.log(chalk_1.default.green('┃ ') + chalk_1.default.gray(` ... (${replaceLines.length - 5} more lines hidden)`).padEnd(width - 5) + chalk_1.default.gray(' ┃'));
|
|
114
155
|
}
|
|
115
|
-
//
|
|
156
|
+
// 4. Footer
|
|
116
157
|
console.log(chalk_1.default.gray('┗' + '━'.repeat(width - 2) + '┛'));
|
|
117
158
|
if (shouldTruncate) {
|
|
118
159
|
console.log(chalk_1.default.yellow(' 💡 Note: This diff is minimized. Use (v) to see full code.'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patcher.js","sourceRoot":"","sources":["../../src/utils/patcher.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,+BAA4B;AAQ5B,MAAa,OAAO;IAChB;;;;;;;;;OASG;IACH,MAAM,CAAC,eAAe,CAAC,QAAgB;QACnC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,
|
|
1
|
+
{"version":3,"file":"patcher.js","sourceRoot":"","sources":["../../src/utils/patcher.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/tui.d.ts
CHANGED
|
@@ -24,7 +24,11 @@ export declare class TUI {
|
|
|
24
24
|
/**
|
|
25
25
|
* Draw a real-time status bar at the bottom
|
|
26
26
|
*/
|
|
27
|
-
static drawStatusBar(status: string): void;
|
|
27
|
+
static drawStatusBar(status: string, force?: boolean): void;
|
|
28
|
+
/**
|
|
29
|
+
* Draw a premium code container with traffic lights
|
|
30
|
+
*/
|
|
31
|
+
static drawCodeContainer(title: string, lang: string, content: string): void;
|
|
28
32
|
/**
|
|
29
33
|
* Log content into the scrollable area
|
|
30
34
|
*/
|
package/dist/utils/tui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/utils/tui.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAAa,GAAG;IACZ,OAAO,CAAC,MAAM,CAAC,aAAa,CAAS;IACrC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAM;IAElC;;OAEG;IACH,MAAM,CAAC,IAAI;IAiBX;;OAEG;IACH,MAAM,CAAC,IAAI;IAaX;;OAEG;IACH,MAAM,CAAC,KAAK;IAMZ;;OAEG;IACH,MAAM,CAAC,UAAU;IAWjB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/utils/tui.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAAa,GAAG;IACZ,OAAO,CAAC,MAAM,CAAC,aAAa,CAAS;IACrC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAM;IAElC;;OAEG;IACH,MAAM,CAAC,IAAI;IAiBX;;OAEG;IACH,MAAM,CAAC,IAAI;IAaX;;OAEG;IACH,MAAM,CAAC,KAAK;IAMZ;;OAEG;IACH,MAAM,CAAC,UAAU;IAWjB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,OAAe;IAsB3D;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAwBrE;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM;CAO7B"}
|
package/dist/utils/tui.js
CHANGED
|
@@ -45,7 +45,7 @@ class TUI {
|
|
|
45
45
|
static clear() {
|
|
46
46
|
process.stdout.write('\x1b[2J\x1b[H');
|
|
47
47
|
this.drawHeader();
|
|
48
|
-
this.drawStatusBar(this.currentStatus);
|
|
48
|
+
this.drawStatusBar(this.currentStatus, true);
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
51
|
* Draw the persistent top header
|
|
@@ -56,16 +56,18 @@ class TUI {
|
|
|
56
56
|
const padding = Math.max(0, Math.floor((width - banner.length) / 2));
|
|
57
57
|
// Move to top
|
|
58
58
|
process.stdout.write('\x1b[H');
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
process.stdout.write(chalk_1.default.bgCyan.black(' '.repeat(padding) + banner + ' '.repeat(width - banner.length - padding)) + '\n');
|
|
60
|
+
process.stdout.write(chalk_1.default.gray('─'.repeat(width)) + '\n');
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
63
|
* Draw a real-time status bar at the bottom
|
|
64
64
|
*/
|
|
65
|
-
static drawStatusBar(status) {
|
|
66
|
-
this.currentStatus = status;
|
|
65
|
+
static drawStatusBar(status, force = false) {
|
|
67
66
|
if (!this.isInitialized)
|
|
68
67
|
return;
|
|
68
|
+
if (this.currentStatus === status && !force)
|
|
69
|
+
return; // Prevent flicker
|
|
70
|
+
this.currentStatus = status;
|
|
69
71
|
const width = process.stdout.columns || 80;
|
|
70
72
|
const height = process.stdout.rows || 24;
|
|
71
73
|
// Save cursor position
|
|
@@ -78,6 +80,28 @@ class TUI {
|
|
|
78
80
|
// Restore cursor position
|
|
79
81
|
process.stdout.write('\x1b[u');
|
|
80
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Draw a premium code container with traffic lights
|
|
85
|
+
*/
|
|
86
|
+
static drawCodeContainer(title, lang, content) {
|
|
87
|
+
const width = Math.min(process.stdout.columns || 80, 100);
|
|
88
|
+
const lines = content.split('\n');
|
|
89
|
+
console.log();
|
|
90
|
+
// 1. Title Bar
|
|
91
|
+
const trafficLights = chalk_1.default.red('●') + ' ' + chalk_1.default.yellow('●') + ' ' + chalk_1.default.green('●');
|
|
92
|
+
const displayTitle = ` 📝 ${title} (${lang}) `;
|
|
93
|
+
console.log(chalk_1.default.gray('┏' + '━'.repeat(width - 2) + '┓'));
|
|
94
|
+
console.log(chalk_1.default.gray('┃ ') + trafficLights + ' ' + chalk_1.default.cyan.bold(displayTitle).padEnd(width - 10) + chalk_1.default.gray(' ┃'));
|
|
95
|
+
console.log(chalk_1.default.gray('┣' + '━'.repeat(width - 2) + '┫'));
|
|
96
|
+
// 2. Content
|
|
97
|
+
lines.forEach(line => {
|
|
98
|
+
const formattedLine = line.substring(0, width - 6);
|
|
99
|
+
console.log(chalk_1.default.gray('┃ ') + chalk_1.default.white(formattedLine).padEnd(width - 4) + chalk_1.default.gray(' ┃'));
|
|
100
|
+
});
|
|
101
|
+
// 3. Footer
|
|
102
|
+
console.log(chalk_1.default.gray('┗' + '━'.repeat(width - 2) + '┛'));
|
|
103
|
+
console.log();
|
|
104
|
+
}
|
|
81
105
|
/**
|
|
82
106
|
* Log content into the scrollable area
|
|
83
107
|
*/
|
|
@@ -86,8 +110,6 @@ class TUI {
|
|
|
86
110
|
console.log(content);
|
|
87
111
|
return;
|
|
88
112
|
}
|
|
89
|
-
// Since we are in an alternative buffer, standard console.log works
|
|
90
|
-
// within the viewport between header and footer.
|
|
91
113
|
console.log(content);
|
|
92
114
|
}
|
|
93
115
|
}
|
package/dist/utils/tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/utils/tui.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B;;;GAGG;AACH,MAAa,GAAG;IAIZ;;OAEG;IACH,MAAM,CAAC,IAAI;QACP,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAE/B,kCAAkC;QAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAEpC,cAAc;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,oBAAoB;QACpB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI;QACP,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAEhC,cAAc;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAElC,iCAAiC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAEpC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,OAAO,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/utils/tui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/api/client.ts
CHANGED
|
@@ -83,8 +83,12 @@ export class MatexAPIClient {
|
|
|
83
83
|
});
|
|
84
84
|
} catch (error: any) {
|
|
85
85
|
if (error.response) {
|
|
86
|
-
//
|
|
87
|
-
|
|
86
|
+
// Try to extract detail from data if possible (standard FastAPI error format)
|
|
87
|
+
let detail = error.response.statusText;
|
|
88
|
+
if (error.response.data && error.response.data.detail) {
|
|
89
|
+
detail = error.response.data.detail;
|
|
90
|
+
}
|
|
91
|
+
throw new Error(`API Error: ${detail}`);
|
|
88
92
|
} else {
|
|
89
93
|
throw new Error(`Request failed: ${error.message}`);
|
|
90
94
|
}
|
package/src/commands/dev.ts
CHANGED
|
@@ -121,24 +121,26 @@ ${repoMap}`
|
|
|
121
121
|
while (loopCount < MAX_LOOPS) {
|
|
122
122
|
loopCount++;
|
|
123
123
|
|
|
124
|
-
if (loopCount > 1) {
|
|
125
|
-
spinner.start('Analyzing result & Validating...');
|
|
126
|
-
} else {
|
|
127
|
-
spinner.start('Thinking...');
|
|
128
|
-
}
|
|
129
|
-
|
|
130
124
|
try {
|
|
125
|
+
if (loopCount > 1) {
|
|
126
|
+
spinner.start('Analyzing result & Validating...');
|
|
127
|
+
} else {
|
|
128
|
+
spinner.start('Thinking...');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
131
|
let fullResponse = '';
|
|
132
132
|
let buffer = '';
|
|
133
133
|
let hasStarted = false;
|
|
134
134
|
let inCodeBlock = false;
|
|
135
|
-
let
|
|
135
|
+
let codeBuffer = '';
|
|
136
|
+
let codeLang = 'bash';
|
|
137
|
+
let lastRole: AgentRole | '' = '';
|
|
136
138
|
|
|
137
139
|
TUI.drawStatusBar('Swarm is processing...');
|
|
138
140
|
await client.chatStream({
|
|
139
141
|
messages,
|
|
140
|
-
model: options.model,
|
|
141
|
-
temperature: 0.3,
|
|
142
|
+
model: options.model,
|
|
143
|
+
temperature: 0.3,
|
|
142
144
|
max_tokens: 8000,
|
|
143
145
|
}, (chunk) => {
|
|
144
146
|
if (!hasStarted) {
|
|
@@ -147,15 +149,14 @@ ${repoMap}`
|
|
|
147
149
|
}
|
|
148
150
|
|
|
149
151
|
buffer += chunk;
|
|
150
|
-
fullResponse += chunk;
|
|
152
|
+
fullResponse += chunk;
|
|
151
153
|
const lines = buffer.split('\n');
|
|
152
154
|
buffer = lines.pop() || '';
|
|
153
155
|
|
|
154
156
|
for (const line of lines) {
|
|
155
157
|
let content = line.trim();
|
|
156
|
-
if (!content && !inCodeBlock) continue;
|
|
157
158
|
|
|
158
|
-
// 1. Agent Detection
|
|
159
|
+
// 1. Agent Detection & Cleanup
|
|
159
160
|
const agentMatch = line.match(/\[(Ajay Vai|Sunil Dai|Sandip Dai|Narayan Dai)\]/);
|
|
160
161
|
if (agentMatch) {
|
|
161
162
|
const tag = agentMatch[1];
|
|
@@ -165,42 +166,58 @@ ${repoMap}`
|
|
|
165
166
|
|
|
166
167
|
const color = tag === 'Ajay Vai' ? chalk.magenta :
|
|
167
168
|
tag === 'Sunil Dai' ? chalk.blue :
|
|
168
|
-
tag === 'Sandip Dai' ? chalk.hex('#FF69B4') :
|
|
169
|
+
tag === 'Sandip Dai' ? chalk.hex('#FF69B4') :
|
|
169
170
|
chalk.green;
|
|
170
171
|
|
|
171
|
-
if (tag !== lastRole
|
|
172
|
-
|
|
172
|
+
if (tag !== lastRole) {
|
|
173
|
+
TUI.log(`\n${color.bold(`[${tag}]`)}`);
|
|
173
174
|
lastRole = tag as AgentRole;
|
|
174
175
|
}
|
|
175
|
-
content =
|
|
176
|
-
if (!content) continue;
|
|
176
|
+
content = line.replace(`[${tag}]`, '').trim();
|
|
177
|
+
if (!content && !inCodeBlock) continue;
|
|
177
178
|
}
|
|
178
179
|
|
|
179
|
-
// 2. Code Block
|
|
180
|
+
// 2. Code Block Handling
|
|
180
181
|
if (content.startsWith('```')) {
|
|
181
|
-
inCodeBlock
|
|
182
|
-
|
|
183
|
-
|
|
182
|
+
if (inCodeBlock) {
|
|
183
|
+
// Closing block - Draw it!
|
|
184
|
+
TUI.drawCodeContainer('Generated Block', codeLang, codeBuffer);
|
|
185
|
+
codeBuffer = '';
|
|
186
|
+
inCodeBlock = false;
|
|
187
|
+
} else {
|
|
188
|
+
// Opening block
|
|
189
|
+
inCodeBlock = true;
|
|
190
|
+
codeLang = content.replace('```', '').trim() || 'bash';
|
|
191
|
+
if (options.execute) {
|
|
192
|
+
TUI.log(chalk.gray(' ⚡ Building technical block...'));
|
|
193
|
+
}
|
|
184
194
|
}
|
|
185
195
|
continue;
|
|
186
196
|
}
|
|
187
197
|
|
|
188
|
-
// 3. Output logic
|
|
189
198
|
if (inCodeBlock) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
199
|
+
codeBuffer += line + '\n';
|
|
200
|
+
} else if (content) {
|
|
201
|
+
// Clean up unwanted characters from text output
|
|
202
|
+
const cleanContent = content
|
|
203
|
+
.replace(/\*\*%?\*/g, '')
|
|
204
|
+
.replace(/\*\*:\*\*/g, ':')
|
|
205
|
+
.trim();
|
|
206
|
+
if (cleanContent) TUI.log(chalk.gray(cleanContent));
|
|
195
207
|
}
|
|
196
208
|
}
|
|
197
209
|
});
|
|
198
210
|
|
|
199
211
|
spinner.stop();
|
|
200
212
|
|
|
201
|
-
// Final flush
|
|
202
|
-
if (buffer.trim()
|
|
203
|
-
|
|
213
|
+
// Final flush for remaining buffer
|
|
214
|
+
if (buffer.trim()) {
|
|
215
|
+
if (inCodeBlock) {
|
|
216
|
+
codeBuffer += buffer;
|
|
217
|
+
TUI.drawCodeContainer('Generated Block', codeLang, codeBuffer);
|
|
218
|
+
} else {
|
|
219
|
+
TUI.log(chalk.gray(buffer.trim()));
|
|
220
|
+
}
|
|
204
221
|
}
|
|
205
222
|
|
|
206
223
|
// Add assistant response to history
|
|
@@ -215,14 +232,14 @@ ${repoMap}`
|
|
|
215
232
|
|
|
216
233
|
if (result.executed) {
|
|
217
234
|
if (result.success) {
|
|
218
|
-
|
|
235
|
+
TUI.log(chalk.gray('↺ Feeding output to AI...'));
|
|
219
236
|
messages.push({
|
|
220
237
|
role: 'user',
|
|
221
238
|
content: `✅ Command executed successfully. Output:\n${result.output}\n\nProceed to the next step.`
|
|
222
239
|
});
|
|
223
240
|
continue;
|
|
224
241
|
} else {
|
|
225
|
-
|
|
242
|
+
TUI.log(chalk.yellow('\n↺ Command failed. Asking AI to fix...'));
|
|
226
243
|
messages.push({
|
|
227
244
|
role: 'user',
|
|
228
245
|
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.`
|
|
@@ -237,13 +254,14 @@ ${repoMap}`
|
|
|
237
254
|
}
|
|
238
255
|
} catch (error: any) {
|
|
239
256
|
spinner.fail('Request failed');
|
|
240
|
-
|
|
257
|
+
TUI.log(chalk.red(`Error: ${error.message}\n`));
|
|
241
258
|
messages.pop();
|
|
242
259
|
break;
|
|
243
260
|
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
261
|
+
} // end while (loopCount)
|
|
262
|
+
} // end while (true)
|
|
246
263
|
} catch (error: any) {
|
|
264
|
+
TUI.exit(); // Restore terminal state on fatal error
|
|
247
265
|
console.error(chalk.red(`\n❌ Error: ${error.message}`));
|
|
248
266
|
process.exit(1);
|
|
249
267
|
}
|
|
@@ -159,12 +159,50 @@ export interface ExecutionResult {
|
|
|
159
159
|
export async function executeWithPermission(response: string): Promise<ExecutionResult> {
|
|
160
160
|
const commands = extractCommands(response);
|
|
161
161
|
const patches = Patcher.parseEditBlocks(response);
|
|
162
|
+
const files = Patcher.parseFileBlocks(response);
|
|
162
163
|
|
|
163
|
-
if (commands.length === 0 && patches.length === 0) {
|
|
164
|
+
if (commands.length === 0 && patches.length === 0 && files.length === 0) {
|
|
164
165
|
return { success: true, executed: false };
|
|
165
166
|
}
|
|
166
167
|
|
|
167
|
-
// 1. Handle
|
|
168
|
+
// 1. Handle New File Creation
|
|
169
|
+
for (const file of files) {
|
|
170
|
+
let showFull = false;
|
|
171
|
+
let decided = false;
|
|
172
|
+
|
|
173
|
+
while (!decided) {
|
|
174
|
+
const isTruncated = Patcher.showDiff(file, showFull);
|
|
175
|
+
|
|
176
|
+
const choices = [
|
|
177
|
+
{ name: '✅ Create this new file brother', value: 'create' },
|
|
178
|
+
{ name: '⏭️ Skip', value: 'skip' }
|
|
179
|
+
];
|
|
180
|
+
|
|
181
|
+
if (isTruncated && !showFull) {
|
|
182
|
+
choices.splice(1, 0, { name: '🔍 View Full Code', value: 'full' });
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const { action } = await inquirer.prompt([{
|
|
186
|
+
type: 'list',
|
|
187
|
+
name: 'action',
|
|
188
|
+
message: chalk.cyan(`Create ${file.filePath}?`),
|
|
189
|
+
choices: choices
|
|
190
|
+
}]);
|
|
191
|
+
|
|
192
|
+
if (action === 'full') {
|
|
193
|
+
showFull = true;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (action === 'create') {
|
|
198
|
+
const result = Patcher.createFile(file);
|
|
199
|
+
if (!result.success) return { success: false, executed: true, error: result.error };
|
|
200
|
+
}
|
|
201
|
+
decided = true;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// 2. Handle Shell Commands
|
|
168
206
|
for (let i = 0; i < commands.length; i++) {
|
|
169
207
|
const command = commands[i];
|
|
170
208
|
const shouldExecute = await askPermission(command);
|
|
@@ -184,7 +222,7 @@ export async function executeWithPermission(response: string): Promise<Execution
|
|
|
184
222
|
}
|
|
185
223
|
}
|
|
186
224
|
|
|
187
|
-
//
|
|
225
|
+
// 3. Handle Surgical Patches
|
|
188
226
|
for (const patch of patches) {
|
|
189
227
|
let showFull = false;
|
|
190
228
|
let decided = false;
|
|
@@ -194,7 +232,7 @@ export async function executeWithPermission(response: string): Promise<Execution
|
|
|
194
232
|
|
|
195
233
|
const choices = [
|
|
196
234
|
{ name: '✅ Apply this surgical patch brother', value: 'apply' },
|
|
197
|
-
{ name: '⏭️ Skip
|
|
235
|
+
{ name: '⏭️ Skip', value: 'skip' }
|
|
198
236
|
];
|
|
199
237
|
|
|
200
238
|
if (isTruncated && !showFull) {
|
|
@@ -204,13 +242,12 @@ export async function executeWithPermission(response: string): Promise<Execution
|
|
|
204
242
|
const { action } = await inquirer.prompt([{
|
|
205
243
|
type: 'list',
|
|
206
244
|
name: 'action',
|
|
207
|
-
message: chalk.cyan(`
|
|
245
|
+
message: chalk.cyan(`Patch ${patch.filePath}?`),
|
|
208
246
|
choices: choices
|
|
209
247
|
}]);
|
|
210
248
|
|
|
211
249
|
if (action === 'full') {
|
|
212
250
|
showFull = true;
|
|
213
|
-
// Loop will repeat and show full diff
|
|
214
251
|
continue;
|
|
215
252
|
}
|
|
216
253
|
|
package/src/utils/patcher.ts
CHANGED
|
@@ -22,7 +22,6 @@ export class Patcher {
|
|
|
22
22
|
*/
|
|
23
23
|
static parseEditBlocks(response: string): EditBlock[] {
|
|
24
24
|
const blocks: EditBlock[] = [];
|
|
25
|
-
// Match filename followed by search/replace block
|
|
26
25
|
const blockRegex = /\*\*([^*]+)\*\*\s*<<<< SEARCH\n([\s\S]*?)\n====\n([\s\S]*?)\n>>>> REPLACE/g;
|
|
27
26
|
|
|
28
27
|
let match;
|
|
@@ -37,6 +36,52 @@ export class Patcher {
|
|
|
37
36
|
return blocks;
|
|
38
37
|
}
|
|
39
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Parse file creation blocks from AI response
|
|
41
|
+
* Format:
|
|
42
|
+
* <file path="path/to/file.ext">
|
|
43
|
+
* content
|
|
44
|
+
* </file>
|
|
45
|
+
*/
|
|
46
|
+
static parseFileBlocks(response: string): EditBlock[] {
|
|
47
|
+
const blocks: EditBlock[] = [];
|
|
48
|
+
const fileRegex = /<file path="([^"]+)">\n([\s\S]*?)\n<\/file>/g;
|
|
49
|
+
|
|
50
|
+
let match;
|
|
51
|
+
while ((match = fileRegex.exec(response)) !== null) {
|
|
52
|
+
blocks.push({
|
|
53
|
+
filePath: match[1].trim(),
|
|
54
|
+
search: '', // Not used for new files
|
|
55
|
+
replace: match[2]
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return blocks;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Create a new file (and its directories)
|
|
64
|
+
*/
|
|
65
|
+
static createFile(block: EditBlock): { success: boolean; error?: string } {
|
|
66
|
+
TUI.drawStatusBar(`Creating File: ${block.filePath}...`);
|
|
67
|
+
try {
|
|
68
|
+
const fullPath = path.resolve(process.cwd(), block.filePath);
|
|
69
|
+
const dir = path.dirname(fullPath);
|
|
70
|
+
|
|
71
|
+
if (!fs.existsSync(dir)) {
|
|
72
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fs.writeFileSync(fullPath, block.replace, 'utf8');
|
|
76
|
+
|
|
77
|
+
TUI.drawStatusBar(`✅ Success: ${block.filePath} created.`);
|
|
78
|
+
return { success: true };
|
|
79
|
+
} catch (err: any) {
|
|
80
|
+
TUI.drawStatusBar(`❌ Error: ${err.message}`);
|
|
81
|
+
return { success: false, error: err.message };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
40
85
|
/**
|
|
41
86
|
* Apply a surgical patch to a file
|
|
42
87
|
*/
|
|
@@ -55,7 +100,7 @@ export class Patcher {
|
|
|
55
100
|
// Normalize and trim for better matching robustness
|
|
56
101
|
const normalizedContent = content.replace(/\r\n/g, '\n');
|
|
57
102
|
const normalizedSearch = block.search.replace(/\r\n/g, '\n').trim();
|
|
58
|
-
const normalizedReplace = block.replace.replace(/\r\n/g, '\n')
|
|
103
|
+
const normalizedReplace = block.replace.replace(/\r\n/g, '\n');
|
|
59
104
|
|
|
60
105
|
if (!normalizedContent.includes(normalizedSearch)) {
|
|
61
106
|
// Try a fuzzy match by trimming internal lines as well
|
|
@@ -69,11 +114,9 @@ export class Patcher {
|
|
|
69
114
|
error: `Search block not found in ${block.filePath}. Please ensure the code snippet matches exactly (ignoring trailing whitespace).`
|
|
70
115
|
};
|
|
71
116
|
}
|
|
72
|
-
|
|
73
|
-
// If fuzzy match worked, we can still try to replace but it's riskier.
|
|
74
|
-
// For now, let's stick to strict-ish matching but with trimmed ends.
|
|
75
117
|
}
|
|
76
118
|
|
|
119
|
+
// Perform replacement on normalized content
|
|
77
120
|
const updatedContent = normalizedContent.replace(normalizedSearch, normalizedReplace);
|
|
78
121
|
fs.writeFileSync(fullPath, updatedContent, 'utf8');
|
|
79
122
|
|
|
@@ -90,10 +133,11 @@ export class Patcher {
|
|
|
90
133
|
*/
|
|
91
134
|
static showDiff(block: EditBlock, full: boolean = false): boolean {
|
|
92
135
|
const width = Math.min(process.stdout.columns || 80, 100);
|
|
93
|
-
const searchLines = block.search.split('\n');
|
|
136
|
+
const searchLines = (block.search || '').split('\n');
|
|
94
137
|
const replaceLines = block.replace.split('\n');
|
|
95
138
|
|
|
96
|
-
const
|
|
139
|
+
const isNewFile = !block.search;
|
|
140
|
+
const isLarge = replaceLines.length > 8;
|
|
97
141
|
const shouldTruncate = isLarge && !full;
|
|
98
142
|
|
|
99
143
|
const displaySearch = shouldTruncate ? searchLines.slice(0, 5) : searchLines;
|
|
@@ -102,30 +146,32 @@ export class Patcher {
|
|
|
102
146
|
process.stdout.write('\n');
|
|
103
147
|
|
|
104
148
|
// 1. Title Bar with Traffic Lights
|
|
105
|
-
const
|
|
149
|
+
const type = isNewFile ? '🆕 NEW FILE' : '📂 PATCH';
|
|
150
|
+
const title = ` ${type}: ${block.filePath} `;
|
|
106
151
|
const trafficLights = chalk.red('●') + ' ' + chalk.yellow('●') + ' ' + chalk.green('●');
|
|
107
|
-
const remainingWidth = width - 12 - title.length;
|
|
108
152
|
|
|
109
153
|
console.log(chalk.gray('┏' + '━'.repeat(width - 2) + '┓'));
|
|
110
|
-
console.log(chalk.gray('┃ ') + trafficLights + chalk.cyan.bold(title).padEnd(width - 10) + chalk.gray(' ┃'));
|
|
154
|
+
console.log(chalk.gray('┃ ') + trafficLights + ' ' + chalk.cyan.bold(title).padEnd(width - 10) + chalk.gray(' ┃'));
|
|
111
155
|
console.log(chalk.gray('┣' + '━'.repeat(width - 2) + '┫'));
|
|
112
156
|
|
|
113
|
-
// 2. Search Block (Deletions)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
157
|
+
// 2. Search Block (Deletions) - Only for patches
|
|
158
|
+
if (!isNewFile) {
|
|
159
|
+
displaySearch.forEach((line) => {
|
|
160
|
+
const prefix = chalk.red('┃ ') + chalk.bgRed.white(' - ') + ' ';
|
|
161
|
+
const content = chalk.red(line.substring(0, width - 10));
|
|
162
|
+
console.log(prefix + content.padEnd(width - 8) + chalk.gray(' ┃'));
|
|
163
|
+
});
|
|
119
164
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
165
|
+
if (shouldTruncate && searchLines.length > 5) {
|
|
166
|
+
console.log(chalk.red('┃ ') + chalk.gray(` ... (${searchLines.length - 5} more lines hidden)`).padEnd(width - 5) + chalk.gray(' ┃'));
|
|
167
|
+
}
|
|
123
168
|
|
|
124
|
-
|
|
125
|
-
|
|
169
|
+
// Separator between search and replace
|
|
170
|
+
console.log(chalk.gray('┣' + '╍'.repeat(width - 2) + '┫'));
|
|
171
|
+
}
|
|
126
172
|
|
|
127
|
-
//
|
|
128
|
-
displayReplace.forEach((line
|
|
173
|
+
// 3. Replace Block (Additions)
|
|
174
|
+
displayReplace.forEach((line) => {
|
|
129
175
|
const prefix = chalk.green('┃ ') + chalk.bgGreen.black(' + ') + ' ';
|
|
130
176
|
const content = chalk.green(line.substring(0, width - 10));
|
|
131
177
|
console.log(prefix + content.padEnd(width - 8) + chalk.gray(' ┃'));
|
|
@@ -135,7 +181,7 @@ export class Patcher {
|
|
|
135
181
|
console.log(chalk.green('┃ ') + chalk.gray(` ... (${replaceLines.length - 5} more lines hidden)`).padEnd(width - 5) + chalk.gray(' ┃'));
|
|
136
182
|
}
|
|
137
183
|
|
|
138
|
-
//
|
|
184
|
+
// 4. Footer
|
|
139
185
|
console.log(chalk.gray('┗' + '━'.repeat(width - 2) + '┛'));
|
|
140
186
|
|
|
141
187
|
if (shouldTruncate) {
|
package/src/utils/tui.ts
CHANGED
|
@@ -51,7 +51,7 @@ export class TUI {
|
|
|
51
51
|
static clear() {
|
|
52
52
|
process.stdout.write('\x1b[2J\x1b[H');
|
|
53
53
|
this.drawHeader();
|
|
54
|
-
this.drawStatusBar(this.currentStatus);
|
|
54
|
+
this.drawStatusBar(this.currentStatus, true);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
/**
|
|
@@ -64,17 +64,18 @@ export class TUI {
|
|
|
64
64
|
|
|
65
65
|
// Move to top
|
|
66
66
|
process.stdout.write('\x1b[H');
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
process.stdout.write(chalk.bgCyan.black(' '.repeat(padding) + banner + ' '.repeat(width - banner.length - padding)) + '\n');
|
|
68
|
+
process.stdout.write(chalk.gray('─'.repeat(width)) + '\n');
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
/**
|
|
72
72
|
* Draw a real-time status bar at the bottom
|
|
73
73
|
*/
|
|
74
|
-
static drawStatusBar(status: string) {
|
|
75
|
-
this.currentStatus = status;
|
|
74
|
+
static drawStatusBar(status: string, force: boolean = false) {
|
|
76
75
|
if (!this.isInitialized) return;
|
|
76
|
+
if (this.currentStatus === status && !force) return; // Prevent flicker
|
|
77
77
|
|
|
78
|
+
this.currentStatus = status;
|
|
78
79
|
const width = process.stdout.columns || 80;
|
|
79
80
|
const height = process.stdout.rows || 24;
|
|
80
81
|
|
|
@@ -92,6 +93,33 @@ export class TUI {
|
|
|
92
93
|
process.stdout.write('\x1b[u');
|
|
93
94
|
}
|
|
94
95
|
|
|
96
|
+
/**
|
|
97
|
+
* Draw a premium code container with traffic lights
|
|
98
|
+
*/
|
|
99
|
+
static drawCodeContainer(title: string, lang: string, content: string) {
|
|
100
|
+
const width = Math.min(process.stdout.columns || 80, 100);
|
|
101
|
+
const lines = content.split('\n');
|
|
102
|
+
|
|
103
|
+
console.log();
|
|
104
|
+
// 1. Title Bar
|
|
105
|
+
const trafficLights = chalk.red('●') + ' ' + chalk.yellow('●') + ' ' + chalk.green('●');
|
|
106
|
+
const displayTitle = ` 📝 ${title} (${lang}) `;
|
|
107
|
+
|
|
108
|
+
console.log(chalk.gray('┏' + '━'.repeat(width - 2) + '┓'));
|
|
109
|
+
console.log(chalk.gray('┃ ') + trafficLights + ' ' + chalk.cyan.bold(displayTitle).padEnd(width - 10) + chalk.gray(' ┃'));
|
|
110
|
+
console.log(chalk.gray('┣' + '━'.repeat(width - 2) + '┫'));
|
|
111
|
+
|
|
112
|
+
// 2. Content
|
|
113
|
+
lines.forEach(line => {
|
|
114
|
+
const formattedLine = line.substring(0, width - 6);
|
|
115
|
+
console.log(chalk.gray('┃ ') + chalk.white(formattedLine).padEnd(width - 4) + chalk.gray(' ┃'));
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// 3. Footer
|
|
119
|
+
console.log(chalk.gray('┗' + '━'.repeat(width - 2) + '┛'));
|
|
120
|
+
console.log();
|
|
121
|
+
}
|
|
122
|
+
|
|
95
123
|
/**
|
|
96
124
|
* Log content into the scrollable area
|
|
97
125
|
*/
|
|
@@ -100,9 +128,6 @@ export class TUI {
|
|
|
100
128
|
console.log(content);
|
|
101
129
|
return;
|
|
102
130
|
}
|
|
103
|
-
|
|
104
|
-
// Since we are in an alternative buffer, standard console.log works
|
|
105
|
-
// within the viewport between header and footer.
|
|
106
131
|
console.log(content);
|
|
107
132
|
}
|
|
108
133
|
}
|