@travisennis/acai 0.0.12 → 0.0.13

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 (237) hide show
  1. package/README.md +3 -2
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +2 -5
  4. package/dist/commands/history/types.d.ts +3 -2
  5. package/dist/commands/history/types.d.ts.map +1 -1
  6. package/dist/commands/init-project/utils.d.ts +0 -1
  7. package/dist/commands/init-project/utils.d.ts.map +1 -1
  8. package/dist/commands/init-project/utils.js +1 -1
  9. package/dist/commands/manager.d.ts.map +1 -1
  10. package/dist/commands/manager.js +0 -18
  11. package/dist/commands/share/html-renderer.d.ts.map +1 -1
  12. package/dist/commands/share/html-renderer.js +54 -48
  13. package/dist/commands/tools/index.js +39 -38
  14. package/dist/config/index.d.ts +0 -2
  15. package/dist/config/index.d.ts.map +1 -1
  16. package/dist/config/index.js +2 -6
  17. package/dist/index.d.ts +14 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +94 -76
  20. package/dist/models/manager.d.ts +1 -10
  21. package/dist/models/manager.d.ts.map +1 -1
  22. package/dist/models/manager.js +2 -2
  23. package/dist/models/opencode-go-provider.d.ts +4 -4
  24. package/dist/models/opencode-go-provider.d.ts.map +1 -1
  25. package/dist/models/opencode-go-provider.js +29 -35
  26. package/dist/models/providers.d.ts +1 -1
  27. package/dist/models/providers.d.ts.map +1 -1
  28. package/dist/prompts/system-prompt.d.ts +0 -2
  29. package/dist/prompts/system-prompt.d.ts.map +1 -1
  30. package/dist/prompts/system-prompt.js +6 -10
  31. package/dist/repl/index.d.ts +27 -11
  32. package/dist/repl/index.d.ts.map +1 -1
  33. package/dist/repl/index.js +238 -254
  34. package/dist/skills/index.d.ts +12 -2
  35. package/dist/skills/index.d.ts.map +1 -1
  36. package/dist/skills/index.js +123 -73
  37. package/dist/terminal/control.d.ts +1 -21
  38. package/dist/terminal/control.d.ts.map +1 -1
  39. package/dist/terminal/control.js +1 -32
  40. package/dist/terminal/formatting.d.ts +0 -33
  41. package/dist/terminal/formatting.d.ts.map +1 -1
  42. package/dist/terminal/formatting.js +0 -91
  43. package/dist/terminal/highlight/theme.d.ts +0 -37
  44. package/dist/terminal/highlight/theme.d.ts.map +1 -1
  45. package/dist/terminal/highlight/theme.js +1 -79
  46. package/dist/terminal/keys.d.ts +0 -97
  47. package/dist/terminal/keys.d.ts.map +1 -1
  48. package/dist/terminal/keys.js +0 -194
  49. package/dist/terminal/select-prompt.d.ts.map +1 -1
  50. package/dist/terminal/select-prompt.js +65 -51
  51. package/dist/terminal/style.d.ts +1 -1
  52. package/dist/terminal/style.d.ts.map +1 -1
  53. package/dist/terminal/supports-color.d.ts.map +1 -1
  54. package/dist/terminal/supports-color.js +38 -20
  55. package/dist/terminal/supports-hyperlinks.d.ts +3 -0
  56. package/dist/terminal/supports-hyperlinks.d.ts.map +1 -1
  57. package/dist/terminal/supports-hyperlinks.js +72 -31
  58. package/dist/terminal/table/layout-manager.d.ts +0 -20
  59. package/dist/terminal/table/layout-manager.d.ts.map +1 -1
  60. package/dist/terminal/table/layout-manager.js +68 -44
  61. package/dist/terminal/table/utils.d.ts +0 -1
  62. package/dist/terminal/table/utils.d.ts.map +1 -1
  63. package/dist/terminal/table/utils.js +2 -4
  64. package/dist/tools/apply-patch.d.ts +5 -3
  65. package/dist/tools/apply-patch.d.ts.map +1 -1
  66. package/dist/tools/apply-patch.js +154 -123
  67. package/dist/tools/bash.d.ts.map +1 -1
  68. package/dist/tools/bash.js +11 -8
  69. package/dist/tools/dynamic-tool-loader.d.ts +6 -1
  70. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  71. package/dist/tools/dynamic-tool-loader.js +154 -135
  72. package/dist/tools/index.d.ts +3 -133
  73. package/dist/tools/index.d.ts.map +1 -1
  74. package/dist/tools/index.js +0 -20
  75. package/dist/tools/read-file.d.ts.map +1 -1
  76. package/dist/tools/read-file.js +32 -13
  77. package/dist/tools/skill.d.ts.map +1 -1
  78. package/dist/tools/skill.js +20 -13
  79. package/dist/tools/web-fetch.d.ts +2 -6
  80. package/dist/tools/web-fetch.d.ts.map +1 -1
  81. package/dist/tools/web-fetch.js +59 -36
  82. package/dist/tools/web-search.d.ts +0 -4
  83. package/dist/tools/web-search.d.ts.map +1 -1
  84. package/dist/tools/web-search.js +40 -32
  85. package/dist/tui/autocomplete/utils.d.ts +0 -15
  86. package/dist/tui/autocomplete/utils.d.ts.map +1 -1
  87. package/dist/tui/autocomplete/utils.js +0 -85
  88. package/dist/tui/autocomplete.d.ts +1 -1
  89. package/dist/tui/autocomplete.d.ts.map +1 -1
  90. package/dist/tui/autocomplete.js +1 -1
  91. package/dist/tui/components/editor.d.ts +12 -0
  92. package/dist/tui/components/editor.d.ts.map +1 -1
  93. package/dist/tui/components/editor.js +181 -195
  94. package/dist/tui/components/input.d.ts +4 -0
  95. package/dist/tui/components/input.d.ts.map +1 -1
  96. package/dist/tui/components/input.js +33 -31
  97. package/dist/tui/components/markdown.d.ts +30 -0
  98. package/dist/tui/components/markdown.d.ts.map +1 -1
  99. package/dist/tui/components/markdown.js +274 -242
  100. package/dist/tui/components/modal.d.ts.map +1 -1
  101. package/dist/tui/components/modal.js +11 -11
  102. package/dist/tui/components/select-list.d.ts +5 -0
  103. package/dist/tui/components/select-list.d.ts.map +1 -1
  104. package/dist/tui/components/select-list.js +69 -98
  105. package/dist/tui/components/table.d.ts +6 -0
  106. package/dist/tui/components/table.d.ts.map +1 -1
  107. package/dist/tui/components/table.js +61 -52
  108. package/dist/tui/index.d.ts +1 -8
  109. package/dist/tui/index.d.ts.map +1 -1
  110. package/dist/tui/index.js +0 -8
  111. package/dist/tui/tui.d.ts +9 -0
  112. package/dist/tui/tui.d.ts.map +1 -1
  113. package/dist/tui/tui.js +78 -48
  114. package/dist/tui/utils.d.ts +7 -0
  115. package/dist/tui/utils.d.ts.map +1 -1
  116. package/dist/tui/utils.js +117 -53
  117. package/dist/utils/bash.d.ts.map +1 -1
  118. package/dist/utils/bash.js +121 -104
  119. package/dist/utils/command-protection.d.ts +3 -2
  120. package/dist/utils/command-protection.d.ts.map +1 -1
  121. package/dist/utils/command-protection.js +42 -33
  122. package/dist/utils/filesystem/operations.d.ts +0 -15
  123. package/dist/utils/filesystem/operations.d.ts.map +1 -1
  124. package/dist/utils/filesystem/operations.js +1 -38
  125. package/dist/utils/filesystem/security.d.ts.map +1 -1
  126. package/dist/utils/filesystem/security.js +22 -15
  127. package/dist/utils/filetype-detection.d.ts +0 -1
  128. package/dist/utils/filetype-detection.d.ts.map +1 -1
  129. package/dist/utils/filetype-detection.js +0 -12
  130. package/dist/utils/formatting.d.ts +0 -30
  131. package/dist/utils/formatting.d.ts.map +1 -1
  132. package/dist/utils/formatting.js +0 -44
  133. package/dist/utils/git.d.ts +4 -6
  134. package/dist/utils/git.d.ts.map +1 -1
  135. package/dist/utils/git.js +36 -46
  136. package/dist/utils/ignore.d.ts +1 -1
  137. package/dist/utils/ignore.d.ts.map +1 -1
  138. package/dist/utils/ignore.js +1 -1
  139. package/dist/utils/process.d.ts.map +1 -1
  140. package/dist/utils/process.js +77 -79
  141. package/dist/utils/yaml.d.ts +0 -1
  142. package/dist/utils/yaml.d.ts.map +1 -1
  143. package/dist/utils/yaml.js +80 -89
  144. package/dist/utils/zod.d.ts +0 -3
  145. package/dist/utils/zod.d.ts.map +1 -1
  146. package/dist/utils/zod.js +0 -7
  147. package/package.json +25 -24
  148. package/dist/agent/sub-agent.d.ts +0 -23
  149. package/dist/agent/sub-agent.d.ts.map +0 -1
  150. package/dist/agent/sub-agent.js +0 -109
  151. package/dist/commands/add-directory/index.d.ts +0 -3
  152. package/dist/commands/add-directory/index.d.ts.map +0 -1
  153. package/dist/commands/add-directory/index.js +0 -50
  154. package/dist/commands/add-directory/utils.d.ts +0 -3
  155. package/dist/commands/add-directory/utils.d.ts.map +0 -1
  156. package/dist/commands/add-directory/utils.js +0 -15
  157. package/dist/commands/clear/index.d.ts +0 -3
  158. package/dist/commands/clear/index.d.ts.map +0 -1
  159. package/dist/commands/clear/index.js +0 -13
  160. package/dist/commands/generate-rules/index.d.ts +0 -3
  161. package/dist/commands/generate-rules/index.d.ts.map +0 -1
  162. package/dist/commands/generate-rules/index.js +0 -206
  163. package/dist/commands/generate-rules/service.d.ts +0 -22
  164. package/dist/commands/generate-rules/service.d.ts.map +0 -1
  165. package/dist/commands/generate-rules/service.js +0 -103
  166. package/dist/commands/generate-rules/utils.d.ts +0 -5
  167. package/dist/commands/generate-rules/utils.d.ts.map +0 -1
  168. package/dist/commands/generate-rules/utils.js +0 -25
  169. package/dist/commands/handoff/index.d.ts +0 -3
  170. package/dist/commands/handoff/index.d.ts.map +0 -1
  171. package/dist/commands/handoff/index.js +0 -97
  172. package/dist/commands/handoff/utils.d.ts +0 -4
  173. package/dist/commands/handoff/utils.d.ts.map +0 -1
  174. package/dist/commands/handoff/utils.js +0 -123
  175. package/dist/commands/list-directories/index.d.ts +0 -3
  176. package/dist/commands/list-directories/index.d.ts.map +0 -1
  177. package/dist/commands/list-directories/index.js +0 -35
  178. package/dist/commands/pickup/index.d.ts +0 -3
  179. package/dist/commands/pickup/index.d.ts.map +0 -1
  180. package/dist/commands/pickup/index.js +0 -141
  181. package/dist/commands/pickup/types.d.ts +0 -6
  182. package/dist/commands/pickup/types.d.ts.map +0 -1
  183. package/dist/commands/pickup/types.js +0 -1
  184. package/dist/commands/pickup/utils.d.ts +0 -7
  185. package/dist/commands/pickup/utils.d.ts.map +0 -1
  186. package/dist/commands/pickup/utils.js +0 -56
  187. package/dist/commands/remove-directory/index.d.ts +0 -3
  188. package/dist/commands/remove-directory/index.d.ts.map +0 -1
  189. package/dist/commands/remove-directory/index.js +0 -55
  190. package/dist/commands/review/index.d.ts +0 -3
  191. package/dist/commands/review/index.d.ts.map +0 -1
  192. package/dist/commands/review/index.js +0 -12
  193. package/dist/commands/review/review-panel.d.ts +0 -3
  194. package/dist/commands/review/review-panel.d.ts.map +0 -1
  195. package/dist/commands/review/review-panel.js +0 -186
  196. package/dist/commands/review/utils.d.ts +0 -18
  197. package/dist/commands/review/utils.d.ts.map +0 -1
  198. package/dist/commands/review/utils.js +0 -146
  199. package/dist/commands/shell/index.d.ts +0 -3
  200. package/dist/commands/shell/index.d.ts.map +0 -1
  201. package/dist/commands/shell/index.js +0 -96
  202. package/dist/subagents/index.d.ts +0 -16
  203. package/dist/subagents/index.d.ts.map +0 -1
  204. package/dist/subagents/index.js +0 -231
  205. package/dist/terminal/index.d.ts +0 -9
  206. package/dist/terminal/index.d.ts.map +0 -1
  207. package/dist/terminal/index.js +0 -8
  208. package/dist/tools/agent.d.ts +0 -27
  209. package/dist/tools/agent.d.ts.map +0 -1
  210. package/dist/tools/agent.js +0 -81
  211. package/dist/tools/directory-tree.d.ts +0 -28
  212. package/dist/tools/directory-tree.d.ts.map +0 -1
  213. package/dist/tools/directory-tree.js +0 -154
  214. package/dist/tools/glob.d.ts +0 -35
  215. package/dist/tools/glob.d.ts.map +0 -1
  216. package/dist/tools/glob.js +0 -167
  217. package/dist/tools/grep.d.ts +0 -100
  218. package/dist/tools/grep.d.ts.map +0 -1
  219. package/dist/tools/grep.js +0 -608
  220. package/dist/tools/ls.d.ts +0 -26
  221. package/dist/tools/ls.d.ts.map +0 -1
  222. package/dist/tools/ls.js +0 -83
  223. package/dist/tui/components/header.d.ts +0 -21
  224. package/dist/tui/components/header.d.ts.map +0 -1
  225. package/dist/tui/components/header.js +0 -63
  226. package/dist/utils/bash/parse.d.ts +0 -19
  227. package/dist/utils/bash/parse.d.ts.map +0 -1
  228. package/dist/utils/bash/parse.js +0 -223
  229. package/dist/utils/bash/quote.d.ts +0 -6
  230. package/dist/utils/bash/quote.d.ts.map +0 -1
  231. package/dist/utils/bash/quote.js +0 -23
  232. package/dist/utils/generators.d.ts +0 -3
  233. package/dist/utils/generators.d.ts.map +0 -1
  234. package/dist/utils/generators.js +0 -25
  235. package/dist/utils/glob.d.ts +0 -52
  236. package/dist/utils/glob.d.ts.map +0 -1
  237. package/dist/utils/glob.js +0 -376
@@ -1,46 +1,9 @@
1
1
  import * as fsPromises from "node:fs/promises";
2
2
  import * as path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- export function toPath(urlOrPath) {
4
+ function toPath(urlOrPath) {
5
5
  return urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;
6
6
  }
7
- /**
8
- * Converts Windows backslashes to POSIX forward slashes.
9
- * Preserves UNC paths and extended-length paths.
10
- * @param inputPath - Path to convert
11
- * @returns Path with forward slashes
12
- */
13
- export function slash(inputPath) {
14
- const isExtendedLengthPath = inputPath.startsWith("\\\\?\\");
15
- const isUncPath = inputPath.startsWith("\\\\");
16
- if (isExtendedLengthPath || isUncPath) {
17
- return inputPath;
18
- }
19
- return inputPath.replace(/\\/g, "/");
20
- }
21
- /**
22
- * Checks if a path exists and is a directory.
23
- * @param filePath - Path to check (URL or string)
24
- * @returns Promise resolving to true if path is a directory
25
- * @throws TypeError if input is invalid
26
- */
27
- export async function isDirectory(filePath) {
28
- const resolvedPath = path.resolve(toPath(filePath));
29
- if (typeof resolvedPath !== "string" || !resolvedPath.trim()) {
30
- throw new TypeError(`Expected a non-empty string or URL, got ${typeof filePath}`);
31
- }
32
- try {
33
- const stats = await fsPromises.stat(resolvedPath);
34
- return stats.isDirectory();
35
- }
36
- catch (error) {
37
- const err = error;
38
- if (err.code === "ENOENT") {
39
- return false;
40
- }
41
- throw error;
42
- }
43
- }
44
7
  /**
45
8
  * Safely clears all contents of a directory.
46
9
  * @param directoryPath - Path to the directory to clear (URL or string)
@@ -1 +1 @@
1
- {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../source/utils/filesystem/security.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAsCpD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAK3E;AAoCD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAIT;AAsCD,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,EACnC,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,WAAW,CAAA;CAAO,GACtE,OAAO,CAAC,MAAM,CAAC,CAmGjB;AA8BD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,IAAI,CAIN"}
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../source/utils/filesystem/security.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAsCpD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAK3E;AAoCD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAKT;AA2DD,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,EACnC,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,WAAW,CAAA;CAAO,GACtE,OAAO,CAAC,MAAM,CAAC,CAuFjB;AA8BD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,IAAI,CAIN"}
@@ -75,7 +75,10 @@ function isPathWithinBaseDir(requestedPath, baseDir) {
75
75
  }
76
76
  // Check if path is within any of the allowed directories
77
77
  export function isPathWithinAllowedDirs(requestedPath, allowedDirs) {
78
- return allowedDirs.some((allowedDir) => isPathWithinBaseDir(requestedPath, allowedDir));
78
+ return allowedDirs.some((allowedDir) => {
79
+ const expandedDir = expandHome(allowedDir);
80
+ return isPathWithinBaseDir(requestedPath, expandedDir);
81
+ });
79
82
  }
80
83
  async function resolveValidAncestor(startDir, isWithinAllowed) {
81
84
  let current = startDir;
@@ -104,6 +107,21 @@ async function resolveValidAncestor(startDir, isWithinAllowed) {
104
107
  }
105
108
  }
106
109
  }
110
+ async function ensurePathExists(validatedPath, requestedPath, abortSignal) {
111
+ if (abortSignal?.aborted) {
112
+ throw new Error("Path validation aborted during existence check");
113
+ }
114
+ try {
115
+ await fs.stat(validatedPath);
116
+ }
117
+ catch (err) {
118
+ const error = err;
119
+ if (error.code === "ENOENT") {
120
+ throw new Error(`The specified path does not exist: ${requestedPath} (${validatedPath})`);
121
+ }
122
+ throw error;
123
+ }
124
+ }
107
125
  // Security utilities
108
126
  export async function validatePath(requestedPath, allowedDirectory, options = {}) {
109
127
  const { requireExistence = true, abortSignal } = options;
@@ -121,7 +139,8 @@ export async function validatePath(requestedPath, allowedDirectory, options = {}
121
139
  : [allowedDirectory];
122
140
  // Resolve and normalize all allowed directories
123
141
  const normalizedAllowedDirs = await Promise.all(allowedDirectories.map(async (dir) => {
124
- let normalizedDir = normalizePath(path.resolve(dir));
142
+ const expandedDir = expandHome(dir);
143
+ let normalizedDir = normalizePath(path.resolve(expandedDir));
125
144
  // Try to resolve real path for allowedDirectory when it exists to handle symlinked roots
126
145
  try {
127
146
  const stats = await fs.stat(normalizedDir);
@@ -171,19 +190,7 @@ export async function validatePath(requestedPath, allowedDirectory, options = {}
171
190
  }
172
191
  // Now, if requireExistence, check if the path exists
173
192
  if (requireExistence) {
174
- if (abortSignal?.aborted) {
175
- throw new Error("Path validation aborted during existence check");
176
- }
177
- try {
178
- await fs.stat(validatedPath);
179
- }
180
- catch (err) {
181
- const error = err;
182
- if (error.code === "ENOENT") {
183
- throw new Error(`The specified path does not exist: ${requestedPath} (${validatedPath})`);
184
- }
185
- throw error;
186
- }
193
+ await ensurePathExists(validatedPath, requestedPath, abortSignal);
187
194
  }
188
195
  return validatedPath;
189
196
  }
@@ -1,3 +1,2 @@
1
- export declare function getLanguageFromFilePath(filePath: string): string | undefined;
2
1
  export declare function getCodeblockFromFilePath(filePath: string): string | undefined;
3
2
  //# sourceMappingURL=filetype-detection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filetype-detection.d.ts","sourceRoot":"","sources":["../../source/utils/filetype-detection.ts"],"names":[],"mappings":"AA+FA,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW5E;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW7E"}
1
+ {"version":3,"file":"filetype-detection.d.ts","sourceRoot":"","sources":["../../source/utils/filetype-detection.ts"],"names":[],"mappings":"AA+FA,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW7E"}
@@ -86,18 +86,6 @@ const extensionToLanguageMap = {
86
86
  ".proto": { name: "Protocol Buffers", codeblock: "protobuf" },
87
87
  ".txt": { name: "Text", codeblock: "text" },
88
88
  };
89
- export function getLanguageFromFilePath(filePath) {
90
- const extension = extname(filePath).toLowerCase();
91
- const languageInfo = extension
92
- ? extensionToLanguageMap[extension]
93
- : undefined;
94
- if (languageInfo) {
95
- return languageInfo.name;
96
- }
97
- const filename = basename(filePath).toLowerCase();
98
- const filenameLanguageInfo = extensionToLanguageMap[`.${filename}`];
99
- return filenameLanguageInfo?.name;
100
- }
101
89
  export function getCodeblockFromFilePath(filePath) {
102
90
  const extension = extname(filePath).toLowerCase();
103
91
  const languageInfo = extension
@@ -24,36 +24,6 @@ export type FormatType = "xml" | "markdown" | "bracket";
24
24
  * ```
25
25
  */
26
26
  export declare function formatFile(file: string, content: string, format: FormatType): string;
27
- /**
28
- * Formats URL content with metadata in the specified format.
29
- *
30
- * @param siteUrl - The URL to format
31
- * @param content - The URL content to format
32
- * @param format - The output format type
33
- * @returns Formatted URL content with metadata
34
- * @throws {Error} When an unsupported format is provided
35
- *
36
- * @example
37
- * ```typescript
38
- * formatUrl("https://example.com", "<html>...</html>", "xml")
39
- * // Returns: "<webpage>\n<url>https://example.com</url>\n<content>\n<html>...</html>\n</content>\n</webpage>"
40
- * ```
41
- */
42
- export declare function formatUrl(siteUrl: string, content: string, format: FormatType): string;
43
- /**
44
- * Formats content as a code block with appropriate language identifier.
45
- *
46
- * @param file - The file path used to determine the code block language
47
- * @param content - The code content to format
48
- * @returns Formatted code block with language identifier
49
- *
50
- * @example
51
- * ```typescript
52
- * formatCodeBlock("example.js", "console.log('hello');")
53
- * // Returns: "``` javascript\nconsole.log('hello');\n```"
54
- * ```
55
- */
56
- export declare function formatCodeBlock(file: string, content: string): string;
57
27
  /**
58
28
  * Formats generic content blocks with a name in the specified format.
59
29
  *
@@ -1 +1 @@
1
- {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../source/utils/formatting.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;AAExD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,GACjB,MAAM,CAaR;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,GACjB,MAAM,CAWR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIrE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,GACjB,MAAM,CAWR;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,MACG,CAAC;AAE7C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,MASjD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,GAAI,cAAc,MAAM,KAAG,MAuCrD,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MAwC1C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,KAAG,MASvC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MAGvD,CAAC"}
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../source/utils/formatting.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;AAExD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,GACjB,MAAM,CAaR;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,GACjB,MAAM,CAWR;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,MACG,CAAC;AAE7C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,MASjD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,GAAI,cAAc,MAAM,KAAG,MAuCrD,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MAwC1C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,KAAG,MASvC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MAGvD,CAAC"}
@@ -35,50 +35,6 @@ export function formatFile(file, content, format) {
35
35
  throw new Error(`Unsupported format: ${format}`);
36
36
  }
37
37
  }
38
- /**
39
- * Formats URL content with metadata in the specified format.
40
- *
41
- * @param siteUrl - The URL to format
42
- * @param content - The URL content to format
43
- * @param format - The output format type
44
- * @returns Formatted URL content with metadata
45
- * @throws {Error} When an unsupported format is provided
46
- *
47
- * @example
48
- * ```typescript
49
- * formatUrl("https://example.com", "<html>...</html>", "xml")
50
- * // Returns: "<webpage>\n<url>https://example.com</url>\n<content>\n<html>...</html>\n</content>\n</webpage>"
51
- * ```
52
- */
53
- export function formatUrl(siteUrl, content, format) {
54
- switch (format) {
55
- case "xml":
56
- return `<webpage>\n<url>${siteUrl}</url>\n<content>\n${content}\n</content>\n</webpage>`;
57
- case "markdown":
58
- return `## URL: ${siteUrl}\n${MD_TRIPLE_QUOTE}\n${content}\n${MD_TRIPLE_QUOTE}`;
59
- case "bracket":
60
- return `[url]: ${siteUrl}\n[url content begin]\n${content}\n[url content end]`;
61
- default:
62
- throw new Error(`Unsupported format: ${format}`);
63
- }
64
- }
65
- /**
66
- * Formats content as a code block with appropriate language identifier.
67
- *
68
- * @param file - The file path used to determine the code block language
69
- * @param content - The code content to format
70
- * @returns Formatted code block with language identifier
71
- *
72
- * @example
73
- * ```typescript
74
- * formatCodeBlock("example.js", "console.log('hello');")
75
- * // Returns: "``` javascript\nconsole.log('hello');\n```"
76
- * ```
77
- */
78
- export function formatCodeBlock(file, content) {
79
- const codeBlockName = getCodeblockFromFilePath(file) || path.extname(file).slice(1);
80
- return `${MD_TRIPLE_QUOTE} ${codeBlockName}\n${content}\n${MD_TRIPLE_QUOTE}`;
81
- }
82
38
  /**
83
39
  * Formats generic content blocks with a name in the specified format.
84
40
  *
@@ -3,17 +3,14 @@ export declare function getDiffStat(): Promise<{
3
3
  insertions: number;
4
4
  deletions: number;
5
5
  }>;
6
- export declare function getGitStatus(): Promise<{
6
+ interface GitCounts {
7
7
  added: number;
8
8
  modified: number;
9
9
  deleted: number;
10
10
  untracked: number;
11
- }>;
11
+ }
12
+ export declare function getGitStatus(): Promise<GitCounts>;
12
13
  export declare const inGitDirectory: () => Promise<boolean>;
13
- /**
14
- * Check if there are uncommitted changes
15
- */
16
- export declare function hasUncommittedChanges(): Promise<boolean>;
17
14
  /**
18
15
  * Get the current git branch name
19
16
  */
@@ -22,4 +19,5 @@ export declare function getCurrentBranch(): Promise<string | null>;
22
19
  * Count commits that exist locally but haven't been pushed to the remote branch
23
20
  */
24
21
  export declare function getUnpushedCommitsCount(): Promise<number>;
22
+ export {};
25
23
  //# sourceMappingURL=git.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../source/utils/git.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW;;;;GAyDhC;AAED,wBAAsB,YAAY;;;;;GAmCjC;AAED,eAAO,MAAM,cAAc,QAAqB,OAAO,CAAC,OAAO,CAS7D,CAAC;AAEH;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAY9D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkB/D;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAmC/D"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../source/utils/git.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW;;;;GAyDhC;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC,CAuBvD;AAyBD,eAAO,MAAM,cAAc,QAAqB,OAAO,CAAC,OAAO,CAS7D,CAAC;AAEH;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkB/D;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAmC/D"}
package/dist/utils/git.js CHANGED
@@ -56,41 +56,47 @@ export async function getDiffStat() {
56
56
  }
57
57
  }
58
58
  export async function getGitStatus() {
59
- // Git status processing (optimized)
60
59
  const result = await executeCommand(["git", "status", "--porcelain"], {
61
60
  cwd: process.cwd(),
62
61
  throwOnError: false,
63
62
  });
64
- let added = 0;
65
- let modified = 0;
66
- let deleted = 0;
67
- let untracked = 0;
68
- if (result.code === 0) {
69
- const lines = result.stdout.split("\n");
70
- for (const line of lines) {
71
- if (!line)
72
- continue;
73
- const s = line.slice(0, 2);
74
- if (s[0] === "A" || s === "M ")
75
- added++;
76
- else if (s[1] === "M" || s === " M")
77
- modified++;
78
- else if (s[0] === "D" || s === " D")
79
- deleted++;
80
- else if (s === "??")
81
- untracked++;
82
- }
83
- // if (added) gitStatus += ` +${added}`;
84
- // if (modified) gitStatus += ` ~${modified}`;
85
- // if (deleted) gitStatus += ` -${deleted}`;
86
- // if (untracked) gitStatus += ` ?${untracked}`;
87
- }
88
- return {
89
- added,
90
- modified,
91
- deleted,
92
- untracked,
63
+ const counts = {
64
+ added: 0,
65
+ modified: 0,
66
+ deleted: 0,
67
+ untracked: 0,
93
68
  };
69
+ if (result.code !== 0) {
70
+ return counts;
71
+ }
72
+ const lines = result.stdout.split("\n");
73
+ for (const line of lines) {
74
+ incrementCountsFromStatusLine(line, counts);
75
+ }
76
+ return counts;
77
+ }
78
+ /**
79
+ * Parse a single git status --porcelain line and increment the appropriate counter.
80
+ */
81
+ function incrementCountsFromStatusLine(line, counts) {
82
+ if (!line)
83
+ return;
84
+ const s = line.slice(0, 2);
85
+ if (s === "??") {
86
+ counts.untracked++;
87
+ return;
88
+ }
89
+ if (s[0] === "A" || s === "M ") {
90
+ counts.added++;
91
+ return;
92
+ }
93
+ if (s[1] === "M" || s === " M") {
94
+ counts.modified++;
95
+ return;
96
+ }
97
+ if (s[0] === "D" || s === " D") {
98
+ counts.deleted++;
99
+ }
94
100
  }
95
101
  export const inGitDirectory = memoize(async () => {
96
102
  const { code } = await executeCommand(["git", "rev-parse", "--is-inside-work-tree"], {
@@ -99,22 +105,6 @@ export const inGitDirectory = memoize(async () => {
99
105
  });
100
106
  return code === 0;
101
107
  });
102
- /**
103
- * Check if there are uncommitted changes
104
- */
105
- export async function hasUncommittedChanges() {
106
- try {
107
- const result = await executeCommand(["git", "status", "--porcelain"], {
108
- cwd: process.cwd(),
109
- throwOnError: false,
110
- });
111
- // If there are uncommitted changes, --porcelain will output lines for each changed file
112
- return result.stdout.trim().length > 0;
113
- }
114
- catch {
115
- return false;
116
- }
117
- }
118
108
  /**
119
109
  * Get the current git branch name
120
110
  */
@@ -29,7 +29,7 @@ interface IgnoreOptions {
29
29
  ignoreCase?: boolean;
30
30
  allowRelativePaths?: boolean;
31
31
  }
32
- export declare class Ignore {
32
+ declare class Ignore {
33
33
  private readonly _rules;
34
34
  private readonly _strictPathCheck;
35
35
  private _ignoreCache;
@@ -1 +1 @@
1
- {"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../source/utils/ignore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqWH,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,cAAM,UAAU;IACd,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,IAAI,CAAC,EAAE,OAAO,CAAC;IAC/B,SAAgB,QAAQ,EAAE,OAAO,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAGrC,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAS;gBAG3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,GAAG,SAAS,EACzB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,MAAM;IASrB,IAAI,KAAK,IAAI,MAAM,CAKlB;IAED,IAAI,UAAU,IAAI,MAAM,CAKvB;IAED,OAAO,CAAC,YAAY;CAWrB;AA0MD,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,UAAU,CAAkC;IAEpD;;;;;;OAMG;gBACS,EACV,UAAiB,EACjB,UAAuB,EACvB,kBAA0B,GAC3B,GAAE,aAAkB;IASrB,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,aAAa,GAAG,IAAI;IAW9D;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,aAAa,GAAG,IAAI;IAKrE,OAAO,CAAC,KAAK;IAuBb;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IA0BrC,OAAO,CAAC,EAAE;IAgDV;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B;;;OAGG;IACH,YAAY,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO;IAIzC;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE;IAI1C;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAI9B;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAKjC;AAED,QAAA,MAAM,OAAO;eAAc,aAAa,GAAG,MAAM;;CAAuB,CAAC;AA6BzE,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../source/utils/ignore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqWH,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,cAAM,UAAU;IACd,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,IAAI,CAAC,EAAE,OAAO,CAAC;IAC/B,SAAgB,QAAQ,EAAE,OAAO,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAGrC,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAS;gBAG3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,GAAG,SAAS,EACzB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,MAAM;IASrB,IAAI,KAAK,IAAI,MAAM,CAKlB;IAED,IAAI,UAAU,IAAI,MAAM,CAKvB;IAED,OAAO,CAAC,YAAY;CAWrB;AA0MD,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,cAAM,MAAM;IACV,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,UAAU,CAAkC;IAEpD;;;;;;OAMG;gBACS,EACV,UAAiB,EACjB,UAAuB,EACvB,kBAA0B,GAC3B,GAAE,aAAkB;IASrB,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,aAAa,GAAG,IAAI;IAW9D;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,aAAa,GAAG,IAAI;IAKrE,OAAO,CAAC,KAAK;IAuBb;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IA0BrC,OAAO,CAAC,EAAE;IAgDV;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B;;;OAGG;IACH,YAAY,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO;IAIzC;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE;IAI1C;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAI9B;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAKjC;AAED,QAAA,MAAM,OAAO;eAAc,aAAa,GAAG,MAAM;;CAAuB,CAAC;AA6BzE,eAAe,OAAO,CAAC"}
@@ -458,7 +458,7 @@ const isNotRelative = (path) => REGEX_TEST_INVALID_PATH.test(path);
458
458
  checkPath.isNotRelative = isNotRelative;
459
459
  // On windows, the following function will be replaced
460
460
  checkPath.convert = (p) => p;
461
- export class Ignore {
461
+ class Ignore {
462
462
  _rules;
463
463
  _strictPathCheck;
464
464
  _ignoreCache = {};
@@ -1 +1 @@
1
- {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../source/utils/process.ts"],"names":[],"mappings":"AAOA,UAAU,cAAc;IACtB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,sDAAsD;IACtD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mGAAmG;IACnG,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,aAAa;IACrB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;CACzB;AAED,KAAK,WAAW,GACZ;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAwGjC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA8DpD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EACvC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,CAqGxB"}
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../source/utils/process.ts"],"names":[],"mappings":"AA2EA,UAAU,cAAc;IACtB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,sDAAsD;IACtD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mGAAmG;IACnG,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,aAAa;IACrB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;CACzB;AAED,KAAK,WAAW,GACZ;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA6KjC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAiBpD;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EACvC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,CA4CxB"}
@@ -1,8 +1,46 @@
1
1
  import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
2
3
  import { isUndefined } from "@travisennis/stdlib/typeguards";
3
4
  const MS_IN_SECOND = 1000;
4
5
  const SECONDS_IN_MINUTE = 60;
5
6
  const DEFAULT_TIMEOUT = 2 * SECONDS_IN_MINUTE * MS_IN_SECOND;
7
+ /**
8
+ * Returns an error result or rejects based on throwOnError flag.
9
+ */
10
+ function earlyError(throwOnError, message, code) {
11
+ const result = { stdout: "", stderr: message, code };
12
+ if (throwOnError) {
13
+ return Promise.reject(new Error(message));
14
+ }
15
+ return Promise.resolve(result);
16
+ }
17
+ /**
18
+ * Handles an error from execFile and returns an ExecuteResult.
19
+ * May throw if throwOnError is true.
20
+ */
21
+ function handleExecError(error, throwOnError, preserveOutputOnError) {
22
+ const execError = error;
23
+ let errorCode = typeof execError.code === "number" ? execError.code : 1;
24
+ let errorSignal = execError.signal ?? undefined;
25
+ if (execError.name === "AbortError") {
26
+ errorCode = 130;
27
+ errorSignal = "SIGINT";
28
+ }
29
+ const result = {
30
+ stdout: preserveOutputOnError ? (execError.stdout ?? "") : "",
31
+ stderr: preserveOutputOnError ? (execError.stderr ?? "") : "",
32
+ code: errorCode,
33
+ signal: errorSignal,
34
+ };
35
+ if (throwOnError) {
36
+ throw Object.assign(execError, { result });
37
+ }
38
+ return result;
39
+ }
40
+ /**
41
+ * Wraps execFile in a Promise for async/await usage.
42
+ */
43
+ const execFilePromise = promisify(execFile);
6
44
  /**
7
45
  * Checks for shell-only constructs that are not allowed.
8
46
  */
@@ -71,8 +109,11 @@ function handleEscape(input, i, ch, inSingle, inDouble, buf) {
71
109
  }
72
110
  return null;
73
111
  }
74
- // Quote/escape-aware argv tokenizer that forbids command substitution
75
- export function parseArgv(input) {
112
+ /**
113
+ * Tokenizes the input string into arguments, handling quotes and escapes.
114
+ * Contains the core while-loop parsing logic.
115
+ */
116
+ function tokenizeArgv(input) {
76
117
  const argv = [];
77
118
  let buf = "";
78
119
  let i = 0;
@@ -109,7 +150,7 @@ export function parseArgv(input) {
109
150
  // Handle escape sequences
110
151
  const escapeResult = handleEscape(input, i, ch, inSingle, inDouble, buf);
111
152
  if (escapeResult) {
112
- if ("ok" in escapeResult && !escapeResult.ok) {
153
+ if ("error" in escapeResult) {
113
154
  return escapeResult;
114
155
  }
115
156
  buf = escapeResult.buf;
@@ -119,17 +160,26 @@ export function parseArgv(input) {
119
160
  buf += ch;
120
161
  i += 1;
121
162
  }
122
- if (inSingle || inDouble)
163
+ return { ok: true, argv, buf, inSingle, inDouble };
164
+ }
165
+ // Quote/escape-aware argv tokenizer that forbids command substitution
166
+ export function parseArgv(input) {
167
+ const result = tokenizeArgv(input);
168
+ if (!result.ok)
169
+ return result;
170
+ if (result.inSingle || result.inDouble) {
123
171
  return { ok: false, error: "Unterminated quote" };
124
- if (buf.length > 0)
125
- argv.push(buf);
126
- if (argv.length === 0)
172
+ }
173
+ if (result.buf.length > 0)
174
+ result.argv.push(result.buf);
175
+ if (result.argv.length === 0) {
127
176
  return { ok: false, error: "Empty command" };
128
- const first = argv[0];
177
+ }
178
+ const first = result.argv[0];
129
179
  if (typeof first !== "string" || first.trim() === "") {
130
180
  return { ok: false, error: "Missing command" };
131
181
  }
132
- return { ok: true, argv: argv };
182
+ return { ok: true, argv: result.argv };
133
183
  }
134
184
  /**
135
185
  * Executes a command and returns the result, providing unified error handling
@@ -139,7 +189,7 @@ export function parseArgv(input) {
139
189
  * @param options Execution options
140
190
  * @returns Promise resolving to an object containing stdout, stderr, and exit code
141
191
  */
142
- export function executeCommand(command, options) {
192
+ export async function executeCommand(command, options) {
143
193
  const { cwd = process.cwd(), timeout = DEFAULT_TIMEOUT, abortSignal, shell = false, throwOnError = false, preserveOutputOnError = true, maxBuffer = 1_000_000, } = options || {};
144
194
  let cmd;
145
195
  let args;
@@ -149,79 +199,27 @@ export function executeCommand(command, options) {
149
199
  else {
150
200
  const parsed = parseArgv(command);
151
201
  if (!parsed.ok) {
152
- const result = {
153
- stdout: "",
154
- stderr: parsed.error,
155
- code: 1,
156
- };
157
- return throwOnError
158
- ? Promise.reject(new Error(parsed.error))
159
- : Promise.resolve(result);
202
+ return earlyError(throwOnError, parsed.error, 1);
160
203
  }
161
204
  [cmd, ...args] = parsed.argv;
162
205
  }
163
206
  if (isUndefined(cmd) || cmd.trim() === "") {
164
- const result = {
165
- stdout: "",
166
- stderr: "Missing command",
167
- code: 1,
168
- };
169
- return throwOnError
170
- ? Promise.reject(new Error("Missing command"))
171
- : Promise.resolve(result);
207
+ return earlyError(throwOnError, "Missing command", 1);
172
208
  }
173
209
  if (abortSignal?.aborted) {
174
- const result = {
175
- stdout: "",
176
- stderr: "Command execution aborted",
177
- code: 130,
178
- };
179
- return throwOnError
180
- ? Promise.reject(new Error("Command execution aborted"))
181
- : Promise.resolve(result);
182
- }
183
- return new Promise((resolve, reject) => {
184
- try {
185
- execFile(cmd, args, {
186
- cwd,
187
- timeout,
188
- signal: abortSignal,
189
- shell,
190
- maxBuffer,
191
- }, (error, stdout, stderr) => {
192
- if (error) {
193
- let errorCode = typeof error.code === "number" ? error.code : 1;
194
- let errorSignal = error.signal ?? undefined;
195
- if (error.name === "AbortError") {
196
- errorCode = 130;
197
- errorSignal = "SIGINT";
198
- }
199
- const result = {
200
- stdout: preserveOutputOnError ? stdout : "",
201
- stderr: preserveOutputOnError ? stderr : "",
202
- code: errorCode,
203
- signal: errorSignal,
204
- };
205
- if (throwOnError) {
206
- reject(Object.assign(error, { result }));
207
- }
208
- else {
209
- resolve(result);
210
- }
211
- }
212
- else {
213
- resolve({ stdout, stderr, code: 0 });
214
- }
215
- });
216
- }
217
- catch (error) {
218
- const result = { stdout: "", stderr: "", code: 1 };
219
- if (throwOnError) {
220
- reject(error);
221
- }
222
- else {
223
- resolve(result);
224
- }
225
- }
226
- });
210
+ return earlyError(throwOnError, "Command execution aborted", 130);
211
+ }
212
+ try {
213
+ const { stdout, stderr } = await execFilePromise(cmd, args, {
214
+ cwd,
215
+ timeout,
216
+ signal: abortSignal,
217
+ shell,
218
+ maxBuffer,
219
+ });
220
+ return { stdout, stderr, code: 0 };
221
+ }
222
+ catch (error) {
223
+ return handleExecError(error, throwOnError, preserveOutputOnError);
224
+ }
227
225
  }
@@ -2,7 +2,6 @@ type YamlValue = string | number | boolean | null | YamlObject | YamlValue[];
2
2
  type YamlObject = {
3
3
  [key: string]: YamlValue;
4
4
  };
5
- export declare function parseYaml(input: string): YamlObject;
6
5
  export declare function parseFrontMatter(markdown: string): {
7
6
  data: YamlObject;
8
7
  content: string;
@@ -1 +1 @@
1
- {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../source/utils/yaml.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC;AAC7E,KAAK,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE/C,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA0DnD;AA2JD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAwBA"}
1
+ {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../source/utils/yaml.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC;AAC7E,KAAK,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AA4P/C,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAwBA"}