@travisennis/acai 0.0.1 → 0.0.2

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 (323) hide show
  1. package/README.md +3 -4
  2. package/dist/commands/health-command.d.ts +2 -0
  3. package/dist/commands/health-command.js +59 -0
  4. package/dist/commands/manager.js +2 -0
  5. package/dist/commands/paste-command.d.ts +1 -1
  6. package/dist/commands/paste-command.js +155 -11
  7. package/dist/commands/reset-command.js +1 -0
  8. package/dist/index.js +1 -1
  9. package/dist/models/openrouter-provider.d.ts +4 -1
  10. package/dist/models/openrouter-provider.js +46 -4
  11. package/dist/models/providers.d.ts +1 -1
  12. package/dist/prompts/manager.d.ts +1 -0
  13. package/dist/prompts/manager.js +10 -0
  14. package/dist/prompts.js +8 -6
  15. package/dist/repl.js +49 -26
  16. package/dist/terminal/formatting.d.ts +16 -5
  17. package/dist/terminal/formatting.js +40 -6
  18. package/dist/terminal/index.d.ts +1 -1
  19. package/dist/terminal/index.js +54 -14
  20. package/dist/terminal/markdown.js +0 -1
  21. package/dist/terminal/supports-color.d.ts +16 -0
  22. package/dist/terminal/supports-color.js +121 -0
  23. package/dist/terminal/supports-hyperlinks.d.ts +7 -0
  24. package/dist/terminal/supports-hyperlinks.js +98 -0
  25. package/dist/tools/bash.js +95 -117
  26. package/dist/tools/code-interpreter.js +11 -1
  27. package/dist/tools/command-validation.d.ts +7 -3
  28. package/dist/tools/command-validation.js +67 -23
  29. package/dist/tools/delete-file.d.ts +4 -1
  30. package/dist/tools/delete-file.js +47 -3
  31. package/dist/tools/git-utils.d.ts +6 -0
  32. package/dist/tools/git-utils.js +89 -12
  33. package/dist/tools/grep.d.ts +20 -0
  34. package/dist/tools/grep.js +128 -40
  35. package/dist/tools/index.d.ts +2 -18
  36. package/dist/tools/index.js +4 -18
  37. package/package.json +30 -20
  38. package/.acai/acai.json +0 -9
  39. package/.acai/prompts/add-openrouter-model.md +0 -13
  40. package/.acai/prompts/project-status.md +0 -4
  41. package/.acai/prompts/update-architecture-document.md +0 -9
  42. package/.acai/rules/learned-rules.md +0 -9
  43. package/.ai/docs/available-tools.txt +0 -3
  44. package/.ai/docs/cognitive_complexity_refactoring_progress.md +0 -65
  45. package/.ai/docs/deleted_tools.md +0 -168
  46. package/.ai/docs/deleted_tools_88ced9ef.md +0 -56
  47. package/.ai/docs/image-pasting.md +0 -46
  48. package/.ai/docs/initialize-app.md +0 -117
  49. package/.ai/docs/issue-4-plan.md +0 -44
  50. package/.ai/docs/marked-renderer-debug.md +0 -15
  51. package/.ai/docs/marked-renderer-refactor-plan.md +0 -64
  52. package/.ai/docs/memory-use-cases.md +0 -55
  53. package/.ai/docs/prompt-consistency.md +0 -31
  54. package/.ai/docs/refactoring-tools.md +0 -98
  55. package/.ai/docs/system-prompt-update.md +0 -174
  56. package/.ai/docs/system_prompt.txt +0 -210
  57. package/.ai/docs/tasks.md +0 -49
  58. package/.ai/plan.md +0 -131
  59. package/.ai/prompt.md +0 -1
  60. package/.ai/scripts/fetch_models.js +0 -27
  61. package/.ai/scripts/generateSystemPrompt.ts +0 -15
  62. package/.ai/scripts/list-tools.mjs +0 -4
  63. package/.ai/scripts/p5_geometric_shapes.js +0 -149
  64. package/.husky/commit-msg +0 -1
  65. package/.husky/pre-commit +0 -3
  66. package/.husky/pre-push +0 -1
  67. package/.ignore +0 -4
  68. package/AGENTS.md +0 -25
  69. package/ARCHITECTURE.md +0 -304
  70. package/TODO.md +0 -2
  71. package/biome.json +0 -61
  72. package/commitlint.config.js +0 -3
  73. package/dist/source/cli.d.ts +0 -19
  74. package/dist/source/cli.js +0 -116
  75. package/dist/source/commands/application-log-command.d.ts +0 -2
  76. package/dist/source/commands/application-log-command.js +0 -43
  77. package/dist/source/commands/clear-command.d.ts +0 -2
  78. package/dist/source/commands/clear-command.js +0 -12
  79. package/dist/source/commands/compact-command.d.ts +0 -2
  80. package/dist/source/commands/compact-command.js +0 -51
  81. package/dist/source/commands/copy-command.d.ts +0 -2
  82. package/dist/source/commands/copy-command.js +0 -51
  83. package/dist/source/commands/edit-command.d.ts +0 -2
  84. package/dist/source/commands/edit-command.js +0 -53
  85. package/dist/source/commands/edit-prompt-command.d.ts +0 -2
  86. package/dist/source/commands/edit-prompt-command.js +0 -25
  87. package/dist/source/commands/exit-command.d.ts +0 -2
  88. package/dist/source/commands/exit-command.js +0 -14
  89. package/dist/source/commands/files-command.d.ts +0 -2
  90. package/dist/source/commands/files-command.js +0 -63
  91. package/dist/source/commands/generate-rules-command.d.ts +0 -2
  92. package/dist/source/commands/generate-rules-command.js +0 -61
  93. package/dist/source/commands/help-command.d.ts +0 -2
  94. package/dist/source/commands/help-command.js +0 -19
  95. package/dist/source/commands/init-command.d.ts +0 -2
  96. package/dist/source/commands/init-command.js +0 -40
  97. package/dist/source/commands/last-log-command.d.ts +0 -2
  98. package/dist/source/commands/last-log-command.js +0 -76
  99. package/dist/source/commands/manager.d.ts +0 -22
  100. package/dist/source/commands/manager.js +0 -123
  101. package/dist/source/commands/model-command.d.ts +0 -2
  102. package/dist/source/commands/model-command.js +0 -84
  103. package/dist/source/commands/paste-command.d.ts +0 -2
  104. package/dist/source/commands/paste-command.js +0 -40
  105. package/dist/source/commands/prompt-command.d.ts +0 -2
  106. package/dist/source/commands/prompt-command.js +0 -111
  107. package/dist/source/commands/reset-command.d.ts +0 -2
  108. package/dist/source/commands/reset-command.js +0 -16
  109. package/dist/source/commands/rules-command.d.ts +0 -2
  110. package/dist/source/commands/rules-command.js +0 -68
  111. package/dist/source/commands/save-command.d.ts +0 -2
  112. package/dist/source/commands/save-command.js +0 -14
  113. package/dist/source/commands/types.d.ts +0 -26
  114. package/dist/source/commands/types.js +0 -1
  115. package/dist/source/commands/usage-command.d.ts +0 -2
  116. package/dist/source/commands/usage-command.js +0 -21
  117. package/dist/source/config.d.ts +0 -60
  118. package/dist/source/config.js +0 -193
  119. package/dist/source/conversation-analyzer.d.ts +0 -10
  120. package/dist/source/conversation-analyzer.js +0 -88
  121. package/dist/source/dedent.d.ts +0 -3
  122. package/dist/source/dedent.js +0 -38
  123. package/dist/source/formatting.d.ts +0 -17
  124. package/dist/source/formatting.js +0 -103
  125. package/dist/source/index.d.ts +0 -18
  126. package/dist/source/index.js +0 -213
  127. package/dist/source/logger.d.ts +0 -2
  128. package/dist/source/logger.js +0 -24
  129. package/dist/source/mentions.d.ts +0 -9
  130. package/dist/source/mentions.js +0 -182
  131. package/dist/source/messages.d.ts +0 -69
  132. package/dist/source/messages.js +0 -261
  133. package/dist/source/middleware/audit-message.d.ts +0 -5
  134. package/dist/source/middleware/audit-message.js +0 -95
  135. package/dist/source/middleware/index.d.ts +0 -2
  136. package/dist/source/middleware/index.js +0 -2
  137. package/dist/source/middleware/rate-limit.d.ts +0 -4
  138. package/dist/source/middleware/rate-limit.js +0 -17
  139. package/dist/source/models/ai-config.d.ts +0 -12
  140. package/dist/source/models/ai-config.js +0 -87
  141. package/dist/source/models/anthropic-provider.d.ts +0 -25
  142. package/dist/source/models/anthropic-provider.js +0 -184
  143. package/dist/source/models/deepseek-provider.d.ts +0 -20
  144. package/dist/source/models/deepseek-provider.js +0 -42
  145. package/dist/source/models/google-provider.d.ts +0 -19
  146. package/dist/source/models/google-provider.js +0 -56
  147. package/dist/source/models/manager.d.ts +0 -15
  148. package/dist/source/models/manager.js +0 -48
  149. package/dist/source/models/openai-provider.d.ts +0 -22
  150. package/dist/source/models/openai-provider.js +0 -70
  151. package/dist/source/models/openrouter-provider.d.ts +0 -36
  152. package/dist/source/models/openrouter-provider.js +0 -276
  153. package/dist/source/models/providers.d.ts +0 -33
  154. package/dist/source/models/providers.js +0 -116
  155. package/dist/source/models/xai-provider.d.ts +0 -20
  156. package/dist/source/models/xai-provider.js +0 -47
  157. package/dist/source/parsing.d.ts +0 -2
  158. package/dist/source/parsing.js +0 -18
  159. package/dist/source/prompts/manager.d.ts +0 -19
  160. package/dist/source/prompts/manager.js +0 -71
  161. package/dist/source/prompts.d.ts +0 -4
  162. package/dist/source/prompts.js +0 -158
  163. package/dist/source/repl-prompt.d.ts +0 -14
  164. package/dist/source/repl-prompt.js +0 -147
  165. package/dist/source/repl.d.ts +0 -27
  166. package/dist/source/repl.js +0 -431
  167. package/dist/source/terminal/formatting.d.ts +0 -37
  168. package/dist/source/terminal/formatting.js +0 -106
  169. package/dist/source/terminal/index.d.ts +0 -94
  170. package/dist/source/terminal/index.js +0 -420
  171. package/dist/source/terminal/markdown-utils.d.ts +0 -2
  172. package/dist/source/terminal/markdown-utils.js +0 -81
  173. package/dist/source/terminal/markdown.d.ts +0 -1
  174. package/dist/source/terminal/markdown.js +0 -111
  175. package/dist/source/terminal/types.d.ts +0 -71
  176. package/dist/source/terminal/types.js +0 -1
  177. package/dist/source/terminal-output.d.ts +0 -8
  178. package/dist/source/terminal-output.js +0 -213
  179. package/dist/source/terminal-output.test.d.ts +0 -8
  180. package/dist/source/terminal-output.test.js +0 -213
  181. package/dist/source/token-tracker.d.ts +0 -14
  182. package/dist/source/token-tracker.js +0 -53
  183. package/dist/source/token-utils.d.ts +0 -7
  184. package/dist/source/token-utils.js +0 -13
  185. package/dist/source/tools/agent.d.ts +0 -17
  186. package/dist/source/tools/agent.js +0 -87
  187. package/dist/source/tools/bash.d.ts +0 -19
  188. package/dist/source/tools/bash.js +0 -294
  189. package/dist/source/tools/code-interpreter.d.ts +0 -12
  190. package/dist/source/tools/code-interpreter.js +0 -131
  191. package/dist/source/tools/command-validation.d.ts +0 -8
  192. package/dist/source/tools/command-validation.js +0 -69
  193. package/dist/source/tools/delete-file.d.ts +0 -12
  194. package/dist/source/tools/delete-file.js +0 -56
  195. package/dist/source/tools/directory-tree.d.ts +0 -12
  196. package/dist/source/tools/directory-tree.js +0 -38
  197. package/dist/source/tools/edit-file.d.ts +0 -19
  198. package/dist/source/tools/edit-file.js +0 -107
  199. package/dist/source/tools/filesystem-utils.d.ts +0 -22
  200. package/dist/source/tools/filesystem-utils.js +0 -191
  201. package/dist/source/tools/git-utils.d.ts +0 -14
  202. package/dist/source/tools/git-utils.js +0 -64
  203. package/dist/source/tools/grep.d.ts +0 -17
  204. package/dist/source/tools/grep.js +0 -138
  205. package/dist/source/tools/index.d.ts +0 -161
  206. package/dist/source/tools/index.js +0 -209
  207. package/dist/source/tools/memory-read.d.ts +0 -13
  208. package/dist/source/tools/memory-read.js +0 -135
  209. package/dist/source/tools/memory-write.d.ts +0 -12
  210. package/dist/source/tools/memory-write.js +0 -83
  211. package/dist/source/tools/move-file.d.ts +0 -13
  212. package/dist/source/tools/move-file.js +0 -44
  213. package/dist/source/tools/read-file.d.ts +0 -17
  214. package/dist/source/tools/read-file.js +0 -86
  215. package/dist/source/tools/read-multiple-files.d.ts +0 -14
  216. package/dist/source/tools/read-multiple-files.js +0 -55
  217. package/dist/source/tools/save-file.d.ts +0 -17
  218. package/dist/source/tools/save-file.js +0 -98
  219. package/dist/source/tools/think.d.ts +0 -11
  220. package/dist/source/tools/think.js +0 -45
  221. package/dist/source/tools/types.d.ts +0 -29
  222. package/dist/source/tools/types.js +0 -14
  223. package/dist/source/tools/web-fetch.d.ts +0 -47
  224. package/dist/source/tools/web-fetch.js +0 -246
  225. package/dist/source/tools/web-search.d.ts +0 -13
  226. package/dist/source/tools/web-search.js +0 -80
  227. package/dist/source/utils/process.d.ts +0 -36
  228. package/dist/source/utils/process.js +0 -75
  229. package/dist/source/version.d.ts +0 -1
  230. package/dist/source/version.js +0 -21
  231. package/dist/terminal-output.d.ts +0 -8
  232. package/dist/terminal-output.js +0 -213
  233. package/dist/tools/memory-read.d.ts +0 -13
  234. package/dist/tools/memory-read.js +0 -135
  235. package/dist/tools/memory-write.d.ts +0 -12
  236. package/dist/tools/memory-write.js +0 -83
  237. package/knip.json +0 -5
  238. package/source/cli.ts +0 -172
  239. package/source/commands/application-log-command.ts +0 -53
  240. package/source/commands/clear-command.ts +0 -14
  241. package/source/commands/compact-command.ts +0 -64
  242. package/source/commands/copy-command.ts +0 -55
  243. package/source/commands/edit-command.ts +0 -63
  244. package/source/commands/edit-prompt-command.ts +0 -31
  245. package/source/commands/exit-command.ts +0 -18
  246. package/source/commands/files-command.ts +0 -85
  247. package/source/commands/generate-rules-command.ts +0 -82
  248. package/source/commands/help-command.ts +0 -27
  249. package/source/commands/init-command.ts +0 -48
  250. package/source/commands/last-log-command.ts +0 -88
  251. package/source/commands/manager.ts +0 -151
  252. package/source/commands/model-command.ts +0 -123
  253. package/source/commands/paste-command.ts +0 -62
  254. package/source/commands/prompt-command.ts +0 -150
  255. package/source/commands/reset-command.ts +0 -22
  256. package/source/commands/rules-command.ts +0 -76
  257. package/source/commands/save-command.ts +0 -20
  258. package/source/commands/types.ts +0 -28
  259. package/source/commands/usage-command.ts +0 -26
  260. package/source/config.ts +0 -223
  261. package/source/conversation-analyzer.ts +0 -115
  262. package/source/dedent.ts +0 -53
  263. package/source/formatting.ts +0 -132
  264. package/source/index.ts +0 -240
  265. package/source/logger.ts +0 -29
  266. package/source/mentions.ts +0 -227
  267. package/source/messages.ts +0 -360
  268. package/source/middleware/audit-message.ts +0 -133
  269. package/source/middleware/index.ts +0 -2
  270. package/source/middleware/rate-limit.ts +0 -24
  271. package/source/models/ai-config.ts +0 -109
  272. package/source/models/anthropic-provider.ts +0 -199
  273. package/source/models/deepseek-provider.ts +0 -53
  274. package/source/models/google-provider.ts +0 -68
  275. package/source/models/manager.ts +0 -84
  276. package/source/models/openai-provider.ts +0 -81
  277. package/source/models/openrouter-provider.ts +0 -288
  278. package/source/models/providers.ts +0 -197
  279. package/source/models/xai-provider.ts +0 -59
  280. package/source/parsing.ts +0 -20
  281. package/source/prompts/manager.ts +0 -90
  282. package/source/prompts.ts +0 -172
  283. package/source/repl-prompt.ts +0 -196
  284. package/source/repl.ts +0 -572
  285. package/source/terminal/formatting.ts +0 -121
  286. package/source/terminal/index.ts +0 -518
  287. package/source/terminal/markdown-utils.ts +0 -89
  288. package/source/terminal/markdown.ts +0 -155
  289. package/source/terminal/types.ts +0 -84
  290. package/source/terminal-output.test.ts +0 -266
  291. package/source/token-tracker.ts +0 -78
  292. package/source/token-utils.ts +0 -17
  293. package/source/tools/agent.ts +0 -107
  294. package/source/tools/bash.ts +0 -367
  295. package/source/tools/code-interpreter.ts +0 -172
  296. package/source/tools/command-validation.ts +0 -81
  297. package/source/tools/delete-file.ts +0 -71
  298. package/source/tools/directory-tree.ts +0 -54
  299. package/source/tools/edit-file.ts +0 -155
  300. package/source/tools/filesystem-utils.ts +0 -265
  301. package/source/tools/git-utils.ts +0 -70
  302. package/source/tools/grep.ts +0 -184
  303. package/source/tools/index.ts +0 -278
  304. package/source/tools/memory-read.ts +0 -174
  305. package/source/tools/memory-write.ts +0 -105
  306. package/source/tools/move-file.ts +0 -59
  307. package/source/tools/read-file.ts +0 -129
  308. package/source/tools/read-multiple-files.ts +0 -80
  309. package/source/tools/save-file.ts +0 -147
  310. package/source/tools/think.ts +0 -51
  311. package/source/tools/types.ts +0 -58
  312. package/source/tools/web-fetch.ts +0 -327
  313. package/source/tools/web-search.ts +0 -101
  314. package/source/utils/process.ts +0 -121
  315. package/source/version.ts +0 -21
  316. package/test/commands/copy-command.test.ts +0 -69
  317. package/test/config.test.ts +0 -200
  318. package/test/terminal/markdown-utils.test.ts +0 -124
  319. package/test/tools/bash-tool.test.ts +0 -58
  320. package/test/tools/code-interpreter.test.ts +0 -91
  321. package/test/tools/command-validation.test.ts +0 -48
  322. package/tsconfig.build.json +0 -9
  323. package/tsconfig.json +0 -30
@@ -1,420 +0,0 @@
1
- /**
2
- * Terminal Interface Module
3
- *
4
- * Provides a user interface for interacting with Claude Code in the terminal.
5
- * Handles input/output, formatting, and display.
6
- */
7
- import chalk from "chalk";
8
- import Table from "cli-table3";
9
- import ora from "ora";
10
- import wrapAnsi from "wrap-ansi";
11
- import { logger } from "../logger.js";
12
- import { getPackageVersion } from "../version.js";
13
- import { clearTerminal, getTerminalSize, setTerminalTitle, link as terminalLink, } from "./formatting.js";
14
- import { applyMarkdown } from "./markdown.js";
15
- /**
16
- * Initialize the terminal interface
17
- */
18
- export function initTerminal(config = {}) {
19
- logger.debug("Initializing terminal interface");
20
- const terminalConfig = {
21
- theme: config.theme || "system",
22
- useColors: config.useColors !== false,
23
- showProgressIndicators: config.showProgressIndicators !== false,
24
- codeHighlighting: config.codeHighlighting !== false,
25
- maxHeight: config.maxHeight,
26
- maxWidth: config.maxWidth,
27
- };
28
- const terminal = new Terminal(terminalConfig);
29
- try {
30
- // Detect terminal capabilities
31
- terminal.detectCapabilities();
32
- return terminal;
33
- }
34
- catch (error) {
35
- logger.warn(error, "Error initializing terminal interface:");
36
- // Return a basic terminal interface even if there was an error
37
- return terminal;
38
- }
39
- }
40
- /**
41
- * Terminal class for handling user interaction
42
- */
43
- export class Terminal {
44
- config;
45
- activeSpinners = new Map();
46
- terminalWidth;
47
- terminalHeight;
48
- isInteractive;
49
- constructor(config) {
50
- this.config = config;
51
- // Get initial terminal size
52
- const { rows, columns } = getTerminalSize();
53
- this.terminalHeight = config.maxHeight || rows;
54
- this.terminalWidth = config.maxWidth || columns;
55
- // Assume interactive by default
56
- this.isInteractive = process.stdout.isTTY && process.stdin.isTTY;
57
- // Listen for terminal resize events
58
- process.stdout.on("resize", () => {
59
- const { rows, columns } = getTerminalSize();
60
- this.terminalHeight = config.maxHeight || rows;
61
- this.terminalWidth = config.maxWidth || columns;
62
- logger.debug(`Terminal resized to ${columns}x${rows}`);
63
- });
64
- }
65
- /**
66
- * Detect terminal capabilities
67
- */
68
- detectCapabilities() {
69
- // Check if the terminal is interactive
70
- this.isInteractive = Boolean(process.stdout.isTTY && process.stdin.isTTY);
71
- logger.debug({
72
- isInteractive: this.isInteractive,
73
- colorSupport: this.config.useColors ? "yes" : "no",
74
- size: `${this.terminalWidth}x${this.terminalHeight}`,
75
- }, "Terminal capabilities detected");
76
- }
77
- setTitle(title) {
78
- setTerminalTitle(title);
79
- }
80
- getLogo() {
81
- return `
82
- █████╗ ██████╗ █████╗ ██╗
83
- ██╔══██╗██╔════╝██╔══██╗██║
84
- ███████║██║ ███████║██║
85
- ██╔══██║██║ ██╔══██║██║
86
- ██║ ██║╚██████╗██║ ██║██║
87
- ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝
88
- `;
89
- }
90
- /**
91
- * Display the welcome message
92
- */
93
- displayWelcome() {
94
- this.clear();
95
- const version = getPackageVersion();
96
- this.writeln(chalk.magenta(this.getLogo()));
97
- this.lineBreak();
98
- this.writeln(chalk.magenta("Greetings! I am acai."));
99
- this.writeln(chalk.gray(` Version ${version}`));
100
- this.lineBreak();
101
- this.writeln(chalk.white(` Type ${chalk.cyan("/help")} to see available commands.`));
102
- this.writeln(chalk.white(" You can ask acai to explain code, fix issues, or perform tasks."));
103
- this.writeln(chalk.white(` Example: "${chalk.italic("Please analyze this codebase and explain its structure.")}"`));
104
- this.writeln(chalk.dim(" Use Ctrl+C to interrupt acai and exit."));
105
- this.lineBreak();
106
- this.writeln(chalk.yellow(`The current working directory is ${process.cwd()}`));
107
- this.lineBreak();
108
- }
109
- /**
110
- * Clear the terminal screen
111
- */
112
- clear() {
113
- if (this.isInteractive) {
114
- clearTerminal();
115
- }
116
- }
117
- /**
118
- * Display formatted content
119
- */
120
- display(content, wrap = false) {
121
- this.writeln(this.formatMarkdown(content, wrap));
122
- }
123
- /**
124
- * Display a message with emphasis
125
- */
126
- emphasize(message) {
127
- if (this.config.useColors) {
128
- this.writeln(chalk.cyan.bold(message));
129
- }
130
- else {
131
- this.writeln(message.toUpperCase());
132
- }
133
- }
134
- /**
135
- * Display an informational message
136
- */
137
- info(message) {
138
- if (this.config.useColors) {
139
- this.writeln(chalk.blue(`ℹ ${message}`));
140
- }
141
- else {
142
- this.writeln(`INFO: ${message}`);
143
- }
144
- }
145
- /**
146
- * Display a success message
147
- */
148
- success(message) {
149
- if (this.config.useColors) {
150
- this.writeln(chalk.green(`✓ ${message}`));
151
- }
152
- else {
153
- this.writeln(`SUCCESS: ${message}`);
154
- }
155
- }
156
- /**
157
- * Display a warning message
158
- */
159
- warn(message) {
160
- if (this.config.useColors) {
161
- this.writeln(chalk.yellow(`⚠ ${message}`));
162
- }
163
- else {
164
- this.writeln(`WARNING: ${message}`);
165
- }
166
- }
167
- /**
168
- * Display an error message
169
- */
170
- error(message) {
171
- if (this.config.useColors) {
172
- this.writeln(chalk.red(`✗ ${message}`));
173
- }
174
- else {
175
- this.writeln(`ERROR: ${message}`);
176
- }
177
- }
178
- /**
179
- * Emits an alert.
180
- */
181
- alert() {
182
- if (!this.isInteractive) {
183
- return;
184
- }
185
- const t = "acai";
186
- const b = "";
187
- try {
188
- process.stdout.write("\x07");
189
- const esc = "\u001b";
190
- const bel = "\u0007";
191
- const safe = (s) => s.replaceAll("\u0007", "").replaceAll("\u001b", "");
192
- const payload = `${esc}]777;notify;${safe(t)};${safe(b)}${bel}`;
193
- process.stdout.write(payload);
194
- }
195
- catch (err) {
196
- logger.warn({ err }, "Failed to emit alert");
197
- }
198
- }
199
- write(input) {
200
- process.stdout.write(input);
201
- }
202
- writeln(input) {
203
- process.stdout.write(`${input}\n`);
204
- }
205
- lineBreak() {
206
- this.writeln("");
207
- }
208
- header(header, chalkFn = chalk.green) {
209
- const cols = this.terminalWidth > 0 ? this.terminalWidth : 80;
210
- const width = Math.max(0, cols - header.length - 4);
211
- this.writeln(chalkFn(`\n── ${header} ${"─".repeat(width)} `));
212
- }
213
- async box(header, content) {
214
- const cols = this.terminalWidth > 0 ? this.terminalWidth : 80;
215
- const width = Math.max(4, cols - 4);
216
- // Helper to strip ANSI sequences for accurate visible-width calculation
217
- const stripAnsi = (s) =>
218
- // biome-ignore lint/suspicious/noControlCharactersInRegex: need to detect ansi control characters
219
- s.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, "");
220
- const paddedHeader = ` ${header} `;
221
- const headerVisibleLen = stripAnsi(paddedHeader).length;
222
- const headerStartPos = 1;
223
- // Top border with header (use visible header length)
224
- const leftDashes = headerStartPos;
225
- const rightDashes = Math.max(0, width - leftDashes - headerVisibleLen);
226
- const topBorder = `┌${"─".repeat(leftDashes)}${paddedHeader}${"─".repeat(rightDashes)}┐`;
227
- // Prepare inner content: format markdown first, then wrap to inner width
228
- const innerWidth = Math.max(1, width - 2);
229
- const formatted = applyMarkdown(content);
230
- const wrapped = wrapAnsi(formatted, innerWidth, { trim: false });
231
- const contentLines = wrapped
232
- .split("\n")
233
- .map((line) => {
234
- const visibleLen = stripAnsi(line).length;
235
- const padCount = Math.max(0, innerWidth - visibleLen);
236
- return `│ ${line}${" ".repeat(padCount)} │`;
237
- })
238
- .join("\n");
239
- // Bottom border
240
- const bottomBorder = `└${"─".repeat(width)}┘`;
241
- // Write the box
242
- this.writeln(`${topBorder}\n${contentLines}\n${bottomBorder}`);
243
- }
244
- hr(chalkFn = chalk.gray) {
245
- const cols = this.terminalWidth > 0 ? this.terminalWidth : 80;
246
- this.writeln(chalkFn(`${"─".repeat(Math.max(1, cols - 1))} `));
247
- }
248
- /**
249
- * Create a clickable link in the terminal if supported
250
- */
251
- link(text, url) {
252
- return terminalLink(text, url);
253
- }
254
- /**
255
- * Display a table of data
256
- */
257
- table(data, options = {}) {
258
- const { header, colWidths } = options;
259
- // Calculate column widths based on terminal width
260
- const padding = 5; // Account for table borders and padding
261
- const availableWidth = Math.max(10, this.terminalWidth - padding);
262
- const colCount = header?.length ?? 1;
263
- const width = Math.max(10, Math.floor(availableWidth / Math.max(1, colCount)));
264
- const computedColWidths = colWidths
265
- ? colWidths.map((percent) => Math.max(10, Math.floor((percent / 100) * availableWidth)))
266
- : new Array(colCount).fill(width);
267
- const table = new Table({
268
- head: header,
269
- colWidths: computedColWidths,
270
- wordWrap: true, // Enable word wrapping for the description column
271
- });
272
- table.push(...data);
273
- this.writeln(table.toString());
274
- }
275
- /**
276
- * Create a spinner for showing progress
277
- */
278
- spinner(text, id = "default") {
279
- // Clean up existing spinner with the same ID
280
- if (this.activeSpinners.has(id)) {
281
- this.activeSpinners.get(id)?.stop();
282
- this.activeSpinners.delete(id);
283
- }
284
- // Create spinner only if progress indicators are enabled and terminal is interactive
285
- if (this.config.showProgressIndicators && this.isInteractive) {
286
- const spinner = ora({
287
- text,
288
- spinner: "dots",
289
- color: "cyan",
290
- }).start();
291
- const spinnerInstance = {
292
- id,
293
- update: (newText) => {
294
- spinner.text = newText;
295
- return spinnerInstance;
296
- },
297
- succeed: (text) => {
298
- spinner.succeed(text);
299
- this.activeSpinners.delete(id);
300
- return spinnerInstance;
301
- },
302
- fail: (text) => {
303
- spinner.fail(text);
304
- this.activeSpinners.delete(id);
305
- return spinnerInstance;
306
- },
307
- warn: (text) => {
308
- spinner.warn(text);
309
- this.activeSpinners.delete(id);
310
- return spinnerInstance;
311
- },
312
- info: (text) => {
313
- spinner.info(text);
314
- this.activeSpinners.delete(id);
315
- return spinnerInstance;
316
- },
317
- clear: () => {
318
- spinner.clear();
319
- this.activeSpinners.delete(id);
320
- return spinnerInstance;
321
- },
322
- stop: () => {
323
- spinner.stop();
324
- this.activeSpinners.delete(id);
325
- return spinnerInstance;
326
- },
327
- };
328
- this.activeSpinners.set(id, spinnerInstance);
329
- return spinnerInstance;
330
- }
331
- // Fallback for non-interactive terminals or when progress indicators are disabled
332
- console.info(text);
333
- // Return a dummy spinner
334
- const dummySpinner = {
335
- id,
336
- update: (newText) => {
337
- if (newText !== text) {
338
- console.info(newText);
339
- }
340
- return dummySpinner;
341
- },
342
- succeed: (text) => {
343
- if (text) {
344
- this.success(text);
345
- }
346
- return dummySpinner;
347
- },
348
- fail: (text) => {
349
- if (text) {
350
- this.error(text);
351
- }
352
- return dummySpinner;
353
- },
354
- warn: (text) => {
355
- if (text) {
356
- this.warn(text);
357
- }
358
- return dummySpinner;
359
- },
360
- info: (text) => {
361
- if (text) {
362
- this.info(text);
363
- }
364
- return dummySpinner;
365
- },
366
- clear: () => {
367
- return dummySpinner;
368
- },
369
- stop: () => {
370
- return dummySpinner;
371
- },
372
- };
373
- return dummySpinner;
374
- }
375
- /**
376
- * Displays a horizontal progress bar in the console.
377
- * @param current The current value.
378
- * @param total The target value.
379
- */
380
- displayProgressBar(current, total) {
381
- const terminalWidth = this.terminalWidth > 0 ? this.terminalWidth : 80; // Default to 80 if columns not available
382
- // Function to format numbers concisely (e.g., 1.2K, 5M)
383
- const formatNumber = (num) => {
384
- if (num < 1000) {
385
- return num.toString();
386
- }
387
- if (num < 1_000_000) {
388
- return `${(num / 1000).toFixed(1)}K`;
389
- }
390
- if (num < 1_000_000_000) {
391
- return `${(num / 1_000_000).toFixed(1)}M`;
392
- }
393
- return `${(num / 1_000_000_000).toFixed(1)}G`;
394
- };
395
- const currentFormatted = formatNumber(current);
396
- const totalFormatted = formatNumber(total);
397
- const progressText = `${currentFormatted}/${totalFormatted}`;
398
- const progressTextLength = progressText.length + 1; // Add 1 for space
399
- const progressBarMaxWidth = Math.max(1, terminalWidth - progressTextLength - 1);
400
- const percentage = total === 0 ? 1 : current / total;
401
- const filledWidth = Math.max(0, Math.min(progressBarMaxWidth, Math.floor(percentage * progressBarMaxWidth)));
402
- const emptyWidth = Math.max(0, progressBarMaxWidth - filledWidth);
403
- const a = chalk.yellow("─"); //"█"
404
- const b = chalk.gray("─"); // "░"
405
- const filledBar = a.repeat(filledWidth);
406
- const emptyBar = b.repeat(emptyWidth);
407
- // Use \r to move cursor to the beginning of the line for updates
408
- this.writeln(`\r${filledBar}${emptyBar} ${progressText} `);
409
- }
410
- formatMarkdown(content, wrap = false) {
411
- const columns = this.terminalWidth;
412
- const formatted = applyMarkdown(content);
413
- if (wrap) {
414
- return wrapAnsi(formatted, columns - 6, { trim: false });
415
- }
416
- return formatted;
417
- }
418
- }
419
- // Re-export the types
420
- export * from "./types.js";
@@ -1,2 +0,0 @@
1
- export declare function isMarkdown(input: string): boolean;
2
- export declare function getListNumber(listDepth: number, orderedListNumber: number): string;
@@ -1,81 +0,0 @@
1
- const markdownHeaderRegex = /^#{1,6}\s/m;
2
- const markdownBoldRegex = /(\*\*|__)(.*?)\1/;
3
- const markdownItalicRegex = /(\*|_)(.*?)\1/;
4
- const markdownCodeRegex = /`{1,3}[^`]+`{1,3}/;
5
- const markdownLinkRegex = /\((.*?)\]\((.*?)\)/;
6
- const markdownBlockquoteRegex = /^>\s/m;
7
- const markdownUnorderedListRegex = /^-\s|\*\s|\+\s/m;
8
- const markdownOrderedListRegex = /^\d+\.\s/m;
9
- const markdownHorizontalRuleRegex = /^---$/m;
10
- const markdownImageRegex = /!\[(.*?)\]\((.*?)\)/;
11
- export function isMarkdown(input) {
12
- // Simple heuristics: look for common markdown syntax
13
- const markdownPatterns = [
14
- markdownHeaderRegex, // headings
15
- markdownBoldRegex, // bold
16
- markdownItalicRegex, // italic
17
- markdownCodeRegex, // inline code or code block
18
- markdownLinkRegex, // links
19
- markdownBlockquoteRegex, // blockquote
20
- markdownUnorderedListRegex, // unordered list
21
- markdownOrderedListRegex, // ordered list
22
- markdownHorizontalRuleRegex, // horizontal rule
23
- markdownImageRegex, // images
24
- ];
25
- return markdownPatterns.some((pattern) => pattern.test(input));
26
- }
27
- function getDepth1ListNumber(i) {
28
- if (i <= 0) {
29
- return "";
30
- }
31
- const letters = [];
32
- let num = i;
33
- while (num > 0) {
34
- num--; // Adjust for 0-indexing
35
- letters.unshift(String.fromCharCode(97 + (num % 26)));
36
- num = Math.floor(num / 26);
37
- }
38
- return letters.join("");
39
- }
40
- function getDepth2ListNumber(i) {
41
- if (i <= 0) {
42
- return "";
43
- }
44
- const romanNumerals = [
45
- ["m", 1000],
46
- ["cm", 900],
47
- ["d", 500],
48
- ["cd", 400],
49
- ["c", 100],
50
- ["xc", 90],
51
- ["l", 50],
52
- ["xl", 40],
53
- ["x", 10],
54
- ["ix", 9],
55
- ["v", 5],
56
- ["iv", 4],
57
- ["i", 1],
58
- ];
59
- let num = i;
60
- let result = "";
61
- for (const [roman, value] of romanNumerals) {
62
- while (num >= value) {
63
- result += roman;
64
- num -= value;
65
- }
66
- }
67
- return result;
68
- }
69
- export function getListNumber(listDepth, orderedListNumber) {
70
- switch (listDepth) {
71
- case 0:
72
- case 1:
73
- return orderedListNumber.toString();
74
- case 2:
75
- return getDepth1ListNumber(orderedListNumber);
76
- case 3:
77
- return getDepth2ListNumber(orderedListNumber);
78
- default:
79
- return orderedListNumber.toString();
80
- }
81
- }
@@ -1 +0,0 @@
1
- export declare function applyMarkdown(content: string): string;
@@ -1,111 +0,0 @@
1
- import { EOL } from "node:os";
2
- import chalk from "chalk";
3
- import { highlight, supportsLanguage } from "cli-highlight";
4
- import Table from "cli-table3";
5
- import { marked } from "marked";
6
- import { logger } from "../logger.js";
7
- import { link as terminalLink } from "./formatting.js";
8
- import { getListNumber } from "./markdown-utils.js";
9
- function logError(msg) {
10
- logger.error(msg);
11
- }
12
- export function applyMarkdown(content) {
13
- return marked
14
- .lexer(content)
15
- .map((token) => format(token))
16
- .join("")
17
- .trim();
18
- }
19
- function format(token, listDepth = 0, orderedListNumber = null, parent = null) {
20
- switch (token.type) {
21
- case "blockquote":
22
- return chalk.dim.italic((token.tokens ?? [])
23
- .map((_) => format(_))
24
- .map((l) => ` ${l}`)
25
- .join(""));
26
- case "code": {
27
- if (token.lang && supportsLanguage(token.lang)) {
28
- return highlight(token.text, { language: token.lang }) + EOL;
29
- }
30
- logError(`Language not supported while highlighting code, falling back to markdown: ${token.lang}`);
31
- return highlight(token.text, { language: "markdown" }) + EOL;
32
- }
33
- case "codespan":
34
- // inline code
35
- return chalk.blue(token.text);
36
- case "em":
37
- return chalk.italic((token.tokens ?? []).map((_) => format(_)).join(""));
38
- case "strong":
39
- return chalk.bold((token.tokens ?? []).map((_) => format(_)).join(""));
40
- case "heading":
41
- switch (token.depth) {
42
- case 1: // h1
43
- return (chalk.bold.italic.underline((token.tokens ?? []).map((_) => format(_)).join("")) +
44
- EOL +
45
- EOL);
46
- case 2: // h2
47
- return (chalk.bold((token.tokens ?? []).map((_) => format(_)).join("")) +
48
- EOL +
49
- EOL);
50
- default: // h3+
51
- return (chalk.bold.dim((token.tokens ?? []).map((_) => format(_)).join("")) +
52
- EOL +
53
- EOL);
54
- }
55
- case "hr":
56
- return "---";
57
- case "image": {
58
- const alt = (token.title ?? token.text ?? "").toString().trim();
59
- if (alt.length > 0) {
60
- return `[Image: ${alt} (${token.href})]`;
61
- }
62
- return `[Image: ${token.href}]`;
63
- }
64
- case "link":
65
- return terminalLink(token.text, token.href);
66
- case "list": {
67
- return token.items
68
- .map((_, index) => format(_, listDepth, token.ordered ? token.start + index : null, token))
69
- .join("");
70
- }
71
- case "list_item":
72
- return (token.tokens ?? [])
73
- .map((_) => `${" ".repeat(listDepth)}${format(_, listDepth + 1, orderedListNumber, token)}`)
74
- .join("");
75
- case "paragraph":
76
- return (token.tokens ?? []).map((_) => format(_)).join("") + EOL;
77
- case "space":
78
- return EOL;
79
- case "text": {
80
- if (parent?.type === "list_item") {
81
- return `${orderedListNumber === null ? "-" : `${getListNumber(listDepth, orderedListNumber)}.`} ${token.tokens ? token.tokens.map((_) => format(_, listDepth, orderedListNumber, token)).join("") : token.text}${EOL}`;
82
- }
83
- return token.text;
84
- }
85
- case "table": {
86
- const header = Array.isArray(token.header)
87
- ? token.header
88
- : [token.header];
89
- const rows = Array.isArray(token.rows) ? token.rows : [token.rows];
90
- // Calculate column widths based on terminal width
91
- const padding = 5; // Account for table borders and padding
92
- const availableWidth = Math.max(10, (process.stdout.columns || 80) - padding);
93
- const colCount = header?.length ?? 1;
94
- const width = Math.max(10, Math.floor(availableWidth / Math.max(1, colCount)));
95
- const computedColWidths = new Array(colCount).fill(width);
96
- const table = new Table({
97
- head: header.map((h) => h.text),
98
- colWidths: computedColWidths,
99
- wordWrap: true, // Enable word wrapping for the description column
100
- });
101
- table.push(...rows.map((row) => row.map((c) => c.text)));
102
- return `${table.toString()}\n`;
103
- }
104
- case "del": {
105
- return chalk.strikethrough(token.text);
106
- }
107
- default:
108
- console.log(token.type);
109
- return "";
110
- }
111
- }
@@ -1,71 +0,0 @@
1
- /**
2
- * Terminal theme options
3
- */
4
- type TerminalTheme = "dark" | "light" | "system";
5
- /**
6
- * Terminal configuration
7
- */
8
- export interface TerminalConfig {
9
- /**
10
- * Terminal color theme
11
- */
12
- theme: TerminalTheme;
13
- /**
14
- * Whether to use colors in output
15
- */
16
- useColors: boolean;
17
- /**
18
- * Whether to show progress indicators
19
- */
20
- showProgressIndicators: boolean;
21
- /**
22
- * Whether to enable syntax highlighting for code
23
- */
24
- codeHighlighting: boolean;
25
- /**
26
- * Maximum terminal height (rows)
27
- */
28
- maxHeight?: number | undefined;
29
- /**
30
- * Maximum terminal width (columns)
31
- */
32
- maxWidth?: number | undefined;
33
- }
34
- /**
35
- * Spinner instance for progress indicators
36
- */
37
- export interface SpinnerInstance {
38
- /**
39
- * Spinner identifier
40
- */
41
- id: string;
42
- /**
43
- * Update spinner text
44
- */
45
- update(text: string): SpinnerInstance;
46
- /**
47
- * Mark spinner as successful and stop
48
- */
49
- succeed(text?: string): SpinnerInstance;
50
- /**
51
- * Mark spinner as failed and stop
52
- */
53
- fail(text?: string): SpinnerInstance;
54
- /**
55
- * Mark spinner with warning and stop
56
- */
57
- warn(text?: string): SpinnerInstance;
58
- /**
59
- * Mark spinner with info and stop
60
- */
61
- info(text?: string): SpinnerInstance;
62
- /**
63
- * Clear spinner without any indicator
64
- */
65
- clear(): SpinnerInstance;
66
- /**
67
- * Stop spinner without any indicator
68
- */
69
- stop(): SpinnerInstance;
70
- }
71
- export {};
@@ -1 +0,0 @@
1
- export {};