@taj-special/dravix-code 1.2.3 → 1.2.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/dist/cli/index.js +143 -96
- package/dist/utils/display.js +37 -21
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -3,15 +3,26 @@ import * as path from 'path';
|
|
|
3
3
|
import { randomBytes } from 'crypto';
|
|
4
4
|
import { execSync } from 'child_process';
|
|
5
5
|
import chalk from 'chalk';
|
|
6
|
-
import { banner, printHelp, printError, colors } from '../utils/display.js';
|
|
6
|
+
import { banner, printHelp, printError, colors, VERSION } from '../utils/display.js';
|
|
7
7
|
import { startRepl } from './repl.js';
|
|
8
|
-
import { isLoggedIn, logout,
|
|
9
|
-
import { checkUsage, usageBar, fmtNum, formatResetTime } from '../services/usage.js';
|
|
8
|
+
import { isLoggedIn, logout, saveConfig, AUTH_URL } from '../services/auth.js';
|
|
10
9
|
const POLL_URL = 'https://dravix.app/cli-auth.php';
|
|
11
10
|
const SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
12
11
|
function link(url) {
|
|
13
12
|
return `\x1b]8;;${url}\x1b\\${url}\x1b]8;;\x1b\\`;
|
|
14
13
|
}
|
|
14
|
+
function cx(s) {
|
|
15
|
+
const cols = process.stdout.columns ?? 80;
|
|
16
|
+
return ' '.repeat(Math.max(0, Math.floor((cols - s.length) / 2)));
|
|
17
|
+
}
|
|
18
|
+
function drawStars(count) {
|
|
19
|
+
const starChars = ['✦', '✧', '⋆', '·'];
|
|
20
|
+
for (let i = 0; i < count; i++) {
|
|
21
|
+
const cols = process.stdout.columns ?? 80;
|
|
22
|
+
const x = Math.floor(Math.random() * (cols - 10)) + 5;
|
|
23
|
+
console.log(' '.repeat(x) + colors.subtext(starChars[Math.floor(Math.random() * starChars.length)]));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
15
26
|
async function pollSession(sessionId) {
|
|
16
27
|
try {
|
|
17
28
|
const res = await fetch(`${POLL_URL}?action=poll&session=${sessionId}`);
|
|
@@ -25,47 +36,58 @@ async function pollSession(sessionId) {
|
|
|
25
36
|
}
|
|
26
37
|
async function showWelcome() {
|
|
27
38
|
const cols = process.stdout.columns ?? 80;
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
const DIM = colors.muted;
|
|
32
|
-
const G = colors.success;
|
|
33
|
-
const White = colors.text;
|
|
34
|
-
const Muted = colors.muted;
|
|
35
|
-
const line = () => DIM(' ' + '─'.repeat(W - 4));
|
|
36
|
-
const pad = (s, w) => s + ' '.repeat(Math.max(w - s.length, 0));
|
|
39
|
+
const rows = process.stdout.rows ?? 24;
|
|
40
|
+
const boxW = Math.min(cols - 6, 70);
|
|
41
|
+
const indent = ' '.repeat(Math.max(0, Math.floor((cols - boxW) / 2)));
|
|
37
42
|
console.clear();
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
console.log(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
console.log('
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
43
|
+
// Stars
|
|
44
|
+
drawStars(5);
|
|
45
|
+
// Brand
|
|
46
|
+
console.log(cx('Taj Special') + colors.subtext('Taj Special'));
|
|
47
|
+
// Logo
|
|
48
|
+
const logoLines = [
|
|
49
|
+
'██████╗ ██████╗ █████╗ ██╗ ██╗██╗██╗ ██╗',
|
|
50
|
+
'██╔══██╗██╔══██╗██╔══██╗██║ ██║██║╚██╗██╔╝',
|
|
51
|
+
'██║ ██║██████╔╝███████║██║ ██║██║ ╚███╔╝',
|
|
52
|
+
'██║ ██║██╔══██╗██╔══██║╚██╗ ██╔╝██║ ██╔██╗',
|
|
53
|
+
'██████╔╝██║ ██║██║ ██║ ╚████╔╝ ██║██╔╝ ██╗',
|
|
54
|
+
'╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═╝',
|
|
55
|
+
];
|
|
56
|
+
for (const line of logoLines) {
|
|
57
|
+
console.log(cx(line) + colors.primary.bold(line));
|
|
58
|
+
}
|
|
59
|
+
// CODE subtitle
|
|
60
|
+
console.log(cx('C O D E') + colors.accent.bold('C O D E'));
|
|
61
|
+
// More stars
|
|
62
|
+
drawStars(3);
|
|
63
|
+
console.log('');
|
|
64
|
+
// Input box (centered)
|
|
65
|
+
const innerW = boxW - 6;
|
|
66
|
+
const placeholder = 'Ask me anything...';
|
|
67
|
+
const display = placeholder.length > innerW ? placeholder.slice(0, innerW - 1) + '…' : placeholder;
|
|
68
|
+
const pPad = ' '.repeat(Math.max(innerW - display.length, 0));
|
|
69
|
+
console.log(indent + colors.dim('╭' + '─'.repeat(boxW - 2) + '╮'));
|
|
70
|
+
console.log(indent + colors.dim('│') + ' ' + colors.subtext(display) + pPad + ' ' + colors.dim('│'));
|
|
71
|
+
console.log(indent + colors.dim('│') + ' ' + colors.primary('Build') + colors.muted(' · ') + colors.text('Dravix Auto') + colors.muted(' (Titanium + Quantum)') + ' ' + colors.dim('│'));
|
|
72
|
+
console.log(indent + colors.dim('╰' + '─'.repeat(boxW - 2) + '╯'));
|
|
73
|
+
console.log('');
|
|
74
|
+
// Shortcuts
|
|
75
|
+
console.log(indent +
|
|
76
|
+
colors.primary('Tab') + colors.muted(' mode ') +
|
|
77
|
+
colors.primary('Ctrl+P') + colors.muted(' settings ') +
|
|
78
|
+
colors.primary('@') + colors.muted(' file ') +
|
|
79
|
+
colors.primary('$') + colors.muted(' agent ') +
|
|
80
|
+
colors.primary('/') + colors.muted(' commands'));
|
|
81
|
+
console.log('');
|
|
82
|
+
// CTA
|
|
64
83
|
const enterKey = chalk.bgHex('#312e81').hex('#c7d2fe').bold(' Enter ');
|
|
65
|
-
const escKey =
|
|
66
|
-
console.log(
|
|
67
|
-
console.log(
|
|
68
|
-
|
|
84
|
+
const escKey = colors.dim(' Esc ');
|
|
85
|
+
console.log(indent + enterKey + colors.muted(' Sign in with Google'));
|
|
86
|
+
console.log(indent + escKey + colors.muted(' Cancel'));
|
|
87
|
+
// Bottom bar
|
|
88
|
+
const bottomLeft = '~' + path.basename(process.cwd());
|
|
89
|
+
const bottomRight = 'v' + VERSION;
|
|
90
|
+
process.stdout.write(`\x1b[${rows};1H\x1b[2K` + colors.muted(bottomLeft) + ' '.repeat(Math.max(cols - bottomLeft.length - bottomRight.length, 2)) + colors.muted(bottomRight));
|
|
69
91
|
return new Promise((resolve) => {
|
|
70
92
|
process.stdin.setRawMode(true);
|
|
71
93
|
process.stdin.resume();
|
|
@@ -91,27 +113,43 @@ async function showWelcome() {
|
|
|
91
113
|
async function browserAuth() {
|
|
92
114
|
const sessionId = randomBytes(16).toString('hex');
|
|
93
115
|
const authUrl = `${AUTH_URL}?session=${sessionId}`;
|
|
94
|
-
const DIM = colors.muted;
|
|
95
|
-
const W = colors.text;
|
|
96
|
-
const P = colors.primary;
|
|
97
116
|
const cols = process.stdout.columns ?? 80;
|
|
98
|
-
const
|
|
117
|
+
const rows = process.stdout.rows ?? 24;
|
|
118
|
+
const boxW = Math.min(cols - 6, 70);
|
|
119
|
+
const indent = ' '.repeat(Math.max(0, Math.floor((cols - boxW) / 2)));
|
|
99
120
|
console.clear();
|
|
100
|
-
|
|
101
|
-
console.log(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
121
|
+
drawStars(4);
|
|
122
|
+
console.log(cx('Taj Special') + colors.subtext('Taj Special'));
|
|
123
|
+
const logoLines = [
|
|
124
|
+
'██████╗ ██████╗ █████╗ ██╗ ██╗██╗██╗ ██╗',
|
|
125
|
+
'██╔══██╗██╔══██╗██╔══██╗██║ ██║██║╚██╗██╔╝',
|
|
126
|
+
'██║ ██║██████╔╝███████║██║ ██║██║ ╚███╔╝',
|
|
127
|
+
'██║ ██║██╔══██╗██╔══██║╚██╗ ██╔╝██║ ██╔██╗',
|
|
128
|
+
'██████╔╝██║ ██║██║ ██║ ╚████╔╝ ██║██╔╝ ██╗',
|
|
129
|
+
'╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═╝',
|
|
130
|
+
];
|
|
131
|
+
for (const line of logoLines) {
|
|
132
|
+
console.log(cx(line) + colors.primary.bold(line));
|
|
133
|
+
}
|
|
134
|
+
console.log(cx('C O D E') + colors.accent.bold('C O D E'));
|
|
135
|
+
drawStars(2);
|
|
136
|
+
console.log('');
|
|
137
|
+
// Auth steps box
|
|
138
|
+
console.log(indent + colors.dim('╭' + '─'.repeat(boxW - 2) + '╮'));
|
|
139
|
+
console.log(indent + colors.dim('│') + ' ' + colors.text('Step 1 — ') + colors.muted('Open this link in your browser:') + ' ' + colors.dim('│'));
|
|
140
|
+
console.log(indent + colors.dim('│') + ' ' + colors.primary(link(authUrl)) + ' ' + colors.dim('│'));
|
|
141
|
+
console.log(indent + colors.dim('│') + ' ' + colors.dim('Step 2 — Sign in and authorize') + ' ' + colors.dim('│'));
|
|
142
|
+
console.log(indent + colors.dim('│') + ' ' + colors.dim('Step 3 — Return here (auto-connects)') + ' ' + colors.dim('│'));
|
|
143
|
+
console.log(indent + colors.dim('╰' + '─'.repeat(boxW - 2) + '╯'));
|
|
144
|
+
console.log('');
|
|
145
|
+
// Spinner
|
|
107
146
|
let frameIdx = 0;
|
|
108
147
|
await new Promise((resolve, reject) => {
|
|
109
148
|
let done = false;
|
|
110
149
|
const spinnerInterval = setInterval(() => {
|
|
111
150
|
if (done)
|
|
112
151
|
return;
|
|
113
|
-
process.stdout.write(`\r ${colors.muted(SPINNER[frameIdx % SPINNER.length])} ${colors.muted('Waiting for authentication...')}`);
|
|
114
|
-
frameIdx++;
|
|
152
|
+
process.stdout.write(`\r ${colors.muted(SPINNER[frameIdx++ % SPINNER.length])} ${colors.muted('Waiting for authentication...')}`);
|
|
115
153
|
}, 80);
|
|
116
154
|
const poll = async () => {
|
|
117
155
|
if (done)
|
|
@@ -122,8 +160,7 @@ async function browserAuth() {
|
|
|
122
160
|
clearInterval(spinnerInterval);
|
|
123
161
|
process.stdout.write('\r\x1b[K');
|
|
124
162
|
saveConfig({ token: result.token, name: result.name, email: result.email });
|
|
125
|
-
console.log(' ' + colors.success('✓') + ' ' +
|
|
126
|
-
console.log(DIM('\n ' + '─'.repeat(47)) + '\n');
|
|
163
|
+
console.log(' ' + colors.success('✓') + ' ' + colors.text('Signed in as ') + colors.primary.bold(result.name));
|
|
127
164
|
resolve();
|
|
128
165
|
return;
|
|
129
166
|
}
|
|
@@ -134,8 +171,7 @@ async function browserAuth() {
|
|
|
134
171
|
if (!done) {
|
|
135
172
|
done = true;
|
|
136
173
|
clearInterval(spinnerInterval);
|
|
137
|
-
|
|
138
|
-
reject(new Error('Authentication timed out after 5 minutes.'));
|
|
174
|
+
reject(new Error('Authentication timed out.'));
|
|
139
175
|
}
|
|
140
176
|
}, 300_000);
|
|
141
177
|
});
|
|
@@ -160,10 +196,7 @@ async function main() {
|
|
|
160
196
|
}
|
|
161
197
|
let justAuthenticated = false;
|
|
162
198
|
if (arg === '--login') {
|
|
163
|
-
if (isLoggedIn()) {
|
|
164
|
-
banner();
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
199
|
+
if (!isLoggedIn()) {
|
|
167
200
|
await browserAuth();
|
|
168
201
|
justAuthenticated = true;
|
|
169
202
|
}
|
|
@@ -172,41 +205,55 @@ async function main() {
|
|
|
172
205
|
await browserAuth();
|
|
173
206
|
justAuthenticated = true;
|
|
174
207
|
}
|
|
175
|
-
else {
|
|
176
|
-
banner();
|
|
177
|
-
}
|
|
178
|
-
const { name, email } = getSavedUser();
|
|
179
208
|
const cwd = (arg && !arg.startsWith('--')) ? path.resolve(arg) : process.cwd();
|
|
180
|
-
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
: colors.success;
|
|
199
|
-
const resetStr = formatResetTime(usage);
|
|
200
|
-
console.log(colors.muted(' Tokens ') +
|
|
201
|
-
barColor(bar) + ' ' +
|
|
202
|
-
colors.subtext(fmtNum(usage.tokens_used) + ' / ' + fmtNum(usage.limit)) +
|
|
203
|
-
DIM(' · resets in ' + resetStr));
|
|
209
|
+
// Draw the clean centered app screen
|
|
210
|
+
const cols = process.stdout.columns ?? 80;
|
|
211
|
+
const rows = process.stdout.rows ?? 24;
|
|
212
|
+
const boxW = Math.min(cols - 6, 70);
|
|
213
|
+
const indent = ' '.repeat(Math.max(0, Math.floor((cols - boxW) / 2)));
|
|
214
|
+
console.clear();
|
|
215
|
+
drawStars(5);
|
|
216
|
+
console.log(cx('Taj Special') + colors.subtext('Taj Special'));
|
|
217
|
+
const logoLines = [
|
|
218
|
+
'██████╗ ██████╗ █████╗ ██╗ ██╗██╗██╗ ██╗',
|
|
219
|
+
'██╔══██╗██╔══██╗██╔══██╗██║ ██║██║╚██╗██╔╝',
|
|
220
|
+
'██║ ██║██████╔╝███████║██║ ██║██║ ╚███╔╝',
|
|
221
|
+
'██║ ██║██╔══██╗██╔══██║╚██╗ ██╔╝██║ ██╔██╗',
|
|
222
|
+
'██████╔╝██║ ██║██║ ██║ ╚████╔╝ ██║██╔╝ ██╗',
|
|
223
|
+
'╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═╝',
|
|
224
|
+
];
|
|
225
|
+
for (const line of logoLines) {
|
|
226
|
+
console.log(cx(line) + colors.primary.bold(line));
|
|
204
227
|
}
|
|
205
|
-
console.log(
|
|
206
|
-
|
|
207
|
-
console.log(
|
|
208
|
-
|
|
209
|
-
|
|
228
|
+
console.log(cx('C O D E') + colors.accent.bold('C O D E'));
|
|
229
|
+
drawStars(3);
|
|
230
|
+
console.log('');
|
|
231
|
+
// Input box
|
|
232
|
+
const innerW = boxW - 6;
|
|
233
|
+
const placeholder = 'Ask me anything...';
|
|
234
|
+
const display = placeholder.length > innerW ? placeholder.slice(0, innerW - 1) + '…' : placeholder;
|
|
235
|
+
const pPad = ' '.repeat(Math.max(innerW - display.length, 0));
|
|
236
|
+
console.log(indent + colors.dim('╭' + '─'.repeat(boxW - 2) + '╮'));
|
|
237
|
+
console.log(indent + colors.dim('│') + ' ' + colors.subtext(display) + pPad + ' ' + colors.dim('│'));
|
|
238
|
+
console.log(indent + colors.dim('│') + ' ' + colors.primary('Build') + colors.muted(' · ') + colors.text('Dravix Auto') + colors.muted(' (Titanium + Quantum)') + ' ' + colors.dim('│'));
|
|
239
|
+
console.log(indent + colors.dim('╰' + '─'.repeat(boxW - 2) + '╯'));
|
|
240
|
+
console.log('');
|
|
241
|
+
// Shortcuts
|
|
242
|
+
console.log(indent +
|
|
243
|
+
colors.primary('Tab') + colors.muted(' mode ') +
|
|
244
|
+
colors.primary('Ctrl+P') + colors.muted(' settings ') +
|
|
245
|
+
colors.primary('@') + colors.muted(' file ') +
|
|
246
|
+
colors.primary('$') + colors.muted(' agent ') +
|
|
247
|
+
colors.primary('/') + colors.muted(' commands'));
|
|
248
|
+
console.log('');
|
|
249
|
+
// Tip
|
|
250
|
+
console.log(indent +
|
|
251
|
+
colors.primary('●') + colors.muted(' Tip ') +
|
|
252
|
+
colors.text('Use syntax ') + colors.primary('{env:VAR_NAME}') + colors.text(' to reference variables'));
|
|
253
|
+
// Bottom bar
|
|
254
|
+
const bottomLeft = '~' + path.basename(cwd);
|
|
255
|
+
const bottomRight = 'v' + VERSION;
|
|
256
|
+
process.stdout.write(`\x1b[${rows};1H\x1b[2K` + colors.muted(bottomLeft) + ' '.repeat(Math.max(cols - bottomLeft.length - bottomRight.length, 2)) + colors.muted(bottomRight));
|
|
210
257
|
await startRepl(cwd);
|
|
211
258
|
}
|
|
212
259
|
main().catch((err) => {
|
package/dist/utils/display.js
CHANGED
|
@@ -20,16 +20,35 @@ export const colors = {
|
|
|
20
20
|
text: chalk.hex('#e2e8f0'),
|
|
21
21
|
subtext: chalk.hex('#94a3b8'),
|
|
22
22
|
};
|
|
23
|
+
function cx(s) {
|
|
24
|
+
const cols = process.stdout.columns ?? 80;
|
|
25
|
+
return ' '.repeat(Math.max(0, Math.floor((cols - s.length) / 2)));
|
|
26
|
+
}
|
|
27
|
+
function drawStars(count) {
|
|
28
|
+
const starChars = ['✦', '✧', '⋆', '·'];
|
|
29
|
+
for (let i = 0; i < count; i++) {
|
|
30
|
+
const cols = process.stdout.columns ?? 80;
|
|
31
|
+
const x = Math.floor(Math.random() * (cols - 10)) + 5;
|
|
32
|
+
console.log(' '.repeat(x) + colors.subtext(starChars[Math.floor(Math.random() * starChars.length)]));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
23
35
|
export function banner() {
|
|
24
|
-
console.log(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
console.log('\n');
|
|
37
|
+
drawStars(4);
|
|
38
|
+
console.log(cx('Taj Special') + colors.subtext('Taj Special'));
|
|
39
|
+
const logoLines = [
|
|
40
|
+
'██████╗ ██████╗ █████╗ ██╗ ██╗██╗██╗ ██╗',
|
|
41
|
+
'██╔══██╗██╔══██╗██╔══██╗██║ ██║██║╚██╗██╔╝',
|
|
42
|
+
'██║ ██║██████╔╝███████║██║ ██║██║ ╚███╔╝',
|
|
43
|
+
'██║ ██║██╔══██╗██╔══██║╚██╗ ██╔╝██║ ██╔██╗',
|
|
44
|
+
'██████╔╝██║ ██║██║ ██║ ╚████╔╝ ██║██╔╝ ██╗',
|
|
45
|
+
'╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═╝',
|
|
46
|
+
];
|
|
47
|
+
for (const line of logoLines) {
|
|
48
|
+
console.log(cx(line) + colors.primary.bold(line));
|
|
49
|
+
}
|
|
50
|
+
console.log(cx('C O D E') + colors.accent.bold('C O D E'));
|
|
51
|
+
drawStars(3);
|
|
33
52
|
}
|
|
34
53
|
export function printAI(chunk) {
|
|
35
54
|
process.stdout.write(colors.ai(chunk));
|
|
@@ -64,10 +83,8 @@ export function printOpResult(result) {
|
|
|
64
83
|
const statPad = statStr ? ' ' + statStr : '';
|
|
65
84
|
console.log(iconStr + labelStr + pathStr + statPad);
|
|
66
85
|
// Compact mode: only show diff if changes are large (>30 lines)
|
|
67
|
-
// For smaller changes, show the actual diff
|
|
68
86
|
const totalChanges = displayAdds + displayRemoves;
|
|
69
87
|
if (totalChanges > 30) {
|
|
70
|
-
// Very large change — show compact summary only
|
|
71
88
|
if (result.linesBefore !== undefined && result.linesAfter !== undefined) {
|
|
72
89
|
const delta = result.linesAfter - result.linesBefore;
|
|
73
90
|
const deltaStr = delta > 0 ? colors.success(`+${delta}`) : delta < 0 ? colors.error(`${delta}`) : '=0';
|
|
@@ -89,8 +106,8 @@ export function printOpResult(result) {
|
|
|
89
106
|
console.log(colors.muted(' (formatting / whitespace change)'));
|
|
90
107
|
return;
|
|
91
108
|
}
|
|
92
|
-
const CONTEXT = 2;
|
|
93
|
-
const MAX_SIDE = 20;
|
|
109
|
+
const CONTEXT = 2;
|
|
110
|
+
const MAX_SIDE = 20;
|
|
94
111
|
const show = new Uint8Array(diff.length);
|
|
95
112
|
for (let i = 0; i < diff.length; i++) {
|
|
96
113
|
if (diff[i].kind !== 'context') {
|
|
@@ -250,20 +267,19 @@ ${line}
|
|
|
250
267
|
|
|
251
268
|
${colors.primary.bold(' Keyboard shortcuts')}
|
|
252
269
|
${line}
|
|
253
|
-
${C('Tab')} ${W('Path autocomplete
|
|
254
|
-
${C('@')} ${W('File picker —
|
|
255
|
-
${C('
|
|
270
|
+
${C('Tab')} ${W('Path autocomplete')}
|
|
271
|
+
${C('@')} ${W('File picker — attach file')}
|
|
272
|
+
${C('$')} ${W('Run subagent')}
|
|
273
|
+
${C('Ctrl+C')} ${W('Cancel AI response')}
|
|
256
274
|
${C('Ctrl+L')} ${W('Clear screen')}
|
|
257
|
-
${C('
|
|
258
|
-
${C('↑ ↓')} ${W('Navigate items in picker')}
|
|
259
|
-
${C('Space')} ${W('Select item in file picker')}
|
|
275
|
+
${C('↑ ↓')} ${W('Navigate items')}
|
|
260
276
|
${C('Esc')} ${W('Close picker')}
|
|
261
277
|
|
|
262
278
|
${colors.primary.bold(' Tips')}
|
|
263
279
|
${line}
|
|
264
280
|
${colors.muted('·')} ${W('Start typing while AI responds — your message queues automatically')}
|
|
265
|
-
${colors.muted('·')} ${W('Mention a filename
|
|
266
|
-
${colors.muted('·')} ${W('
|
|
281
|
+
${colors.muted('·')} ${W('Mention a filename to auto-inject its content')}
|
|
282
|
+
${colors.muted('·')} ${W('Approve changes:')} ${C('y')} ${DIM('yes')} ${C('a')} ${DIM('always')} ${C('n')} ${DIM('no')}
|
|
267
283
|
${colors.muted('·')} ${W('Use /resume to continue a previous conversation')}
|
|
268
284
|
`);
|
|
269
285
|
}
|