@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
package/source/prompts.ts DELETED
@@ -1,172 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import { platform } from "node:os";
3
- import path from "node:path";
4
- import { config } from "./config.ts";
5
- import { dedent } from "./dedent.ts";
6
- import { AgentTool } from "./tools/agent.ts";
7
- import { BashTool } from "./tools/bash.ts";
8
- import { CodeInterpreterTool } from "./tools/code-interpreter.ts";
9
- import { DirectoryTreeTool } from "./tools/directory-tree.ts";
10
- import { EditFileTool } from "./tools/edit-file.ts";
11
- import { getCurrentBranch, inGitDirectory } from "./tools/git-utils.ts";
12
- import { GrepTool } from "./tools/grep.ts";
13
- import { ReadFileTool } from "./tools/read-file.ts";
14
- import { SaveFileTool } from "./tools/save-file.ts";
15
- import { ThinkTool } from "./tools/think.ts";
16
- import { WebFetchTool } from "./tools/web-fetch.ts";
17
- import { WebSearchTool } from "./tools/web-search.ts";
18
-
19
- function intro() {
20
- return "You are acai, an AI-powered CLI assistant that accelerates software engineering workflows through intelligent command-line assistance.";
21
- }
22
-
23
- async function instructions() {
24
- const systemMdPath = path.join(config.project.getPath(), "system.md");
25
- try {
26
- const content = await readFile(systemMdPath, "utf8");
27
- if (content.trim()) {
28
- return content;
29
- }
30
- } catch {
31
- // system.md doesn't exist or is empty, use default instructions
32
- }
33
-
34
- return `## Core Principles
35
-
36
- - **CLI-Optimized**: Be concise and direct - responses appear in a terminal.
37
- - **Progressive Problem Solving**: Work through problems methodically until resolution.
38
- - **User Authority**: NEVER commit changes or add dependencies without explicit user approval.
39
- - **Security-First**: Prioritize secure coding practices in all suggestions.
40
- - **Completion Focus**: Continue working until the user's query is completely resolved.
41
- - **Expert Level**: Assume the user is an experienced software engineer.
42
-
43
- ## Response Format
44
-
45
- - **Direct Answers**: One-word or concise answers when possible.
46
- - **Code First**: Lead with code snippets for code-related queries.
47
- - **No Fluff**: Avoid preambles or phrases like "Here is the content..."
48
- - **Error Reporting**: Specify error, location, and fix (e.g., \`Error: TypeError at auth.ts:42. Fix: Add null check.\`).
49
-
50
- ## Work Standards
51
-
52
- ### Code Quality
53
- - Match existing code conventions and patterns
54
- - Use libraries/utilities already in the project
55
- - Prioritize maintainable, readable code over clever solutions
56
-
57
- ### Security & Error Handling
58
- - Validate/sanitize all inputs and outputs
59
- - Use parameterized queries for databases
60
- - Never hardcode secrets; prevent injection attacks, XSS, unauthorized access
61
- - Apply principle of least privilege in API integrations
62
- - If a tool fails, ask the user how to proceed
63
- - Report errors with specific locations and suggested fixes`;
64
- }
65
-
66
- function toolUsage() {
67
- return `## Tool Usage Guidelines
68
-
69
- ### Information Gathering
70
- - Use \`${DirectoryTreeTool.name}\` for project structure
71
- - Use \`${ReadFileTool.name}\` for file contents if filenames are provided in the prompt
72
- - Use \`${GrepTool.name}\` for code pattern searches
73
- - Use \`${WebFetchTool.name}\` for text-based URLs provided in the prompt
74
- - Use \`${WebSearchTool.name}\` for external research (e.g., libraries, errors)
75
- - Use \`${AgentTool.name}\` for iterative keyword/file searches
76
- - If file contents or URLs are provided in the prompt, use them directly without re-fetching
77
- - Always verify file contents before suggesting changes unless provided in the prompt
78
-
79
- ### Code Modification
80
- - Use \`${EditFileTool.name}\` for existing file edits (requires user approval)
81
- - Use \`${SaveFileTool.name}\` for new files only
82
-
83
- ### Planning & Complex Tasks
84
- - Use \`${ThinkTool.name}\` for structured reasoning on complex problems
85
- - Outline multi-step tasks before execution
86
-
87
- ### Bash Commands (\`${BashTool.name}\`)
88
- - Execute bash commands within project directory only
89
- - Always specify absolute paths to avoid errors
90
- - You have access to the Github CLI
91
- - **Background Processes:** Use background processes (via \`&\`) for commands that are unlikely to stop on their own, e.g. \`node server.js &\`. If unsure, ask the user.
92
- - **Interactive Commands:** Try to avoid shell commands that are likely to require user interaction (e.g. \`git rebase -i\`). Use non-interactive versions of commands (e.g. \`npm init -y\` instead of \`npm init\`) when available, and otherwise remind the user that interactive shell commands are not supported and may cause hangs until canceled by the user.
93
-
94
- ### Code Interpreter (\`${CodeInterpreterTool.name}\`)
95
- - Executes JavaScript code in a separate Node.js process using Node's Permission Model
96
- - By default, the child process has no permissions except read/write within the current working directory
97
- - Returns stdout, stderr, and exitCode
98
- - Use console.log/console.error to produce outpu`;
99
- }
100
-
101
- function escalationProcedures() {
102
- return `## Escalation
103
-
104
- - If stuck, state the limitation, suggest alternatives, and ask the user for guidance`;
105
- }
106
-
107
- async function getRules() {
108
- const rules = (await config.readAgentsFile()).trim();
109
- const learnedRules = (await config.readProjectLearnedRulesFile()).trim();
110
- let result = "";
111
- if (rules) {
112
- result += `## Project Rules:\n\n${rules}\n`;
113
- }
114
- if (learnedRules) {
115
- if (!rules) {
116
- result += "## Project Rules:\n\n";
117
- }
118
- result += `### Important rules to follow\n\n${learnedRules}`;
119
- }
120
- return result.trim();
121
- }
122
-
123
- async function environmentInfo() {
124
- const gitDirectory = await inGitDirectory();
125
- let gitSection = `- **Is directory a git repo**: ${gitDirectory ? "Yes" : "No"}`;
126
- if (gitDirectory) {
127
- gitSection += `\n- ** Current git branch**: ${await getCurrentBranch()}`;
128
- }
129
-
130
- return `## Environment
131
-
132
- - **Current working directory**: ${process.cwd()}. [Use this value directly instead of calling the \`${BashTool.name}(pwd)\` tool unless you have a specific reason to verify it].
133
- ${gitSection}
134
- - **Platform**: ${platform()}
135
- - **Today's date**: ${(new Date()).toISOString()}`;
136
- }
137
-
138
- export async function systemPrompt(options?: {
139
- supportsToolCalling?: boolean;
140
- }) {
141
- const { supportsToolCalling = true } = options ?? {};
142
-
143
- const prompt = dedent`
144
- ${intro()}
145
-
146
- ${await instructions()}
147
-
148
- ${supportsToolCalling ? toolUsage() : ""}
149
-
150
- ${escalationProcedures()}
151
-
152
- ${await getRules()}
153
-
154
- ${await environmentInfo()}
155
- `;
156
-
157
- return prompt;
158
- }
159
-
160
- export async function minSystemPrompt() {
161
- const prompt = dedent`
162
- ${intro()}
163
-
164
- ${await instructions()}
165
-
166
- ${await getRules()}
167
-
168
- ${await environmentInfo()}
169
- `;
170
-
171
- return prompt;
172
- }
@@ -1,196 +0,0 @@
1
- import { readdir } from "node:fs/promises";
2
- import { parse, sep } from "node:path";
3
- import { createInterface, type Interface } from "node:readline/promises";
4
- import Clipboard from "@crosscopy/clipboard";
5
- import { asyncTry } from "@travisennis/stdlib/try";
6
- import type { CommandManager } from "./commands/manager.ts";
7
- import { logger } from "./logger.ts";
8
-
9
- const whitespaceRegex = /\s+/;
10
-
11
- async function fileSystemCompleter(line: string): Promise<[string[], string]> {
12
- try {
13
- const words = line.split(" ");
14
- let last = words.at(-1);
15
- if (!last) {
16
- return [[], line];
17
- }
18
- const isAt = last.startsWith("@");
19
- if (isAt) {
20
- last = last.slice(1);
21
- }
22
-
23
- let { dir, base } = parse(last);
24
-
25
- // If dir is empty, use current directory
26
- if (!dir) {
27
- dir = ".";
28
- }
29
-
30
- let tryAttempt = await asyncTry(readdir(dir, { withFileTypes: true }));
31
- if (tryAttempt.isFailure) {
32
- tryAttempt = await asyncTry(readdir(".", { withFileTypes: true }));
33
- }
34
-
35
- let dirEntries = tryAttempt.unwrap();
36
-
37
- // for an exact match that is a directory, read the contents of the directory
38
- if (
39
- dirEntries.find((entry) => entry.name === base && entry.isDirectory())
40
- ) {
41
- dir = dir === "/" || dir === sep ? `${dir}${base}` : `${dir}/${base}`;
42
- dirEntries = await readdir(dir, { withFileTypes: true });
43
- base = "";
44
- } else {
45
- dirEntries = dirEntries.filter((entry) => entry.name.startsWith(base));
46
- }
47
-
48
- const hits = dirEntries
49
- .filter((entry) => entry.isFile() || entry.isDirectory())
50
- .map((entry) => {
51
- const prefix =
52
- dir === "." ? "" : dir === sep || dir === "/" ? "" : `${dir}/`;
53
- return `${isAt ? "@" : ""}${prefix}${entry.name}${entry.isDirectory() && !entry.name.endsWith("/") ? "/" : ""}`;
54
- });
55
-
56
- return [hits, `${isAt ? "@" : ""}${last}`];
57
- } catch (_error) {
58
- logger.error(_error);
59
- return [[], line];
60
- }
61
- }
62
-
63
- export class ReplPrompt {
64
- // biome-ignore lint/suspicious/noExplicitAny: Keypress listener signature
65
- private keypressListener?: (str: string, key: any) => void;
66
- private rl: Interface;
67
- private history: string[];
68
- private maxHistory = 25;
69
-
70
- constructor({
71
- commands,
72
- history,
73
- }: { commands: CommandManager; history: string[] }) {
74
- this.history = history;
75
-
76
- this.rl = createInterface({
77
- input: process.stdin,
78
- output: process.stdout,
79
- history: this.history,
80
- historySize: this.maxHistory,
81
- completer: async (line): Promise<[string[], string]> => {
82
- const completions = commands.getCommands();
83
- const words = line.trim().split(whitespaceRegex);
84
- const firstWord = words[0] ?? "";
85
- const rest: string = words.slice(1).join(" ") ?? "";
86
-
87
- const matchingCommands = completions.filter((c) =>
88
- c.startsWith(firstWord),
89
- );
90
-
91
- if (matchingCommands.length === 1 && rest !== "") {
92
- // Single command matched, try to get subcommands
93
- const subCompletions = await commands.getSubCommands(
94
- matchingCommands[0] ?? "",
95
- );
96
- const hits = subCompletions.filter(
97
- (sc) => sc.startsWith(rest) || rest === "*",
98
- );
99
- if (hits.length > 0) {
100
- return [hits.map((h) => `${firstWord} ${h}`), line];
101
- }
102
- }
103
-
104
- if (
105
- matchingCommands.length > 0 &&
106
- (words.length === 1 || line.endsWith(" "))
107
- ) {
108
- return [matchingCommands, line];
109
- }
110
-
111
- return fileSystemCompleter(line); // [completions, line];
112
- },
113
- });
114
-
115
- if (process.stdin.isTTY) {
116
- this.keypressListener = async (
117
- _str: string,
118
- key: {
119
- name: string;
120
- ctrl: boolean;
121
- meta: boolean;
122
- shift: boolean;
123
- sequence: string;
124
- },
125
- ) => {
126
- // if (this.rl.closed) {
127
- // if (this.keypressListener) {
128
- // process.stdin.off("keypress", this.keypressListener);
129
- // this.keypressListener = undefined;
130
- // }
131
- // return;
132
- // }
133
-
134
- if (key?.ctrl && key.name === "v" && !key.meta && !key.shift) {
135
- try {
136
- const clipboardText = await Clipboard.getText();
137
- if (clipboardText) {
138
- const currentLine = this.rl.line;
139
- const cursorPos = this.rl.cursor;
140
-
141
- const beforeCursor = currentLine.substring(0, cursorPos);
142
- const afterCursor = currentLine.substring(cursorPos);
143
-
144
- const newLine = beforeCursor + clipboardText + afterCursor;
145
-
146
- // biome-ignore lint/suspicious/noExplicitAny: Accessing internal readline method
147
- (this.rl as any).line = newLine;
148
- // biome-ignore lint/suspicious/noExplicitAny: Accessing internal readline method
149
- (this.rl as any).cursor = cursorPos + clipboardText.length;
150
-
151
- // biome-ignore lint/suspicious/noExplicitAny: Accessing internal readline method
152
- (this.rl as any)._refreshLine();
153
- }
154
- } catch (error) {
155
- logger.error(
156
- `Failed to paste from clipboard: ${(error as Error).message}`,
157
- );
158
- }
159
- }
160
- };
161
- process.stdin.on("keypress", this.keypressListener);
162
- }
163
- }
164
-
165
- async input() {
166
- const input = await this.rl.question("> ");
167
-
168
- // The readline interface automatically adds the input to the history.
169
- // We need to handle two things:
170
- // 1. Don't save empty lines.
171
- // 2. Enforce max history size.
172
- if (!input.trim()) {
173
- // Last entry was this empty input, so remove it.
174
- this.history.pop();
175
- } else {
176
- // A valid command was added. Trim history if needed.
177
- while (this.history.length > this.maxHistory) {
178
- this.history.shift();
179
- }
180
- }
181
-
182
- return input;
183
- }
184
-
185
- close() {
186
- if (this.keypressListener) {
187
- process.stdin.off("keypress", this.keypressListener);
188
- this.keypressListener = undefined;
189
- }
190
- this.rl.close();
191
- }
192
-
193
- [Symbol.dispose]() {
194
- this.close();
195
- }
196
- }