@onesclawkolor/onesclaw 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +65 -0
  2. package/dist/agent/conversation.d.ts +34 -0
  3. package/dist/agent/conversation.js +61 -0
  4. package/dist/agent/conversation.js.map +1 -0
  5. package/dist/agent/loop.d.ts +40 -0
  6. package/dist/agent/loop.js +213 -0
  7. package/dist/agent/loop.js.map +1 -0
  8. package/dist/agent/session.d.ts +73 -0
  9. package/dist/agent/session.js +225 -0
  10. package/dist/agent/session.js.map +1 -0
  11. package/dist/audit/file-sink.d.ts +6 -0
  12. package/dist/audit/file-sink.js +21 -0
  13. package/dist/audit/file-sink.js.map +1 -0
  14. package/dist/audit/ids.d.ts +3 -0
  15. package/dist/audit/ids.js +15 -0
  16. package/dist/audit/ids.js.map +1 -0
  17. package/dist/audit/types.d.ts +13 -0
  18. package/dist/audit/types.js +2 -0
  19. package/dist/audit/types.js.map +1 -0
  20. package/dist/cli/commands.d.ts +31 -0
  21. package/dist/cli/commands.js +433 -0
  22. package/dist/cli/commands.js.map +1 -0
  23. package/dist/cli/logger.d.ts +57 -0
  24. package/dist/cli/logger.js +79 -0
  25. package/dist/cli/logger.js.map +1 -0
  26. package/dist/cli/output.d.ts +59 -0
  27. package/dist/cli/output.js +306 -0
  28. package/dist/cli/output.js.map +1 -0
  29. package/dist/cli/prompt.d.ts +29 -0
  30. package/dist/cli/prompt.js +197 -0
  31. package/dist/cli/prompt.js.map +1 -0
  32. package/dist/cli/repl.d.ts +4 -0
  33. package/dist/cli/repl.js +486 -0
  34. package/dist/cli/repl.js.map +1 -0
  35. package/dist/commands/init.d.ts +4 -0
  36. package/dist/commands/init.js +84 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/model.d.ts +3 -0
  39. package/dist/commands/model.js +178 -0
  40. package/dist/commands/model.js.map +1 -0
  41. package/dist/commands/plugin-init.d.ts +23 -0
  42. package/dist/commands/plugin-init.js +303 -0
  43. package/dist/commands/plugin-init.js.map +1 -0
  44. package/dist/commands/provider-auth.d.ts +14 -0
  45. package/dist/commands/provider-auth.js +153 -0
  46. package/dist/commands/provider-auth.js.map +1 -0
  47. package/dist/config/manager.d.ts +71 -0
  48. package/dist/config/manager.js +201 -0
  49. package/dist/config/manager.js.map +1 -0
  50. package/dist/config/types.d.ts +43 -0
  51. package/dist/config/types.js +2 -0
  52. package/dist/config/types.js.map +1 -0
  53. package/dist/errors.d.ts +37 -0
  54. package/dist/errors.js +55 -0
  55. package/dist/errors.js.map +1 -0
  56. package/dist/index.d.ts +2 -0
  57. package/dist/index.js +207 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/llm/anthropic.d.ts +83 -0
  60. package/dist/llm/anthropic.js +190 -0
  61. package/dist/llm/anthropic.js.map +1 -0
  62. package/dist/llm/factory.d.ts +105 -0
  63. package/dist/llm/factory.js +164 -0
  64. package/dist/llm/factory.js.map +1 -0
  65. package/dist/llm/openai-codex.d.ts +102 -0
  66. package/dist/llm/openai-codex.js +445 -0
  67. package/dist/llm/openai-codex.js.map +1 -0
  68. package/dist/llm/openai.d.ts +71 -0
  69. package/dist/llm/openai.js +289 -0
  70. package/dist/llm/openai.js.map +1 -0
  71. package/dist/llm/provider.d.ts +1 -0
  72. package/dist/llm/provider.js +2 -0
  73. package/dist/llm/provider.js.map +1 -0
  74. package/dist/llm/types.d.ts +72 -0
  75. package/dist/llm/types.js +2 -0
  76. package/dist/llm/types.js.map +1 -0
  77. package/dist/mcp/bridge.d.ts +17 -0
  78. package/dist/mcp/bridge.js +74 -0
  79. package/dist/mcp/bridge.js.map +1 -0
  80. package/dist/mcp/config.d.ts +10 -0
  81. package/dist/mcp/config.js +27 -0
  82. package/dist/mcp/config.js.map +1 -0
  83. package/dist/mcp/manager.d.ts +67 -0
  84. package/dist/mcp/manager.js +207 -0
  85. package/dist/mcp/manager.js.map +1 -0
  86. package/dist/memory/scope.d.ts +4 -0
  87. package/dist/memory/scope.js +14 -0
  88. package/dist/memory/scope.js.map +1 -0
  89. package/dist/memory/store.d.ts +28 -0
  90. package/dist/memory/store.js +126 -0
  91. package/dist/memory/store.js.map +1 -0
  92. package/dist/prompts/system.d.ts +4 -0
  93. package/dist/prompts/system.js +197 -0
  94. package/dist/prompts/system.js.map +1 -0
  95. package/dist/skills/loader.d.ts +25 -0
  96. package/dist/skills/loader.js +98 -0
  97. package/dist/skills/loader.js.map +1 -0
  98. package/dist/skills/registry.d.ts +57 -0
  99. package/dist/skills/registry.js +132 -0
  100. package/dist/skills/registry.js.map +1 -0
  101. package/dist/skills/sync.d.ts +33 -0
  102. package/dist/skills/sync.js +180 -0
  103. package/dist/skills/sync.js.map +1 -0
  104. package/dist/skills/types.d.ts +1 -0
  105. package/dist/skills/types.js +2 -0
  106. package/dist/skills/types.js.map +1 -0
  107. package/dist/tools/ask.d.ts +30 -0
  108. package/dist/tools/ask.js +60 -0
  109. package/dist/tools/ask.js.map +1 -0
  110. package/dist/tools/confirmation.d.ts +12 -0
  111. package/dist/tools/confirmation.js +75 -0
  112. package/dist/tools/confirmation.js.map +1 -0
  113. package/dist/tools/plugin-init.d.ts +29 -0
  114. package/dist/tools/plugin-init.js +47 -0
  115. package/dist/tools/plugin-init.js.map +1 -0
  116. package/dist/tools/registry.d.ts +56 -0
  117. package/dist/tools/registry.js +123 -0
  118. package/dist/tools/registry.js.map +1 -0
  119. package/dist/tools/safety.d.ts +2 -0
  120. package/dist/tools/safety.js +30 -0
  121. package/dist/tools/safety.js.map +1 -0
  122. package/dist/tools/server.d.ts +91 -0
  123. package/dist/tools/server.js +149 -0
  124. package/dist/tools/server.js.map +1 -0
  125. package/dist/tools/shell.d.ts +11 -0
  126. package/dist/tools/shell.js +174 -0
  127. package/dist/tools/shell.js.map +1 -0
  128. package/dist/tools/skills-sync.d.ts +19 -0
  129. package/dist/tools/skills-sync.js +29 -0
  130. package/dist/tools/skills-sync.js.map +1 -0
  131. package/dist/tools/ssh.d.ts +62 -0
  132. package/dist/tools/ssh.js +343 -0
  133. package/dist/tools/ssh.js.map +1 -0
  134. package/dist/tools/types.d.ts +10 -0
  135. package/dist/tools/types.js +2 -0
  136. package/dist/tools/types.js.map +1 -0
  137. package/dist/utils/retry.d.ts +7 -0
  138. package/dist/utils/retry.js +34 -0
  139. package/dist/utils/retry.js.map +1 -0
  140. package/install.sh +171 -0
  141. package/package.json +49 -0
@@ -0,0 +1,306 @@
1
+ // @ts-nocheck
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { marked } from 'marked';
5
+ import { markedTerminal } from 'marked-terminal';
6
+ // ─── String Width Utilities ─────────────────────────────────
7
+ // eslint-disable-next-line no-control-regex
8
+ const ANSI_RE = /\x1b\[[0-9;]*m/g;
9
+ /** 去除 ANSI 转义序列 */
10
+ function stripAnsi(s) {
11
+ return s.replace(ANSI_RE, '');
12
+ }
13
+ /**
14
+ * 判断 Unicode 码位是否为全角(East Asian Width = Wide/Fullwidth)
15
+ * CJK 汉字、全角标点、韩文等占 2 个终端列宽
16
+ */
17
+ function isFullWidth(code) {
18
+ return ((code >= 0x1100 && code <= 0x115f) || // Hangul Jamo
19
+ (code >= 0x2e80 && code <= 0x303f) || // CJK Radicals, Kangxi, Ideographic, CJK Symbols
20
+ (code >= 0x3040 && code <= 0x33ff) || // Hiragana, Katakana, Bopomofo, etc.
21
+ (code >= 0x3400 && code <= 0x4dbf) || // CJK Ext A
22
+ (code >= 0x4e00 && code <= 0x9fff) || // CJK Unified Ideographs
23
+ (code >= 0xa000 && code <= 0xa4cf) || // Yi Syllables / Radicals
24
+ (code >= 0xac00 && code <= 0xd7af) || // Hangul Syllables
25
+ (code >= 0xf900 && code <= 0xfaff) || // CJK Compatibility Ideographs
26
+ (code >= 0xfe30 && code <= 0xfe4f) || // CJK Compatibility Forms
27
+ (code >= 0xff01 && code <= 0xff60) || // Fullwidth Forms
28
+ (code >= 0xffe0 && code <= 0xffe6) || // Fullwidth Signs
29
+ (code >= 0x20000 && code <= 0x2ffff) || // CJK Ext B-F
30
+ (code >= 0x30000 && code <= 0x3ffff) // CJK Ext G
31
+ );
32
+ }
33
+ /**
34
+ * 计算字符串在终端中的显示宽度(列数)
35
+ * 全角字符(CJK 等)占 2 列,其余占 1 列
36
+ */
37
+ export function getDisplayWidth(str) {
38
+ let width = 0;
39
+ for (const char of str) {
40
+ const code = char.codePointAt(0);
41
+ width += isFullWidth(code) ? 2 : 1;
42
+ }
43
+ return width;
44
+ }
45
+ // ─── Markdown Rendering ──────────────────────────────────────
46
+ // 配置 marked 使用终端渲染器
47
+ marked.use(markedTerminal({
48
+ showSectionPrefix: false,
49
+ tab: 2,
50
+ }));
51
+ // 修复 markedTerminal 的 text renderer 不处理内联 token 的 bug
52
+ // markedTerminal 的 text() 方法仅提取 token.text(原始字符串),
53
+ // 导致列表项中的 **bold**、*italic* 等内联语法不被渲染。
54
+ // 通过覆盖 text renderer,使其调用 parseInline 处理内联 token。
55
+ marked.use({
56
+ useNewRenderer: true,
57
+ renderer: {
58
+ text(token) {
59
+ if (typeof token === 'object' &&
60
+ token.tokens &&
61
+ token.tokens.length > 0) {
62
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
+ return this.parser.parseInline(token.tokens);
64
+ }
65
+ return typeof token === 'object' ? token.text : token;
66
+ },
67
+ },
68
+ });
69
+ /**
70
+ * 将 Markdown 文本渲染为终端 ANSI 格式
71
+ */
72
+ export function renderMarkdown(text) {
73
+ if (!text.trim())
74
+ return '';
75
+ const result = marked.parse(text);
76
+ // marked.parse 在某些版本/配置下可能返回 Promise
77
+ if (typeof result !== 'string') {
78
+ return text;
79
+ }
80
+ return result.trimEnd();
81
+ }
82
+ /**
83
+ * 计算从当前光标位置需要向上移动多少行才能回到文本起始行
84
+ *
85
+ * 关键:如果文本以 \n 结尾,split 产生的尾部空字符串不代表可见行,
86
+ * 但光标已在新行,所以需要向上移 N 行(N = 可见行数)。
87
+ * 如果文本不以 \n 结尾,光标在最后一行末尾,向上移 N-1 行。
88
+ *
89
+ * 返回 { rows, needCR }:
90
+ * - rows:需要 \x1b[{rows}A 的值
91
+ * - needCR:是否需要先 \r 到行首
92
+ */
93
+ export function computeCursorRewind(text) {
94
+ const termWidth = process.stdout.columns || 80;
95
+ const endsWithNewline = text.endsWith('\n');
96
+ // 分割并去掉尾部 \n 产生的空字符串
97
+ const lines = text.split('\n');
98
+ if (endsWithNewline && lines.length > 0 && lines[lines.length - 1] === '') {
99
+ lines.pop();
100
+ }
101
+ // 计算可见行占用的终端行数(含自动换行)
102
+ let totalRows = 0;
103
+ for (const line of lines) {
104
+ const visibleWidth = getDisplayWidth(stripAnsi(line));
105
+ totalRows += Math.max(1, Math.ceil(visibleWidth / termWidth));
106
+ }
107
+ if (endsWithNewline) {
108
+ // 光标在新行行首,向上移 totalRows 行
109
+ return { rows: totalRows, needCR: false };
110
+ }
111
+ else {
112
+ // 光标在最后一行末尾,需要 \r + 向上移 (totalRows - 1) 行
113
+ return { rows: Math.max(0, totalRows - 1), needCR: true };
114
+ }
115
+ }
116
+ // ─── ONESCLAW Logo ───────────────────────────────────────────────
117
+ const ONESCLAW_LOGO = `\
118
+ ▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄ ▄▄ ▄▄▄▄
119
+ ▄█▀▀▀▀█ ██▀▀▀▀▀▀ ███ ██ ██▀▀██
120
+ ██▄ ██ ██▀█ ██ ██ ██
121
+ ▀████▄ ███████ ██ ██ ██ ██ ██
122
+ ▀██ ██ ██ █▄██ ██ ██
123
+ █▄▄▄▄▄█▀ ██▄▄▄▄▄▄ ██ ███ ██▄▄██
124
+ ▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀ ▀▀▀ ▀▀▀▀`;
125
+ // ─── Banner ──────────────────────────────────────────────────
126
+ const BOX_WIDTH = 50;
127
+ function boxLine(content) {
128
+ const visibleWidth = getDisplayWidth(stripAnsi(content));
129
+ const pad = BOX_WIDTH - 2 - visibleWidth; // 2 for "│ " prefix
130
+ return `│ ${content}${' '.repeat(Math.max(0, pad))}│`;
131
+ }
132
+ /**
133
+ * 计算相对时间描述
134
+ */
135
+ function formatRelativeTime(isoTime) {
136
+ const diff = Date.now() - new Date(isoTime).getTime();
137
+ if (isNaN(diff) || diff < 0)
138
+ return '未知';
139
+ const minutes = Math.floor(diff / 60000);
140
+ if (minutes < 1)
141
+ return '刚刚';
142
+ if (minutes < 60)
143
+ return `${minutes}m ago`;
144
+ const hours = Math.floor(minutes / 60);
145
+ if (hours < 24)
146
+ return `${hours}h ago`;
147
+ const days = Math.floor(hours / 24);
148
+ return `${days}d ago`;
149
+ }
150
+ /**
151
+ * 输出启动横幅
152
+ * 显示 ONESCLAW Logo、版本信息、当前用户、MCP 连接状态、Skills 状态
153
+ */
154
+ export function printBanner(version, user, connectedServers, skillsInfo, model) {
155
+ console.log();
156
+ // Logo
157
+ for (const line of ONESCLAW_LOGO.split('\n')) {
158
+ console.log(chalk.cyan(line));
159
+ }
160
+ console.log();
161
+ // 框线
162
+ const top = `╭${'─'.repeat(BOX_WIDTH)}╮`;
163
+ const bottom = `╰${'─'.repeat(BOX_WIDTH)}╯`;
164
+ // 内容行
165
+ const versionLine = boxLine(chalk.bold('ONESCLAW CLI') + chalk.gray(` v${version}`));
166
+ const modelLine = model
167
+ ? boxLine(`Model: ${chalk.green(model)}`)
168
+ : boxLine(chalk.yellow('Model: 未配置'));
169
+ let userLine;
170
+ if (user) {
171
+ userLine = boxLine(`User: ${user.name} <${user.email}>`);
172
+ }
173
+ else {
174
+ userLine = boxLine(chalk.yellow('User: 未获取到用户信息'));
175
+ }
176
+ let mcpLine;
177
+ if (connectedServers.length > 0) {
178
+ const servers = connectedServers
179
+ .map((s) => `${s} ${chalk.green('✓')}`)
180
+ .join(' ');
181
+ mcpLine = boxLine(`MCP: ${servers}`);
182
+ }
183
+ else {
184
+ mcpLine = boxLine(chalk.red('MCP: 无服务器连接'));
185
+ }
186
+ let skillsLine;
187
+ if (skillsInfo && skillsInfo.count > 0) {
188
+ const syncText = skillsInfo.lastSync
189
+ ? chalk.gray(`(${formatRelativeTime(skillsInfo.lastSync)})`)
190
+ : '';
191
+ skillsLine = boxLine(`Skills: ${skillsInfo.count} 个技能 ${syncText}`);
192
+ }
193
+ else {
194
+ skillsLine = boxLine(chalk.yellow('Skills: 未同步'));
195
+ }
196
+ console.log(top);
197
+ console.log(versionLine);
198
+ console.log(modelLine);
199
+ console.log(userLine);
200
+ console.log(mcpLine);
201
+ console.log(skillsLine);
202
+ console.log(bottom);
203
+ console.log();
204
+ // 提示文案
205
+ console.log(chalk.gray(' 输出 ') +
206
+ chalk.cyan('/') +
207
+ chalk.gray(' 显示命令列表,') +
208
+ chalk.cyan('CTRL+C') +
209
+ chalk.gray(' 退出'));
210
+ console.log();
211
+ }
212
+ // ─── Streaming Text ──────────────────────────────────────────
213
+ /**
214
+ * 实时输出流式文本到终端
215
+ * 不换行,支持逐字符/逐块追加
216
+ */
217
+ export function streamText(text) {
218
+ process.stdout.write(text);
219
+ }
220
+ // ─── Tool Output ─────────────────────────────────────────────
221
+ /**
222
+ * 输出工具调用信息(灰色,低视觉干扰)
223
+ * 格式:→ name(args_summary)
224
+ */
225
+ export function printToolCall(name, args) {
226
+ let argsSummary = JSON.stringify(args);
227
+ if (argsSummary.length > 200) {
228
+ argsSummary = argsSummary.slice(0, 200) + '…';
229
+ }
230
+ console.log(chalk.gray(` → ${name}(${argsSummary})`));
231
+ }
232
+ /**
233
+ * 输出工具执行结果摘要
234
+ */
235
+ export function printToolResult(name, result, isError) {
236
+ const maxLen = 500;
237
+ const truncated = result.length > maxLen ? result.slice(0, maxLen) + '…' : result;
238
+ if (isError) {
239
+ console.log(chalk.red(` ✗ ${name}: `) + chalk.gray(truncated));
240
+ }
241
+ else {
242
+ console.log(chalk.green(` ✓ ${name}`));
243
+ }
244
+ }
245
+ // ─── Error Output ────────────────────────────────────────────
246
+ /**
247
+ * 输出错误信息
248
+ * debug 模式下额外输出 stack trace
249
+ */
250
+ export function printError(error, debug = false) {
251
+ const message = error instanceof Error ? error.message : String(error);
252
+ console.log(chalk.red(`\n [Error] ${message}`));
253
+ if (debug && error instanceof Error && error.stack) {
254
+ console.log(chalk.gray(error.stack));
255
+ }
256
+ }
257
+ // ─── Spinner ─────────────────────────────────────────────────
258
+ /**
259
+ * 创建加载动画 spinner
260
+ */
261
+ export function createSpinner(text) {
262
+ return ora({ text, indent: 2, discardStdin: false });
263
+ }
264
+ export function createTimedSpinner(text) {
265
+ const spinner = ora({ text: `${text} (0s)`, indent: 2, discardStdin: false });
266
+ let baseText = text;
267
+ let startTime = 0;
268
+ let timer = null;
269
+ function clearTimer() {
270
+ if (timer) {
271
+ clearInterval(timer);
272
+ timer = null;
273
+ }
274
+ }
275
+ function tick() {
276
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
277
+ spinner.text = `${baseText} (${elapsed}s)`;
278
+ }
279
+ return {
280
+ start() {
281
+ startTime = Date.now();
282
+ spinner.start();
283
+ timer = setInterval(tick, 1000);
284
+ },
285
+ update(newText) {
286
+ baseText = newText;
287
+ tick();
288
+ },
289
+ stop() {
290
+ clearTimer();
291
+ spinner.stop();
292
+ // ora.stop() 后光标在 indent 位置(列2),重置到列0
293
+ // 确保后续 streamText 输出从行首开始
294
+ process.stdout.write('\r');
295
+ },
296
+ succeed(msg) {
297
+ clearTimer();
298
+ spinner.succeed(msg);
299
+ },
300
+ fail(msg) {
301
+ clearTimer();
302
+ spinner.fail(msg);
303
+ },
304
+ };
305
+ }
306
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 交互取消标记
3
+ */
4
+ export declare class CancelError extends Error {
5
+ constructor();
6
+ }
7
+ /**
8
+ * 带 ESC 取消支持的交互式问题
9
+ */
10
+ export declare function promptQuestion(rl: any, prompt: any): Promise<unknown>;
11
+ /**
12
+ * 交互式选择(方向键选择 + Enter 确认)
13
+ *
14
+ * 渲染带 ▸ 指示器的选项列表,上/下方向键移动选中,Enter 确认,ESC 取消。
15
+ *
16
+ * @param rl readline 接口(会在选择期间暂停,完成后恢复)
17
+ * @param _prompt 保留参数(不再显示输入提示,选项列表即 UI)
18
+ * @param options 选项文本数组
19
+ * @param defaultIndex 初始选中项索引,默认 0
20
+ * @returns 选中项的索引(0-based),ESC 取消时抛出 CancelError
21
+ */
22
+ export declare function promptChoice(rl: any, _prompt: any, options: any, defaultIndex: any): Promise<unknown>;
23
+ /**
24
+ * 读取密码输入(不回显)
25
+ *
26
+ * 执行期间会临时移除 stdin 上所有既有 data 监听器(如 readline 的内部 handler),
27
+ * 结束后恢复,确保输入内容不会泄漏到 readline 的 line 事件中。
28
+ */
29
+ export declare function questionSecret(prompt: any): Promise<unknown>;
@@ -0,0 +1,197 @@
1
+ // @ts-nocheck
2
+ import chalk from 'chalk';
3
+ /**
4
+ * 交互取消标记
5
+ */
6
+ export class CancelError extends Error {
7
+ constructor() {
8
+ super('cancelled');
9
+ this.name = 'CancelError';
10
+ }
11
+ }
12
+ /**
13
+ * 带 ESC 取消支持的交互式问题
14
+ */
15
+ export function promptQuestion(rl, prompt) {
16
+ return new Promise((resolve, reject) => {
17
+ const onKeypress = (_ch, key) => {
18
+ if (key?.name === 'escape') {
19
+ cleanup();
20
+ // 清除当前行并跳出 question
21
+ rl.write(null, { ctrl: true, name: 'u' }); // 清除输入
22
+ rl.write('\n'); // 提交空行结束 question
23
+ reject(new CancelError());
24
+ }
25
+ };
26
+ const cleanup = () => {
27
+ process.stdin.removeListener('keypress', onKeypress);
28
+ };
29
+ process.stdin.on('keypress', onKeypress);
30
+ rl.question(prompt, (answer) => {
31
+ cleanup();
32
+ resolve(answer.trim());
33
+ });
34
+ });
35
+ }
36
+ /**
37
+ * 交互式选择(方向键选择 + Enter 确认)
38
+ *
39
+ * 渲染带 ▸ 指示器的选项列表,上/下方向键移动选中,Enter 确认,ESC 取消。
40
+ *
41
+ * @param rl readline 接口(会在选择期间暂停,完成后恢复)
42
+ * @param _prompt 保留参数(不再显示输入提示,选项列表即 UI)
43
+ * @param options 选项文本数组
44
+ * @param defaultIndex 初始选中项索引,默认 0
45
+ * @returns 选中项的索引(0-based),ESC 取消时抛出 CancelError
46
+ */
47
+ export async function promptChoice(rl, _prompt, options, defaultIndex) {
48
+ return new Promise((resolve, reject) => {
49
+ let selectedIndex = defaultIndex ?? 0;
50
+ // 边界保护
51
+ if (selectedIndex < 0 || selectedIndex >= options.length) {
52
+ selectedIndex = 0;
53
+ }
54
+ const stdin = process.stdin;
55
+ const stdout = process.stdout;
56
+ // 暂停 readline,直接操作 stdin raw mode
57
+ // 使用 raw data 事件而非 keypress 事件,避免 readline 内部 handler 干扰渲染
58
+ rl.pause();
59
+ // 隔离 stdin:暂存并移除所有既有 data 监听器(含 emitKeypressEvents),
60
+ // 防止 readline 的 _ttyWrite 在 raw mode 下处理方向键(触发历史导航修改 rl.line)
61
+ // 和 Enter(提前 emit line 事件携带残留命令)
62
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
+ const savedListeners = stdin.rawListeners('data').slice();
64
+ for (const listener of savedListeners) {
65
+ stdin.removeListener('data', listener);
66
+ }
67
+ const wasRaw = stdin.isRaw;
68
+ if (stdin.isTTY) {
69
+ stdin.setRawMode(true);
70
+ }
71
+ stdin.resume();
72
+ function render(firstTime = false) {
73
+ if (!firstTime) {
74
+ // \r 确保光标在列 0,上移 N 行,清除到屏幕底部
75
+ stdout.write(`\r\x1b[${options.length}A\x1b[J`);
76
+ }
77
+ for (let i = 0; i < options.length; i++) {
78
+ const isSelected = i === selectedIndex;
79
+ const prefix = isSelected ? chalk.cyan(' ▸ ') : ' ';
80
+ const text = isSelected ? chalk.bold(options[i]) : options[i];
81
+ stdout.write(`${prefix}${text}\n`);
82
+ }
83
+ }
84
+ function cleanup() {
85
+ stdin.removeListener('data', onData);
86
+ if (stdin.isTTY) {
87
+ stdin.setRawMode(wasRaw ?? false);
88
+ }
89
+ // 恢复之前保存的 data 监听器(含 emitKeypressEvents)
90
+ for (const listener of savedListeners) {
91
+ stdin.addListener('data', listener);
92
+ }
93
+ // 清空 readline 内部 buffer,防止 raw mode 切换时
94
+ // 泄漏的 newline 携带残留内容触发重复 line 事件
95
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
96
+ const rlAny = rl;
97
+ rlAny.line = '';
98
+ rlAny.cursor = 0;
99
+ rl.resume();
100
+ }
101
+ function onData(data) {
102
+ const s = data.toString('utf-8');
103
+ if (s === '\x1b[A') {
104
+ // 上方向键
105
+ selectedIndex = Math.max(0, selectedIndex - 1);
106
+ render();
107
+ }
108
+ else if (s === '\x1b[B') {
109
+ // 下方向键
110
+ selectedIndex = Math.min(options.length - 1, selectedIndex + 1);
111
+ render();
112
+ }
113
+ else if (s === '\r' || s === '\n') {
114
+ // Enter
115
+ cleanup();
116
+ resolve(selectedIndex);
117
+ }
118
+ else if (s === '\x1b') {
119
+ // ESC
120
+ cleanup();
121
+ reject(new CancelError());
122
+ }
123
+ else if (s === '\x03') {
124
+ // Ctrl+C
125
+ cleanup();
126
+ process.exit(0);
127
+ }
128
+ }
129
+ stdin.on('data', onData);
130
+ render(true);
131
+ });
132
+ }
133
+ /**
134
+ * 读取密码输入(不回显)
135
+ *
136
+ * 执行期间会临时移除 stdin 上所有既有 data 监听器(如 readline 的内部 handler),
137
+ * 结束后恢复,确保输入内容不会泄漏到 readline 的 line 事件中。
138
+ */
139
+ export function questionSecret(prompt) {
140
+ return new Promise((resolve) => {
141
+ const stdin = process.stdin;
142
+ const stdout = process.stdout;
143
+ stdout.write(prompt);
144
+ // 隔离 stdin:暂存并移除所有既有 data 监听器,防止 readline 同时接收按键
145
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
146
+ const savedListeners = stdin.rawListeners('data').slice();
147
+ for (const listener of savedListeners) {
148
+ stdin.removeListener('data', listener);
149
+ }
150
+ // 切换为 raw 模式以隐藏输入
151
+ const wasRaw = stdin.isRaw;
152
+ if (stdin.isTTY) {
153
+ stdin.setRawMode(true);
154
+ }
155
+ stdin.resume();
156
+ let input = '';
157
+ function cleanup() {
158
+ stdin.removeListener('data', onData);
159
+ if (stdin.isTTY) {
160
+ stdin.setRawMode(wasRaw ?? false);
161
+ }
162
+ // 恢复之前保存的 data 监听器
163
+ for (const listener of savedListeners) {
164
+ stdin.addListener('data', listener);
165
+ }
166
+ }
167
+ function onData(data) {
168
+ const char = data.toString('utf-8');
169
+ if (char === '\n' || char === '\r' || char === '\u0004') {
170
+ // Enter or Ctrl+D
171
+ cleanup();
172
+ stdout.write('\n');
173
+ resolve(input.trim());
174
+ }
175
+ else if (char === '\u0003') {
176
+ // Ctrl+C
177
+ cleanup();
178
+ stdout.write('\n');
179
+ process.exit(0);
180
+ }
181
+ else if (char === '\u007F' || char === '\b') {
182
+ // Backspace
183
+ if (input.length > 0) {
184
+ input = input.slice(0, -1);
185
+ stdout.write('\b \b');
186
+ }
187
+ }
188
+ else if (char.charCodeAt(0) >= 32) {
189
+ // Printable character
190
+ input += char;
191
+ stdout.write('*');
192
+ }
193
+ }
194
+ stdin.on('data', onData);
195
+ });
196
+ }
197
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/cli/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 启动 REPL 主循环
3
+ */
4
+ export declare function startRepl(deps: any): Promise<void>;