@nanocollective/nanocoder 1.16.2 → 1.16.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -1
- package/dist/commands/update.d.ts +6 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +129 -3
- package/dist/commands/update.js.map +1 -1
- package/dist/components/assistant-message.d.ts +1 -4
- package/dist/components/assistant-message.d.ts.map +1 -1
- package/dist/components/assistant-message.js +1 -199
- package/dist/components/assistant-message.js.map +1 -1
- package/dist/components/status.d.ts +1 -6
- package/dist/components/status.d.ts.map +1 -1
- package/dist/components/status.js +3 -2
- package/dist/components/status.js.map +1 -1
- package/dist/components/user-input.d.ts.map +1 -1
- package/dist/components/user-input.js +61 -19
- package/dist/components/user-input.js.map +1 -1
- package/dist/components/warning-message.d.ts +7 -0
- package/dist/components/warning-message.d.ts.map +1 -0
- package/dist/components/warning-message.js +12 -0
- package/dist/components/warning-message.js.map +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +19 -11
- package/dist/config/index.js.map +1 -1
- package/dist/config/paths.d.ts +1 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +48 -2
- package/dist/config/paths.js.map +1 -1
- package/dist/config/paths.spec.d.ts +2 -0
- package/dist/config/paths.spec.d.ts.map +1 -0
- package/dist/config/paths.spec.js +114 -0
- package/dist/config/paths.spec.js.map +1 -0
- package/dist/config/themes.d.ts.map +1 -1
- package/dist/config/themes.js +19 -0
- package/dist/config/themes.js.map +1 -1
- package/dist/hooks/useAppState.d.ts.map +1 -1
- package/dist/hooks/useAppState.js +8 -15
- package/dist/hooks/useAppState.js.map +1 -1
- package/dist/hooks/useInputState.d.ts.map +1 -1
- package/dist/hooks/useInputState.js +95 -8
- package/dist/hooks/useInputState.js.map +1 -1
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
- package/dist/hooks/useTerminalWidth.js +6 -0
- package/dist/hooks/useTerminalWidth.js.map +1 -1
- package/dist/markdown-parser/html-entities.d.ts +2 -0
- package/dist/markdown-parser/html-entities.d.ts.map +1 -0
- package/dist/markdown-parser/html-entities.js +41 -0
- package/dist/markdown-parser/html-entities.js.map +1 -0
- package/dist/markdown-parser/html-entities.spec.d.ts +2 -0
- package/dist/markdown-parser/html-entities.spec.d.ts.map +1 -0
- package/dist/markdown-parser/html-entities.spec.js +73 -0
- package/dist/markdown-parser/html-entities.spec.js.map +1 -0
- package/dist/markdown-parser/index.d.ts +6 -0
- package/dist/markdown-parser/index.d.ts.map +1 -0
- package/dist/markdown-parser/index.js +97 -0
- package/dist/markdown-parser/index.js.map +1 -0
- package/dist/markdown-parser/index.spec.d.ts +2 -0
- package/dist/markdown-parser/index.spec.d.ts.map +1 -0
- package/dist/markdown-parser/index.spec.js +245 -0
- package/dist/markdown-parser/index.spec.js.map +1 -0
- package/dist/markdown-parser/table-parser.d.ts +3 -0
- package/dist/markdown-parser/table-parser.d.ts.map +1 -0
- package/dist/markdown-parser/table-parser.js +92 -0
- package/dist/markdown-parser/table-parser.js.map +1 -0
- package/dist/markdown-parser/table-parser.spec.d.ts +2 -0
- package/dist/markdown-parser/table-parser.spec.d.ts.map +1 -0
- package/dist/markdown-parser/table-parser.spec.js +120 -0
- package/dist/markdown-parser/table-parser.spec.js.map +1 -0
- package/dist/markdown-parser/utils.d.ts +2 -0
- package/dist/markdown-parser/utils.d.ts.map +1 -0
- package/dist/markdown-parser/utils.js +14 -0
- package/dist/markdown-parser/utils.js.map +1 -0
- package/dist/markdown-parser/utils.spec.d.ts +2 -0
- package/dist/markdown-parser/utils.spec.d.ts.map +1 -0
- package/dist/markdown-parser/utils.spec.js +59 -0
- package/dist/markdown-parser/utils.spec.js.map +1 -0
- package/dist/tools/execute-bash.d.ts.map +1 -1
- package/dist/tools/execute-bash.js +5 -3
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/tools/find-files.d.ts +3 -0
- package/dist/tools/find-files.d.ts.map +1 -0
- package/dist/tools/find-files.js +186 -0
- package/dist/tools/find-files.js.map +1 -0
- package/dist/tools/index.js +4 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +143 -9
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/search-file-contents.d.ts +3 -0
- package/dist/tools/search-file-contents.d.ts.map +1 -0
- package/dist/tools/search-file-contents.js +164 -0
- package/dist/tools/search-file-contents.js.map +1 -0
- package/dist/types/markdown-parser.d.ts +11 -0
- package/dist/types/markdown-parser.d.ts.map +1 -0
- package/dist/types/markdown-parser.js +2 -0
- package/dist/types/markdown-parser.js.map +1 -0
- package/dist/types/ui.d.ts +1 -1
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/types/utils.d.ts +2 -1
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/usage/storage.d.ts +1 -1
- package/dist/usage/storage.d.ts.map +1 -1
- package/dist/usage/storage.js +55 -9
- package/dist/usage/storage.js.map +1 -1
- package/dist/usage/storage.spec.js +136 -2
- package/dist/usage/storage.spec.js.map +1 -1
- package/dist/utils/installation-detector.d.ts +16 -0
- package/dist/utils/installation-detector.d.ts.map +1 -0
- package/dist/utils/installation-detector.js +118 -0
- package/dist/utils/installation-detector.js.map +1 -0
- package/dist/utils/installation-detector.spec.d.ts +2 -0
- package/dist/utils/installation-detector.spec.d.ts.map +1 -0
- package/dist/utils/installation-detector.spec.js +141 -0
- package/dist/utils/installation-detector.spec.js.map +1 -0
- package/dist/utils/message-queue.d.ts +2 -0
- package/dist/utils/message-queue.d.ts.map +1 -1
- package/dist/utils/message-queue.js +11 -0
- package/dist/utils/message-queue.js.map +1 -1
- package/dist/utils/paste-detection.d.ts.map +1 -1
- package/dist/utils/paste-detection.js +8 -3
- package/dist/utils/paste-detection.js.map +1 -1
- package/dist/utils/paste-detection.spec.js +15 -8
- package/dist/utils/paste-detection.spec.js.map +1 -1
- package/dist/utils/paste-utils.d.ts.map +1 -1
- package/dist/utils/paste-utils.js +4 -2
- package/dist/utils/paste-utils.js.map +1 -1
- package/dist/utils/paste-utils.spec.js +19 -3
- package/dist/utils/paste-utils.spec.js.map +1 -1
- package/dist/utils/update-checker.d.ts.map +1 -1
- package/dist/utils/update-checker.js +31 -3
- package/dist/utils/update-checker.js.map +1 -1
- package/dist/utils/update-checker.spec.d.ts +2 -0
- package/dist/utils/update-checker.spec.d.ts.map +1 -0
- package/dist/utils/update-checker.spec.js +280 -0
- package/dist/utils/update-checker.spec.js.map +1 -0
- package/dist/wizard/steps/location-step.js +2 -2
- package/dist/wizard/steps/location-step.js.map +1 -1
- package/package.json +1 -1
- package/source/app/prompts/main-prompt.md +67 -23
- package/dist/components/update-message.d.ts +0 -7
- package/dist/components/update-message.d.ts.map +0 -1
- package/dist/components/update-message.js +0 -93
- package/dist/components/update-message.js.map +0 -1
- package/dist/tools/read-many-files.d.ts +0 -3
- package/dist/tools/read-many-files.d.ts.map +0 -1
- package/dist/tools/read-many-files.js +0 -169
- package/dist/tools/read-many-files.js.map +0 -1
- package/dist/tools/search-files.d.ts +0 -3
- package/dist/tools/search-files.d.ts.map +0 -1
- package/dist/tools/search-files.js +0 -251
- package/dist/tools/search-files.js.map +0 -1
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { parseMarkdown } from './index.js';
|
|
3
|
+
console.log(`\nindex.spec.ts`);
|
|
4
|
+
const mockColors = {
|
|
5
|
+
primary: '#3b82f6',
|
|
6
|
+
secondary: '#6b7280',
|
|
7
|
+
success: '#10b981',
|
|
8
|
+
error: '#ef4444',
|
|
9
|
+
warning: '#f59e0b',
|
|
10
|
+
info: '#3b82f6',
|
|
11
|
+
white: '#ffffff',
|
|
12
|
+
tool: '#8b5cf6',
|
|
13
|
+
};
|
|
14
|
+
// Inline code tests
|
|
15
|
+
test('parseMarkdown handles inline code', t => {
|
|
16
|
+
const text = 'Use `npm install` to install packages';
|
|
17
|
+
const result = parseMarkdown(text, mockColors);
|
|
18
|
+
t.true(result.includes('npm install'));
|
|
19
|
+
t.false(result.includes('`npm install`'));
|
|
20
|
+
});
|
|
21
|
+
// Bold and italic tests
|
|
22
|
+
test('parseMarkdown handles bold text', t => {
|
|
23
|
+
const text = 'This is **bold** text';
|
|
24
|
+
const result = parseMarkdown(text, mockColors);
|
|
25
|
+
t.true(result.includes('bold'));
|
|
26
|
+
});
|
|
27
|
+
test('parseMarkdown handles italic text', t => {
|
|
28
|
+
const text = 'This is *italic* text';
|
|
29
|
+
const result = parseMarkdown(text, mockColors);
|
|
30
|
+
t.true(result.includes('italic'));
|
|
31
|
+
});
|
|
32
|
+
// Underscore preservation tests
|
|
33
|
+
test('parseMarkdown preserves underscores in identifiers', t => {
|
|
34
|
+
const text = 'Use `create_file`, `read_file`, or `search_file_contents` functions';
|
|
35
|
+
const result = parseMarkdown(text, mockColors);
|
|
36
|
+
t.true(result.includes('create_file'));
|
|
37
|
+
t.true(result.includes('read_file'));
|
|
38
|
+
t.true(result.includes('search_file_contents'));
|
|
39
|
+
});
|
|
40
|
+
test('parseMarkdown preserves underscores in regular text', t => {
|
|
41
|
+
const text = 'The variable_name and function_call should remain intact';
|
|
42
|
+
const result = parseMarkdown(text, mockColors);
|
|
43
|
+
t.true(result.includes('variable_name'));
|
|
44
|
+
t.true(result.includes('function_call'));
|
|
45
|
+
});
|
|
46
|
+
// Heading tests
|
|
47
|
+
test('parseMarkdown handles headings', t => {
|
|
48
|
+
const text = '# Heading 1\n## Heading 2\n### Heading 3';
|
|
49
|
+
const result = parseMarkdown(text, mockColors);
|
|
50
|
+
t.true(result.includes('Heading 1'));
|
|
51
|
+
t.true(result.includes('Heading 2'));
|
|
52
|
+
t.true(result.includes('Heading 3'));
|
|
53
|
+
});
|
|
54
|
+
// Link tests
|
|
55
|
+
test('parseMarkdown handles links', t => {
|
|
56
|
+
const text = 'Visit [Google](https://google.com) for search';
|
|
57
|
+
const result = parseMarkdown(text, mockColors);
|
|
58
|
+
t.true(result.includes('Google'));
|
|
59
|
+
t.true(result.includes('https://google.com'));
|
|
60
|
+
});
|
|
61
|
+
// Blockquote tests
|
|
62
|
+
test('parseMarkdown handles blockquotes', t => {
|
|
63
|
+
const text = '> This is a quote\n> Another line';
|
|
64
|
+
const result = parseMarkdown(text, mockColors);
|
|
65
|
+
t.true(result.includes('This is a quote'));
|
|
66
|
+
t.true(result.includes('Another line'));
|
|
67
|
+
});
|
|
68
|
+
// List tests
|
|
69
|
+
test('parseMarkdown handles unordered lists', t => {
|
|
70
|
+
const text = '- Item 1\n- Item 2\n- Item 3';
|
|
71
|
+
const result = parseMarkdown(text, mockColors);
|
|
72
|
+
t.true(result.includes('•'));
|
|
73
|
+
t.true(result.includes('Item 1'));
|
|
74
|
+
t.true(result.includes('Item 2'));
|
|
75
|
+
});
|
|
76
|
+
test('parseMarkdown handles ordered lists', t => {
|
|
77
|
+
const text = '1. First\n2. Second\n3. Third';
|
|
78
|
+
const result = parseMarkdown(text, mockColors);
|
|
79
|
+
t.true(result.includes('1.'));
|
|
80
|
+
t.true(result.includes('2.'));
|
|
81
|
+
t.true(result.includes('3.'));
|
|
82
|
+
t.true(result.includes('First'));
|
|
83
|
+
t.true(result.includes('Second'));
|
|
84
|
+
});
|
|
85
|
+
test('parseMarkdown handles nested/indented bullet lists', t => {
|
|
86
|
+
const text = `- Top level item
|
|
87
|
+
- Nested item 1
|
|
88
|
+
- Nested item 2
|
|
89
|
+
- Double nested
|
|
90
|
+
- Another top level`;
|
|
91
|
+
const result = parseMarkdown(text, mockColors);
|
|
92
|
+
t.true(result.includes(' • Nested item 1'));
|
|
93
|
+
t.true(result.includes(' • Double nested'));
|
|
94
|
+
});
|
|
95
|
+
test('parseMarkdown handles nested numbered lists', t => {
|
|
96
|
+
const text = `1. First level
|
|
97
|
+
1. Nested first
|
|
98
|
+
2. Nested second
|
|
99
|
+
2. Back to first level`;
|
|
100
|
+
const result = parseMarkdown(text, mockColors);
|
|
101
|
+
t.true(result.includes(' 1. Nested first'));
|
|
102
|
+
t.true(result.includes(' 2. Nested second'));
|
|
103
|
+
});
|
|
104
|
+
// HTML entity tests
|
|
105
|
+
test('parseMarkdown decodes HTML entities', t => {
|
|
106
|
+
const text = '<div> & ©';
|
|
107
|
+
const result = parseMarkdown(text, mockColors);
|
|
108
|
+
t.true(result.includes('<div>'));
|
|
109
|
+
t.true(result.includes('&'));
|
|
110
|
+
t.true(result.includes('©'));
|
|
111
|
+
});
|
|
112
|
+
// Table tests
|
|
113
|
+
test('parseMarkdown handles tables', t => {
|
|
114
|
+
const text = `| Name | Age |
|
|
115
|
+
|------|-----|
|
|
116
|
+
| John | 25 |`;
|
|
117
|
+
const result = parseMarkdown(text, mockColors);
|
|
118
|
+
t.true(result.includes('Name'));
|
|
119
|
+
t.true(result.includes('John'));
|
|
120
|
+
});
|
|
121
|
+
test('parseMarkdown renders tables with plain text (no markdown)', t => {
|
|
122
|
+
const text = `| Command | Description |
|
|
123
|
+
|---------|-------------|
|
|
124
|
+
| \`npm install\` | Install dependencies |
|
|
125
|
+
| \`npm start\` | Start the application |`;
|
|
126
|
+
const result = parseMarkdown(text, mockColors);
|
|
127
|
+
t.true(result.includes('npm install'));
|
|
128
|
+
t.true(result.includes('npm start'));
|
|
129
|
+
t.false(result.includes('`npm install`'));
|
|
130
|
+
});
|
|
131
|
+
// Code block tests
|
|
132
|
+
test('parseMarkdown handles code blocks with language', t => {
|
|
133
|
+
const text = '```javascript\nconst x = 5;\n```';
|
|
134
|
+
const result = parseMarkdown(text, mockColors);
|
|
135
|
+
t.true(result.includes('const x = 5'));
|
|
136
|
+
});
|
|
137
|
+
test('parseMarkdown handles code blocks without language', t => {
|
|
138
|
+
const text = '```\nPlain code\n```';
|
|
139
|
+
const result = parseMarkdown(text, mockColors);
|
|
140
|
+
t.true(result.includes('Plain code'));
|
|
141
|
+
});
|
|
142
|
+
// Edge case tests
|
|
143
|
+
test('parseMarkdown does not create bullet list from hyphen in middle of line', t => {
|
|
144
|
+
const text = 'This is not - a list';
|
|
145
|
+
const result = parseMarkdown(text, mockColors);
|
|
146
|
+
t.false(result.includes('•'));
|
|
147
|
+
t.true(result.includes('This is not - a list'));
|
|
148
|
+
});
|
|
149
|
+
test('parseMarkdown does not format asterisks in math expressions', t => {
|
|
150
|
+
const text = 'Calculate 5 * 3 * 2 = 30';
|
|
151
|
+
const result = parseMarkdown(text, mockColors);
|
|
152
|
+
t.true(result.includes('5 * 3 * 2'));
|
|
153
|
+
});
|
|
154
|
+
test('parseMarkdown does not format asterisks in file globs', t => {
|
|
155
|
+
const text = 'Match files with *.js or *.tsx patterns';
|
|
156
|
+
const result = parseMarkdown(text, mockColors);
|
|
157
|
+
t.true(result.includes('*.js'));
|
|
158
|
+
t.true(result.includes('*.tsx'));
|
|
159
|
+
});
|
|
160
|
+
test('parseMarkdown does not create heading from hash in middle of line', t => {
|
|
161
|
+
const text = 'This # is not a heading';
|
|
162
|
+
const result = parseMarkdown(text, mockColors);
|
|
163
|
+
t.true(result.includes('This # is not a heading'));
|
|
164
|
+
});
|
|
165
|
+
test('parseMarkdown preserves asterisks inside code blocks', t => {
|
|
166
|
+
const text = '```javascript\nconst pattern = /\\*\\*/g;\n```';
|
|
167
|
+
const result = parseMarkdown(text, mockColors);
|
|
168
|
+
t.true(result.includes('/\\*\\*/g') || result.includes('**'));
|
|
169
|
+
});
|
|
170
|
+
test('parseMarkdown preserves markdown-like syntax inside inline code', t => {
|
|
171
|
+
const text = 'Use `**bold**` and `*italic*` syntax';
|
|
172
|
+
const result = parseMarkdown(text, mockColors);
|
|
173
|
+
// Code content should be preserved (though formatting may be applied by chalk)
|
|
174
|
+
t.false(result.includes('`**bold**`'));
|
|
175
|
+
t.false(result.includes('`*italic*`'));
|
|
176
|
+
});
|
|
177
|
+
test('parseMarkdown does not format single asterisk surrounded by word chars', t => {
|
|
178
|
+
const text = 'The pointer syntax is char*ptr or int*value';
|
|
179
|
+
const result = parseMarkdown(text, mockColors);
|
|
180
|
+
t.true(result.includes('char*ptr'));
|
|
181
|
+
t.true(result.includes('int*value'));
|
|
182
|
+
});
|
|
183
|
+
// BR tag test
|
|
184
|
+
test('parseMarkdown converts <br> tags to newlines', t => {
|
|
185
|
+
const text = 'Line one<br>Line two<br/>Line three<BR>Line four';
|
|
186
|
+
const result = parseMarkdown(text, mockColors);
|
|
187
|
+
const lines = result.split('\n');
|
|
188
|
+
t.true(lines.length >= 4);
|
|
189
|
+
t.true(result.includes('Line one'));
|
|
190
|
+
t.true(result.includes('Line two'));
|
|
191
|
+
t.false(result.includes('<br'));
|
|
192
|
+
});
|
|
193
|
+
// Spacing tests
|
|
194
|
+
test('parseMarkdown preserves spacing before bullet lists', t => {
|
|
195
|
+
const text = `I can assist with tasks such as:
|
|
196
|
+
|
|
197
|
+
- First item
|
|
198
|
+
- Second item
|
|
199
|
+
|
|
200
|
+
Let me know what you'd like to work on.`;
|
|
201
|
+
const result = parseMarkdown(text, mockColors);
|
|
202
|
+
const lines = result.split('\n');
|
|
203
|
+
const suchAsIndex = lines.findIndex(l => l.includes('I can assist'));
|
|
204
|
+
const firstBulletIndex = lines.findIndex(l => l.includes('• First'));
|
|
205
|
+
t.true(firstBulletIndex - suchAsIndex >= 2, 'Should have blank line before list');
|
|
206
|
+
});
|
|
207
|
+
// Mixed content tests
|
|
208
|
+
test('parseMarkdown handles mixed markdown features', t => {
|
|
209
|
+
const text = `# Title
|
|
210
|
+
|
|
211
|
+
This is **bold** and *italic* text with \`code\`.
|
|
212
|
+
|
|
213
|
+
- List item 1
|
|
214
|
+
- List item 2
|
|
215
|
+
|
|
216
|
+
| Name | Value |
|
|
217
|
+
|------|-------|
|
|
218
|
+
| Test | 123 |`;
|
|
219
|
+
const result = parseMarkdown(text, mockColors);
|
|
220
|
+
t.true(result.includes('Title'));
|
|
221
|
+
t.true(result.includes('bold'));
|
|
222
|
+
t.true(result.includes('italic'));
|
|
223
|
+
t.true(result.includes('•'));
|
|
224
|
+
t.true(result.includes('Name'));
|
|
225
|
+
});
|
|
226
|
+
test('parseMarkdown handles plain text without markdown', t => {
|
|
227
|
+
const text = 'This is just plain text without any formatting';
|
|
228
|
+
const result = parseMarkdown(text, mockColors);
|
|
229
|
+
t.true(result.includes('This is just plain text'));
|
|
230
|
+
});
|
|
231
|
+
test('parseMarkdown handles empty string', t => {
|
|
232
|
+
const result = parseMarkdown('', mockColors);
|
|
233
|
+
t.is(result, '');
|
|
234
|
+
});
|
|
235
|
+
// Placeholder restoration test
|
|
236
|
+
test('parseMarkdown restores inline code placeholders correctly', t => {
|
|
237
|
+
const text = 'Use `npm install` and `npm start` commands';
|
|
238
|
+
const result = parseMarkdown(text, mockColors);
|
|
239
|
+
t.true(result.includes('npm install'));
|
|
240
|
+
t.true(result.includes('npm start'));
|
|
241
|
+
t.false(result.includes('__INLINE_CODE'));
|
|
242
|
+
t.false(result.includes('_INLINE'));
|
|
243
|
+
t.false(result.includes('CODE_'));
|
|
244
|
+
});
|
|
245
|
+
//# sourceMappingURL=index.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../../source/markdown-parser/index.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-parser.d.ts","sourceRoot":"","sources":["../../source/markdown-parser/table-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,0BAA0B,CAAC;AAIrD,wBAAgB,kBAAkB,CACjC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GACjB,MAAM,CAoGR"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import Table from 'cli-table3';
|
|
3
|
+
import { stripMarkdown } from './utils.js';
|
|
4
|
+
// Parse markdown tables using cli-table3
|
|
5
|
+
export function parseMarkdownTable(tableText, themeColors) {
|
|
6
|
+
const lines = tableText.trim().split('\n');
|
|
7
|
+
if (lines.length < 2)
|
|
8
|
+
return tableText;
|
|
9
|
+
// Extract rows
|
|
10
|
+
const rows = lines.map(line => line
|
|
11
|
+
.split('|')
|
|
12
|
+
.map(cell => cell.trim())
|
|
13
|
+
.filter(cell => cell.length > 0));
|
|
14
|
+
// Check if second row is separator (e.g., |---|---|)
|
|
15
|
+
const separatorRow = rows[1];
|
|
16
|
+
const isSeparator = separatorRow?.every(cell => /^:?-+:?$/.test(cell));
|
|
17
|
+
if (!isSeparator || rows.length < 3)
|
|
18
|
+
return tableText;
|
|
19
|
+
// Helper to clean cell content - remove all markdown and HTML
|
|
20
|
+
const cleanCell = (text) => {
|
|
21
|
+
let result = text;
|
|
22
|
+
// Remove inline code backticks (extract the content)
|
|
23
|
+
result = result.replace(/`([^`]+)`/g, '$1');
|
|
24
|
+
// Remove HTML tags
|
|
25
|
+
result = result.replace(/<[^>]+>/g, '');
|
|
26
|
+
// Strip markdown formatting (bold, italic, links)
|
|
27
|
+
result = stripMarkdown(result);
|
|
28
|
+
return result.trim();
|
|
29
|
+
};
|
|
30
|
+
// Extract header and data rows - clean all content
|
|
31
|
+
const header = rows[0].map(cell => cleanCell(cell));
|
|
32
|
+
const dataRows = rows.slice(2).map(row => row.map(cell => cleanCell(cell)));
|
|
33
|
+
// Calculate widths from cleaned content
|
|
34
|
+
const headerWidths = header.map(cell => cell.length);
|
|
35
|
+
const dataWidths = dataRows.map(row => row.map(cell => cell.length));
|
|
36
|
+
// Calculate column widths properly
|
|
37
|
+
const terminalWidth = process.stdout.columns || 120;
|
|
38
|
+
const numCols = header.length;
|
|
39
|
+
// Get max content width for each column
|
|
40
|
+
const contentWidths = headerWidths.map((headerWidth, colIdx) => {
|
|
41
|
+
let maxWidth = headerWidth;
|
|
42
|
+
for (const rowWidths of dataWidths) {
|
|
43
|
+
if (rowWidths[colIdx]) {
|
|
44
|
+
maxWidth = Math.max(maxWidth, rowWidths[colIdx]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return maxWidth;
|
|
48
|
+
});
|
|
49
|
+
// Calculate available width (accounting for borders and padding)
|
|
50
|
+
const borderWidth = numCols + 1; // vertical bars
|
|
51
|
+
const paddingWidth = numCols * 2; // 1 space on each side of each column
|
|
52
|
+
const availableWidth = terminalWidth - borderWidth - paddingWidth;
|
|
53
|
+
// Distribute width proportionally
|
|
54
|
+
const totalContentWidth = contentWidths.reduce((a, b) => a + b, 0);
|
|
55
|
+
const colWidths = contentWidths.map(width => Math.max(10, Math.floor((width / totalContentWidth) * availableWidth)));
|
|
56
|
+
// Create table with cli-table3 - full borders, proper alignment
|
|
57
|
+
const table = new Table({
|
|
58
|
+
head: header.map(cell => chalk.hex(themeColors.primary).bold(cell)),
|
|
59
|
+
colWidths: colWidths,
|
|
60
|
+
style: {
|
|
61
|
+
head: [], // Don't apply default styles, we're using chalk
|
|
62
|
+
border: ['gray'], // Subtle border color
|
|
63
|
+
'padding-left': 1,
|
|
64
|
+
'padding-right': 1,
|
|
65
|
+
},
|
|
66
|
+
chars: {
|
|
67
|
+
top: '─',
|
|
68
|
+
'top-mid': '┬',
|
|
69
|
+
'top-left': '┌',
|
|
70
|
+
'top-right': '┐',
|
|
71
|
+
bottom: '─',
|
|
72
|
+
'bottom-mid': '┴',
|
|
73
|
+
'bottom-left': '└',
|
|
74
|
+
'bottom-right': '┘',
|
|
75
|
+
left: '│',
|
|
76
|
+
'left-mid': '├',
|
|
77
|
+
mid: '─',
|
|
78
|
+
'mid-mid': '┼',
|
|
79
|
+
right: '│',
|
|
80
|
+
'right-mid': '┤',
|
|
81
|
+
middle: '│',
|
|
82
|
+
},
|
|
83
|
+
wordWrap: true,
|
|
84
|
+
wrapOnWordBoundary: true,
|
|
85
|
+
});
|
|
86
|
+
// Add data rows - don't style them, let cli-table3 handle layout
|
|
87
|
+
for (const row of dataRows) {
|
|
88
|
+
table.push(row);
|
|
89
|
+
}
|
|
90
|
+
return table.toString();
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=table-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-parser.js","sourceRoot":"","sources":["../../source/markdown-parser/table-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-parser.spec.d.ts","sourceRoot":"","sources":["../../source/markdown-parser/table-parser.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { parseMarkdownTable } from './table-parser.js';
|
|
3
|
+
console.log(`\ntable-parser.spec.ts`);
|
|
4
|
+
const mockColors = {
|
|
5
|
+
primary: '#3b82f6',
|
|
6
|
+
secondary: '#6b7280',
|
|
7
|
+
success: '#10b981',
|
|
8
|
+
error: '#ef4444',
|
|
9
|
+
warning: '#f59e0b',
|
|
10
|
+
info: '#3b82f6',
|
|
11
|
+
white: '#ffffff',
|
|
12
|
+
tool: '#8b5cf6',
|
|
13
|
+
};
|
|
14
|
+
test('parseMarkdownTable handles simple two-column table', t => {
|
|
15
|
+
const table = `| Name | Age |
|
|
16
|
+
|------|-----|
|
|
17
|
+
| John | 25 |
|
|
18
|
+
| Jane | 30 |`;
|
|
19
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
20
|
+
t.true(result.includes('Name'));
|
|
21
|
+
t.true(result.includes('Age'));
|
|
22
|
+
t.true(result.includes('John'));
|
|
23
|
+
t.true(result.includes('Jane'));
|
|
24
|
+
t.true(result.includes('25'));
|
|
25
|
+
t.true(result.includes('30'));
|
|
26
|
+
});
|
|
27
|
+
test('parseMarkdownTable handles table with varying cell lengths', t => {
|
|
28
|
+
const table = `| Short | Very Long Column Name |
|
|
29
|
+
|-------|----------------------|
|
|
30
|
+
| A | This is a much longer text |
|
|
31
|
+
| B | Short |`;
|
|
32
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
33
|
+
t.true(result.includes('Short'));
|
|
34
|
+
t.true(result.includes('Very Long Column Name'));
|
|
35
|
+
t.true(result.includes('This is a much longer text'));
|
|
36
|
+
});
|
|
37
|
+
test('parseMarkdownTable returns original text for invalid table', t => {
|
|
38
|
+
const table = `Not a table at all`;
|
|
39
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
40
|
+
t.is(result, table);
|
|
41
|
+
});
|
|
42
|
+
test('parseMarkdownTable returns original text for table without data rows', t => {
|
|
43
|
+
const table = `| Name | Age |
|
|
44
|
+
|------|-----|`;
|
|
45
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
46
|
+
t.is(result, table);
|
|
47
|
+
});
|
|
48
|
+
test('parseMarkdownTable handles table with empty cells', t => {
|
|
49
|
+
const table = `| Name | Age |
|
|
50
|
+
|------|-----|
|
|
51
|
+
| John | |
|
|
52
|
+
| | 30 |`;
|
|
53
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
54
|
+
t.true(result.includes('John'));
|
|
55
|
+
t.true(result.includes('30'));
|
|
56
|
+
});
|
|
57
|
+
test('parseMarkdownTable normalizes column count', t => {
|
|
58
|
+
const table = `| A | B | C |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| 1 | 2 |
|
|
61
|
+
| 3 | 4 | 5 | 6 |`;
|
|
62
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
63
|
+
// Should handle mismatched columns gracefully
|
|
64
|
+
t.true(typeof result === 'string');
|
|
65
|
+
t.true(result.length > 0);
|
|
66
|
+
});
|
|
67
|
+
test('parseMarkdownTable strips markdown from cells', t => {
|
|
68
|
+
const table = `| Command | Description |
|
|
69
|
+
|---------|-------------|
|
|
70
|
+
| \`npm install\` | Install **dependencies** |
|
|
71
|
+
| \`npm start\` | Start the *application* |`;
|
|
72
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
73
|
+
// Should have plain text (backticks and formatting removed)
|
|
74
|
+
t.true(result.includes('npm install'));
|
|
75
|
+
t.true(result.includes('npm start'));
|
|
76
|
+
t.true(result.includes('dependencies'));
|
|
77
|
+
t.true(result.includes('application'));
|
|
78
|
+
// Should NOT have markdown syntax
|
|
79
|
+
t.false(result.includes('`npm install`'));
|
|
80
|
+
t.false(result.includes('**dependencies**'));
|
|
81
|
+
t.false(result.includes('*application*'));
|
|
82
|
+
});
|
|
83
|
+
test('parseMarkdownTable strips HTML from cells', t => {
|
|
84
|
+
const table = `| Name | Description |
|
|
85
|
+
|------|-------------|
|
|
86
|
+
| Test | Text with <br> tag |
|
|
87
|
+
| Another | Text with <b>bold</b> |`;
|
|
88
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
89
|
+
t.true(result.includes('Text with tag')); // HTML tag removed
|
|
90
|
+
t.true(result.includes('Text with bold')); // HTML tags removed
|
|
91
|
+
t.false(result.includes('<br>'));
|
|
92
|
+
t.false(result.includes('<b>'));
|
|
93
|
+
});
|
|
94
|
+
test('parseMarkdownTable handles links in cells', t => {
|
|
95
|
+
const table = `| Name | Link |
|
|
96
|
+
|------|------|
|
|
97
|
+
| Google | [Visit](https://google.com) |`;
|
|
98
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
99
|
+
t.true(result.includes('Visit'));
|
|
100
|
+
t.false(result.includes('[Visit]'));
|
|
101
|
+
t.false(result.includes('(https://google.com)'));
|
|
102
|
+
});
|
|
103
|
+
test('parseMarkdownTable handles alignment markers', t => {
|
|
104
|
+
const table = `| Left | Center | Right |
|
|
105
|
+
|:-----|:------:|------:|
|
|
106
|
+
| A | B | C |`;
|
|
107
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
108
|
+
t.true(result.includes('Left'));
|
|
109
|
+
t.true(result.includes('Center'));
|
|
110
|
+
t.true(result.includes('Right'));
|
|
111
|
+
});
|
|
112
|
+
test('parseMarkdownTable creates table with borders', t => {
|
|
113
|
+
const table = `| A | B |
|
|
114
|
+
|---|---|
|
|
115
|
+
| 1 | 2 |`;
|
|
116
|
+
const result = parseMarkdownTable(table, mockColors);
|
|
117
|
+
// Should contain table border characters
|
|
118
|
+
t.true(result.includes('─') || result.includes('│'));
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=table-parser.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-parser.spec.js","sourceRoot":"","sources":["../../source/markdown-parser/table-parser.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../source/markdown-parser/utils.ts"],"names":[],"mappings":"AACA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWlD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Strip markdown formatting from text (for width calculations)
|
|
2
|
+
export function stripMarkdown(text) {
|
|
3
|
+
let result = text;
|
|
4
|
+
// Remove inline code
|
|
5
|
+
result = result.replace(/`([^`]+)`/g, '$1');
|
|
6
|
+
// Remove bold
|
|
7
|
+
result = result.replace(/\*\*([^*]+)\*\*/g, '$1');
|
|
8
|
+
// Remove italic
|
|
9
|
+
result = result.replace(/\*([^*]+)\*/g, '$1');
|
|
10
|
+
// Remove links
|
|
11
|
+
result = result.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
|
|
12
|
+
return result;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../source/markdown-parser/utils.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,qBAAqB;IACrB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC5C,cAAc;IACd,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAClD,gBAAgB;IAChB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC9C,eAAe;IACf,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.spec.d.ts","sourceRoot":"","sources":["../../source/markdown-parser/utils.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { stripMarkdown } from './utils.js';
|
|
3
|
+
console.log(`\nutils.spec.ts`);
|
|
4
|
+
test('stripMarkdown removes inline code', t => {
|
|
5
|
+
const text = 'Use `npm install` to install';
|
|
6
|
+
const result = stripMarkdown(text);
|
|
7
|
+
t.is(result, 'Use npm install to install');
|
|
8
|
+
});
|
|
9
|
+
test('stripMarkdown removes bold with double asterisks', t => {
|
|
10
|
+
const text = 'This is **bold** text';
|
|
11
|
+
const result = stripMarkdown(text);
|
|
12
|
+
t.is(result, 'This is bold text');
|
|
13
|
+
});
|
|
14
|
+
test('stripMarkdown removes italic with single asterisks', t => {
|
|
15
|
+
const text = 'This is *italic* text';
|
|
16
|
+
const result = stripMarkdown(text);
|
|
17
|
+
t.is(result, 'This is italic text');
|
|
18
|
+
});
|
|
19
|
+
test('stripMarkdown removes links', t => {
|
|
20
|
+
const text = 'Visit [Google](https://google.com) for search';
|
|
21
|
+
const result = stripMarkdown(text);
|
|
22
|
+
t.is(result, 'Visit Google for search');
|
|
23
|
+
});
|
|
24
|
+
test('stripMarkdown handles multiple formatting types', t => {
|
|
25
|
+
const text = 'Use **bold** and *italic* with `code` and [links](url)';
|
|
26
|
+
const result = stripMarkdown(text);
|
|
27
|
+
t.is(result, 'Use bold and italic with code and links');
|
|
28
|
+
});
|
|
29
|
+
test('stripMarkdown preserves plain text', t => {
|
|
30
|
+
const text = 'This is plain text with no formatting';
|
|
31
|
+
const result = stripMarkdown(text);
|
|
32
|
+
t.is(result, text);
|
|
33
|
+
});
|
|
34
|
+
test('stripMarkdown handles empty string', t => {
|
|
35
|
+
const result = stripMarkdown('');
|
|
36
|
+
t.is(result, '');
|
|
37
|
+
});
|
|
38
|
+
test('stripMarkdown preserves underscores', t => {
|
|
39
|
+
const text = 'snake_case and another_variable';
|
|
40
|
+
const result = stripMarkdown(text);
|
|
41
|
+
t.is(result, text);
|
|
42
|
+
});
|
|
43
|
+
test('stripMarkdown handles nested markdown', t => {
|
|
44
|
+
const text = '**This is `code` in bold**';
|
|
45
|
+
const result = stripMarkdown(text);
|
|
46
|
+
t.is(result, 'This is code in bold');
|
|
47
|
+
});
|
|
48
|
+
test('stripMarkdown handles multiple links', t => {
|
|
49
|
+
const text = '[First](url1) and [Second](url2)';
|
|
50
|
+
const result = stripMarkdown(text);
|
|
51
|
+
t.is(result, 'First and Second');
|
|
52
|
+
});
|
|
53
|
+
test('stripMarkdown handles incomplete markdown gracefully', t => {
|
|
54
|
+
const text = 'This has **incomplete bold and `incomplete code';
|
|
55
|
+
const result = stripMarkdown(text);
|
|
56
|
+
// Should leave incomplete markdown as-is
|
|
57
|
+
t.true(result.includes('**incomplete') || result.includes('incomplete'));
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=utils.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.spec.js","sourceRoot":"","sources":["../../source/markdown-parser/utils.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-bash.d.ts","sourceRoot":"","sources":["../../source/tools/execute-bash.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"execute-bash.d.ts","sourceRoot":"","sources":["../../source/tools/execute-bash.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAmKlD,eAAO,MAAM,eAAe,EAAE,cAM7B,CAAC"}
|
|
@@ -17,16 +17,18 @@ const executeExecuteBash = async (args) => {
|
|
|
17
17
|
proc.stderr.on('data', (data) => {
|
|
18
18
|
stderr += data.toString();
|
|
19
19
|
});
|
|
20
|
-
proc.on('close', () => {
|
|
20
|
+
proc.on('close', (code) => {
|
|
21
21
|
let fullOutput = '';
|
|
22
|
+
// Include exit code information
|
|
23
|
+
const exitCodeInfo = code !== null ? `EXIT_CODE: ${code}\n` : '';
|
|
22
24
|
if (stderr) {
|
|
23
|
-
fullOutput =
|
|
25
|
+
fullOutput = `${exitCodeInfo}STDERR:
|
|
24
26
|
${stderr}
|
|
25
27
|
STDOUT:
|
|
26
28
|
${stdout}`;
|
|
27
29
|
}
|
|
28
30
|
else {
|
|
29
|
-
fullOutput = stdout
|
|
31
|
+
fullOutput = `${exitCodeInfo}${stdout}`;
|
|
30
32
|
}
|
|
31
33
|
// Limit the context for LLM to first 2000 characters to prevent overwhelming the model
|
|
32
34
|
const llmContext = fullOutput.length > 2000
|