padrone 1.8.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/README.md +2 -2
  3. package/dist/codegen/code-builder.d.mts +10 -0
  4. package/dist/codegen/code-builder.d.mts.map +1 -0
  5. package/dist/codegen/code-builder.mjs +185 -0
  6. package/dist/codegen/code-builder.mjs.map +1 -0
  7. package/dist/codegen/discovery.d.mts +44 -0
  8. package/dist/codegen/discovery.d.mts.map +1 -0
  9. package/dist/codegen/discovery.mjs +179 -0
  10. package/dist/codegen/discovery.mjs.map +1 -0
  11. package/dist/codegen/file-emitter.d.mts +10 -0
  12. package/dist/codegen/file-emitter.d.mts.map +1 -0
  13. package/dist/codegen/file-emitter.mjs +58 -0
  14. package/dist/codegen/file-emitter.mjs.map +1 -0
  15. package/dist/codegen/generators/barrel-file.d.mts +10 -0
  16. package/dist/codegen/generators/barrel-file.d.mts.map +1 -0
  17. package/dist/codegen/generators/barrel-file.mjs +16 -0
  18. package/dist/codegen/generators/barrel-file.mjs.map +1 -0
  19. package/dist/codegen/generators/command-file.d.mts +25 -0
  20. package/dist/codegen/generators/command-file.d.mts.map +1 -0
  21. package/dist/codegen/generators/command-file.mjs +130 -0
  22. package/dist/codegen/generators/command-file.mjs.map +1 -0
  23. package/dist/codegen/generators/command-tree.d.mts +17 -0
  24. package/dist/codegen/generators/command-tree.d.mts.map +1 -0
  25. package/dist/codegen/generators/command-tree.mjs +72 -0
  26. package/dist/codegen/generators/command-tree.mjs.map +1 -0
  27. package/dist/codegen/index.d.mts +15 -330
  28. package/dist/codegen/index.mjs +13 -1507
  29. package/dist/codegen/parsers/bash.d.mts +19 -0
  30. package/dist/codegen/parsers/bash.d.mts.map +1 -0
  31. package/dist/codegen/parsers/bash.mjs +112 -0
  32. package/dist/codegen/parsers/bash.mjs.map +1 -0
  33. package/dist/codegen/parsers/fish.d.mts +13 -0
  34. package/dist/codegen/parsers/fish.d.mts.map +1 -0
  35. package/dist/codegen/parsers/fish.mjs +108 -0
  36. package/dist/codegen/parsers/fish.mjs.map +1 -0
  37. package/dist/codegen/parsers/help.d.mts +15 -0
  38. package/dist/codegen/parsers/help.d.mts.map +1 -0
  39. package/dist/codegen/parsers/help.mjs +271 -0
  40. package/dist/codegen/parsers/help.mjs.map +1 -0
  41. package/dist/codegen/parsers/merge.d.mts +14 -0
  42. package/dist/codegen/parsers/merge.d.mts.map +1 -0
  43. package/dist/codegen/parsers/merge.mjs +76 -0
  44. package/dist/codegen/parsers/merge.mjs.map +1 -0
  45. package/dist/codegen/parsers/zsh.d.mts +16 -0
  46. package/dist/codegen/parsers/zsh.d.mts.map +1 -0
  47. package/dist/codegen/parsers/zsh.mjs +161 -0
  48. package/dist/codegen/parsers/zsh.mjs.map +1 -0
  49. package/dist/codegen/schema-to-code.d.mts +24 -0
  50. package/dist/codegen/schema-to-code.d.mts.map +1 -0
  51. package/dist/codegen/schema-to-code.mjs +147 -0
  52. package/dist/codegen/schema-to-code.mjs.map +1 -0
  53. package/dist/codegen/template.d.mts +18 -0
  54. package/dist/codegen/template.d.mts.map +1 -0
  55. package/dist/codegen/template.mjs +37 -0
  56. package/dist/codegen/template.mjs.map +1 -0
  57. package/dist/codegen/types.d.mts +144 -0
  58. package/dist/codegen/types.d.mts.map +1 -0
  59. package/dist/completion.d.mts +2 -0
  60. package/dist/completion.mjs +2 -0
  61. package/dist/core/args.d.mts +3 -0
  62. package/dist/{args-DrCXxXeP.mjs → core/args.mjs} +49 -113
  63. package/dist/core/args.mjs.map +1 -0
  64. package/dist/core/commands.d.mts +13 -0
  65. package/dist/core/commands.d.mts.map +1 -0
  66. package/dist/{commands-DLR0rFgq.mjs → core/commands.mjs} +4 -232
  67. package/dist/core/commands.mjs.map +1 -0
  68. package/dist/core/create.d.mts +63 -0
  69. package/dist/core/create.d.mts.map +1 -0
  70. package/dist/core/create.mjs +230 -0
  71. package/dist/core/create.mjs.map +1 -0
  72. package/dist/core/default-runtime.mjs +198 -0
  73. package/dist/core/default-runtime.mjs.map +1 -0
  74. package/dist/core/errors.d.mts +107 -0
  75. package/dist/core/errors.d.mts.map +1 -0
  76. package/dist/{errors-DA4KzK1M.mjs → core/errors.mjs} +2 -2
  77. package/dist/core/errors.mjs.map +1 -0
  78. package/dist/core/exec.mjs +191 -0
  79. package/dist/core/exec.mjs.map +1 -0
  80. package/dist/core/interceptors.d.mts +33 -0
  81. package/dist/core/interceptors.d.mts.map +1 -0
  82. package/dist/core/interceptors.mjs +253 -0
  83. package/dist/core/interceptors.mjs.map +1 -0
  84. package/dist/core/parse.mjs +181 -0
  85. package/dist/core/parse.mjs.map +1 -0
  86. package/dist/core/program-methods.mjs +256 -0
  87. package/dist/core/program-methods.mjs.map +1 -0
  88. package/dist/core/results.d.mts +13 -0
  89. package/dist/core/results.d.mts.map +1 -0
  90. package/dist/core/results.mjs +150 -0
  91. package/dist/core/results.mjs.map +1 -0
  92. package/dist/core/runtime.d.mts +213 -0
  93. package/dist/core/runtime.d.mts.map +1 -0
  94. package/dist/core/runtime.mjs +10 -0
  95. package/dist/core/runtime.mjs.map +1 -0
  96. package/dist/core/validate.mjs +220 -0
  97. package/dist/core/validate.mjs.map +1 -0
  98. package/dist/docs/index.d.mts +1 -1
  99. package/dist/docs/index.d.mts.map +1 -1
  100. package/dist/docs/index.mjs +2 -2
  101. package/dist/docs/index.mjs.map +1 -1
  102. package/dist/extension/auto-output.d.mts +53 -0
  103. package/dist/extension/auto-output.d.mts.map +1 -0
  104. package/dist/extension/auto-output.mjs +116 -0
  105. package/dist/extension/auto-output.mjs.map +1 -0
  106. package/dist/extension/color.d.mts +19 -0
  107. package/dist/extension/color.d.mts.map +1 -0
  108. package/dist/extension/color.mjs +37 -0
  109. package/dist/extension/color.mjs.map +1 -0
  110. package/dist/extension/completion.d.mts +25 -0
  111. package/dist/extension/completion.d.mts.map +1 -0
  112. package/dist/extension/completion.mjs +40 -0
  113. package/dist/extension/completion.mjs.map +1 -0
  114. package/dist/extension/config.d.mts +55 -0
  115. package/dist/extension/config.d.mts.map +1 -0
  116. package/dist/extension/config.mjs +162 -0
  117. package/dist/extension/config.mjs.map +1 -0
  118. package/dist/extension/env.d.mts +42 -0
  119. package/dist/extension/env.d.mts.map +1 -0
  120. package/dist/extension/env.mjs +44 -0
  121. package/dist/extension/env.mjs.map +1 -0
  122. package/dist/extension/help.d.mts +29 -0
  123. package/dist/extension/help.d.mts.map +1 -0
  124. package/dist/extension/help.mjs +161 -0
  125. package/dist/extension/help.mjs.map +1 -0
  126. package/dist/extension/index.d.mts +18 -0
  127. package/dist/extension/ink.d.mts +31 -0
  128. package/dist/extension/ink.d.mts.map +1 -0
  129. package/dist/extension/ink.mjs +69 -0
  130. package/dist/extension/ink.mjs.map +1 -0
  131. package/dist/extension/interactive.d.mts +16 -0
  132. package/dist/extension/interactive.d.mts.map +1 -0
  133. package/dist/extension/interactive.mjs +89 -0
  134. package/dist/extension/interactive.mjs.map +1 -0
  135. package/dist/extension/logger.d.mts +67 -0
  136. package/dist/extension/logger.d.mts.map +1 -0
  137. package/dist/extension/logger.mjs +188 -0
  138. package/dist/extension/logger.mjs.map +1 -0
  139. package/dist/extension/man.d.mts +25 -0
  140. package/dist/extension/man.d.mts.map +1 -0
  141. package/dist/extension/man.mjs +41 -0
  142. package/dist/extension/man.mjs.map +1 -0
  143. package/dist/extension/mcp.d.mts +28 -0
  144. package/dist/extension/mcp.d.mts.map +1 -0
  145. package/dist/extension/mcp.mjs +44 -0
  146. package/dist/extension/mcp.mjs.map +1 -0
  147. package/dist/extension/progress-renderer.d.mts +13 -0
  148. package/dist/extension/progress-renderer.d.mts.map +1 -0
  149. package/dist/extension/progress-renderer.mjs +351 -0
  150. package/dist/extension/progress-renderer.mjs.map +1 -0
  151. package/dist/extension/progress.d.mts +76 -0
  152. package/dist/extension/progress.d.mts.map +1 -0
  153. package/dist/extension/progress.mjs +225 -0
  154. package/dist/extension/progress.mjs.map +1 -0
  155. package/dist/extension/repl.d.mts +26 -0
  156. package/dist/extension/repl.d.mts.map +1 -0
  157. package/dist/extension/repl.mjs +67 -0
  158. package/dist/extension/repl.mjs.map +1 -0
  159. package/dist/extension/serve.d.mts +27 -0
  160. package/dist/extension/serve.d.mts.map +1 -0
  161. package/dist/extension/serve.mjs +41 -0
  162. package/dist/extension/serve.mjs.map +1 -0
  163. package/dist/extension/signal.d.mts +19 -0
  164. package/dist/extension/signal.d.mts.map +1 -0
  165. package/dist/extension/signal.mjs +81 -0
  166. package/dist/extension/signal.mjs.map +1 -0
  167. package/dist/extension/stdin.d.mts +19 -0
  168. package/dist/extension/stdin.d.mts.map +1 -0
  169. package/dist/extension/stdin.mjs +52 -0
  170. package/dist/extension/stdin.mjs.map +1 -0
  171. package/dist/extension/suggestions.d.mts +6 -0
  172. package/dist/extension/suggestions.d.mts.map +1 -0
  173. package/dist/extension/suggestions.mjs +113 -0
  174. package/dist/extension/suggestions.mjs.map +1 -0
  175. package/dist/extension/timing.d.mts +27 -0
  176. package/dist/extension/timing.d.mts.map +1 -0
  177. package/dist/extension/timing.mjs +71 -0
  178. package/dist/extension/timing.mjs.map +1 -0
  179. package/dist/extension/tracing.d.mts +85 -0
  180. package/dist/extension/tracing.d.mts.map +1 -0
  181. package/dist/extension/tracing.mjs +107 -0
  182. package/dist/extension/tracing.mjs.map +1 -0
  183. package/dist/extension/update-check.d.mts +20 -0
  184. package/dist/extension/update-check.d.mts.map +1 -0
  185. package/dist/extension/update-check.mjs +62 -0
  186. package/dist/extension/update-check.mjs.map +1 -0
  187. package/dist/extension/utils.mjs +43 -0
  188. package/dist/extension/utils.mjs.map +1 -0
  189. package/dist/extension/version.d.mts +20 -0
  190. package/dist/extension/version.d.mts.map +1 -0
  191. package/dist/extension/version.mjs +51 -0
  192. package/dist/extension/version.mjs.map +1 -0
  193. package/dist/{completion-UnBKfGuk.mjs → feature/completion.mjs} +4 -3
  194. package/dist/feature/completion.mjs.map +1 -0
  195. package/dist/feature/interactive.mjs +145 -0
  196. package/dist/feature/interactive.mjs.map +1 -0
  197. package/dist/feature/mcp.d.mts +18 -0
  198. package/dist/feature/mcp.d.mts.map +1 -0
  199. package/dist/{mcp-D6PdtjIs.mjs → feature/mcp.mjs} +6 -6
  200. package/dist/feature/mcp.mjs.map +1 -0
  201. package/dist/feature/repl-loop.mjs +217 -0
  202. package/dist/feature/repl-loop.mjs.map +1 -0
  203. package/dist/feature/serve.d.mts +18 -0
  204. package/dist/feature/serve.d.mts.map +1 -0
  205. package/dist/{serve-PaCLsNoD.mjs → feature/serve.mjs} +7 -7
  206. package/dist/feature/serve.mjs.map +1 -0
  207. package/dist/feature/test.d.mts +109 -0
  208. package/dist/feature/test.d.mts.map +1 -0
  209. package/dist/feature/test.mjs +116 -0
  210. package/dist/feature/test.mjs.map +1 -0
  211. package/dist/feature/update-check.d.mts +35 -0
  212. package/dist/feature/update-check.d.mts.map +1 -0
  213. package/dist/{update-check-CZ2VqjnV.mjs → feature/update-check.mjs} +2 -2
  214. package/dist/feature/update-check.mjs.map +1 -0
  215. package/dist/feature/wrap.d.mts +58 -0
  216. package/dist/feature/wrap.d.mts.map +1 -0
  217. package/dist/feature/wrap.mjs +77 -0
  218. package/dist/feature/wrap.mjs.map +1 -0
  219. package/dist/index.d.mts +38 -901
  220. package/dist/index.mjs +25 -4337
  221. package/dist/ink.d.mts +2 -0
  222. package/dist/ink.mjs +2 -0
  223. package/dist/man.d.mts +2 -0
  224. package/dist/man.mjs +2 -0
  225. package/dist/mcp.d.mts +3 -0
  226. package/dist/mcp.mjs +2 -0
  227. package/dist/output/colorizer.d.mts +28 -0
  228. package/dist/output/colorizer.d.mts.map +1 -0
  229. package/dist/output/colorizer.mjs +94 -0
  230. package/dist/output/colorizer.mjs.map +1 -0
  231. package/dist/{formatter-CY3KrOEd.d.mts → output/formatter.d.mts} +2 -28
  232. package/dist/output/formatter.d.mts.map +1 -0
  233. package/dist/output/formatter.mjs +360 -0
  234. package/dist/output/formatter.mjs.map +1 -0
  235. package/dist/output/help.d.mts +18 -0
  236. package/dist/output/help.d.mts.map +1 -0
  237. package/dist/output/help.mjs +267 -0
  238. package/dist/output/help.mjs.map +1 -0
  239. package/dist/output/output-indicator.d.mts +27 -0
  240. package/dist/output/output-indicator.d.mts.map +1 -0
  241. package/dist/output/output-indicator.mjs +54 -0
  242. package/dist/output/output-indicator.mjs.map +1 -0
  243. package/dist/output/primitives.d.mts +33 -0
  244. package/dist/output/primitives.d.mts.map +1 -0
  245. package/dist/output/primitives.mjs +206 -0
  246. package/dist/output/primitives.mjs.map +1 -0
  247. package/dist/output/styling.d.mts +38 -0
  248. package/dist/output/styling.d.mts.map +1 -0
  249. package/dist/output/styling.mjs +146 -0
  250. package/dist/output/styling.mjs.map +1 -0
  251. package/dist/schema/zod.d.mts +6 -0
  252. package/dist/schema/zod.d.mts.map +1 -0
  253. package/dist/schema/zod.mjs +50 -0
  254. package/dist/schema/zod.mjs.map +1 -0
  255. package/dist/serve.d.mts +2 -0
  256. package/dist/serve.mjs +2 -0
  257. package/dist/test.d.mts +2 -109
  258. package/dist/test.mjs +1 -115
  259. package/dist/tracing.d.mts +2 -0
  260. package/dist/tracing.mjs +2 -0
  261. package/dist/types/args-meta.d.mts +129 -0
  262. package/dist/types/args-meta.d.mts.map +1 -0
  263. package/dist/types/builder.d.mts +212 -0
  264. package/dist/types/builder.d.mts.map +1 -0
  265. package/dist/types/command.d.mts +112 -0
  266. package/dist/types/command.d.mts.map +1 -0
  267. package/dist/types/index.d.mts +8 -0
  268. package/dist/types/interceptor.d.mts +232 -0
  269. package/dist/types/interceptor.d.mts.map +1 -0
  270. package/dist/types/preferences.d.mts +79 -0
  271. package/dist/types/preferences.d.mts.map +1 -0
  272. package/dist/types/result.d.mts +61 -0
  273. package/dist/types/result.d.mts.map +1 -0
  274. package/dist/types/schema.d.mts +24 -0
  275. package/dist/types/schema.d.mts.map +1 -0
  276. package/dist/util/dotenv.mjs +174 -0
  277. package/dist/util/dotenv.mjs.map +1 -0
  278. package/dist/util/shell-utils.mjs +80 -0
  279. package/dist/util/shell-utils.mjs.map +1 -0
  280. package/dist/util/stream.d.mts +33 -0
  281. package/dist/util/stream.d.mts.map +1 -0
  282. package/dist/{stream-DC4H8YTx.mjs → util/stream.mjs} +2 -2
  283. package/dist/util/stream.mjs.map +1 -0
  284. package/dist/util/type-helpers.d.mts +74 -0
  285. package/dist/util/type-helpers.d.mts.map +1 -0
  286. package/dist/util/type-utils.d.mts +186 -0
  287. package/dist/util/type-utils.d.mts.map +1 -0
  288. package/dist/util/utils.mjs +43 -0
  289. package/dist/util/utils.mjs.map +1 -0
  290. package/dist/zod.d.mts +1 -32
  291. package/dist/zod.mjs +1 -49
  292. package/package.json +65 -17
  293. package/src/completion.ts +2 -0
  294. package/src/core/args.ts +63 -37
  295. package/src/core/runtime.ts +11 -2
  296. package/src/extension/completion.ts +3 -0
  297. package/src/extension/index.ts +0 -12
  298. package/src/extension/ink.ts +2 -1
  299. package/src/extension/man.ts +3 -0
  300. package/src/extension/mcp.ts +3 -0
  301. package/src/extension/progress-renderer.ts +32 -8
  302. package/src/extension/progress.ts +19 -9
  303. package/src/extension/serve.ts +3 -0
  304. package/src/extension/tracing.ts +2 -0
  305. package/src/index.ts +1 -20
  306. package/src/ink.ts +2 -0
  307. package/src/man.ts +2 -0
  308. package/src/mcp.ts +3 -0
  309. package/src/serve.ts +2 -0
  310. package/src/tracing.ts +9 -0
  311. package/src/types/builder.ts +2 -2
  312. package/src/zod.ts +1 -1
  313. package/dist/args-DrCXxXeP.mjs.map +0 -1
  314. package/dist/codegen/index.d.mts.map +0 -1
  315. package/dist/codegen/index.mjs.map +0 -1
  316. package/dist/commands-DLR0rFgq.mjs.map +0 -1
  317. package/dist/completion-UnBKfGuk.mjs.map +0 -1
  318. package/dist/errors-DA4KzK1M.mjs.map +0 -1
  319. package/dist/formatter-CY3KrOEd.d.mts.map +0 -1
  320. package/dist/help-B-ZMYyn-.mjs +0 -892
  321. package/dist/help-B-ZMYyn-.mjs.map +0 -1
  322. package/dist/index-D-Dpz7l_.d.mts +0 -1427
  323. package/dist/index-D-Dpz7l_.d.mts.map +0 -1
  324. package/dist/index.d.mts.map +0 -1
  325. package/dist/index.mjs.map +0 -1
  326. package/dist/mcp-D6PdtjIs.mjs.map +0 -1
  327. package/dist/serve-PaCLsNoD.mjs.map +0 -1
  328. package/dist/stream-DC4H8YTx.mjs.map +0 -1
  329. package/dist/test.d.mts.map +0 -1
  330. package/dist/test.mjs.map +0 -1
  331. package/dist/update-check-CZ2VqjnV.mjs.map +0 -1
  332. package/dist/zod.d.mts.map +0 -1
  333. package/dist/zod.mjs.map +0 -1
package/dist/ink.d.mts ADDED
@@ -0,0 +1,2 @@
1
+ import { InkOptions, isReactElement, padroneInk } from "./extension/ink.mjs";
2
+ export { type InkOptions, isReactElement, padroneInk };
package/dist/ink.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import { isReactElement, padroneInk } from "./extension/ink.mjs";
2
+ export { isReactElement, padroneInk };
package/dist/man.d.mts ADDED
@@ -0,0 +1,2 @@
1
+ import { WithMan, padroneMan } from "./extension/man.mjs";
2
+ export { type WithMan, padroneMan };
package/dist/man.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import { padroneMan } from "./extension/man.mjs";
2
+ export { padroneMan };
package/dist/mcp.d.mts ADDED
@@ -0,0 +1,3 @@
1
+ import { PadroneMcpPreferences } from "./feature/mcp.mjs";
2
+ import { WithMcp, padroneMcp } from "./extension/mcp.mjs";
3
+ export { type PadroneMcpPreferences, type WithMcp, padroneMcp };
package/dist/mcp.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import { padroneMcp } from "./extension/mcp.mjs";
2
+ export { padroneMcp };
@@ -0,0 +1,28 @@
1
+ //#region src/output/colorizer.d.ts
2
+ /**
3
+ * Available ANSI styles that can be combined for each color role.
4
+ */
5
+ type AnsiStyle = 'reset' | 'bold' | 'dim' | 'italic' | 'underline' | 'strikethrough' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white' | 'gray';
6
+ /**
7
+ * Maps each semantic color role to an array of ANSI styles.
8
+ * Partial configs are merged with the default theme.
9
+ */
10
+ type ColorConfig = {
11
+ command?: AnsiStyle[];
12
+ arg?: AnsiStyle[];
13
+ type?: AnsiStyle[];
14
+ description?: AnsiStyle[];
15
+ label?: AnsiStyle[];
16
+ meta?: AnsiStyle[];
17
+ example?: AnsiStyle[];
18
+ exampleValue?: AnsiStyle[];
19
+ deprecated?: AnsiStyle[];
20
+ };
21
+ /**
22
+ * Available predefined color themes.
23
+ */
24
+ type ColorTheme = 'default' | 'ocean' | 'warm' | 'monochrome';
25
+ declare const colorThemes: Record<ColorTheme, Required<ColorConfig>>;
26
+ //#endregion
27
+ export { AnsiStyle, ColorConfig, ColorTheme, colorThemes };
28
+ //# sourceMappingURL=colorizer.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorizer.d.mts","names":[],"sources":["../../src/output/colorizer.ts"],"mappings":";;AAqBA;;KAAY,SAAA;;AAAS;AAoBrB;;KAAY,WAAA;EACV,OAAA,GAAU,SAAA;EACV,GAAA,GAAM,SAAA;EACN,IAAA,GAAO,SAAA;EACP,WAAA,GAAc,SAAA;EACd,KAAA,GAAQ,SAAA;EACR,IAAA,GAAO,SAAA;EACP,OAAA,GAAU,SAAA;EACV,YAAA,GAAe,SAAA;EACf,UAAA,GAAa,SAAA;AAAA;;;;KAsEH,UAAA;AAAA,cAEC,WAAA,EAAa,MAAA,CAAO,UAAA,EAAY,QAAA,CAAS,WAAA"}
@@ -0,0 +1,94 @@
1
+ //#region src/output/colorizer.ts
2
+ const ansiCodes = {
3
+ reset: "\x1B[0m",
4
+ bold: "\x1B[1m",
5
+ dim: "\x1B[2m",
6
+ italic: "\x1B[3m",
7
+ underline: "\x1B[4m",
8
+ strikethrough: "\x1B[9m",
9
+ red: "\x1B[31m",
10
+ green: "\x1B[32m",
11
+ yellow: "\x1B[33m",
12
+ blue: "\x1B[34m",
13
+ magenta: "\x1B[35m",
14
+ cyan: "\x1B[36m",
15
+ white: "\x1B[37m",
16
+ gray: "\x1B[90m"
17
+ };
18
+ const defaultTheme = {
19
+ command: ["cyan", "bold"],
20
+ arg: ["green"],
21
+ type: ["yellow"],
22
+ description: ["dim"],
23
+ label: ["bold"],
24
+ meta: ["gray"],
25
+ example: ["underline"],
26
+ exampleValue: ["italic"],
27
+ deprecated: ["strikethrough", "gray"]
28
+ };
29
+ const colorThemes = {
30
+ default: defaultTheme,
31
+ ocean: {
32
+ command: ["blue", "bold"],
33
+ arg: ["cyan"],
34
+ type: ["green"],
35
+ description: ["dim"],
36
+ label: ["bold"],
37
+ meta: ["gray"],
38
+ example: ["underline", "cyan"],
39
+ exampleValue: ["italic"],
40
+ deprecated: ["strikethrough", "gray"]
41
+ },
42
+ warm: {
43
+ command: ["yellow", "bold"],
44
+ arg: ["red"],
45
+ type: ["magenta"],
46
+ description: ["dim"],
47
+ label: ["bold"],
48
+ meta: ["gray"],
49
+ example: ["underline", "yellow"],
50
+ exampleValue: ["italic"],
51
+ deprecated: ["strikethrough", "gray"]
52
+ },
53
+ monochrome: {
54
+ command: ["bold"],
55
+ arg: ["underline"],
56
+ type: ["dim"],
57
+ description: ["dim"],
58
+ label: ["bold"],
59
+ meta: ["dim"],
60
+ example: ["underline"],
61
+ exampleValue: ["italic"],
62
+ deprecated: ["strikethrough", "dim"]
63
+ }
64
+ };
65
+ function makeStyleFn(styles) {
66
+ const prefix = styles.map((s) => ansiCodes[s]).join("");
67
+ return (text) => `${prefix}${text}${ansiCodes.reset}`;
68
+ }
69
+ function resolveConfig(config) {
70
+ if (!config) return defaultTheme;
71
+ if (typeof config === "string") return colorThemes[config] ?? defaultTheme;
72
+ return {
73
+ ...defaultTheme,
74
+ ...config
75
+ };
76
+ }
77
+ function createColorizer(config) {
78
+ const resolved = resolveConfig(config);
79
+ return {
80
+ command: makeStyleFn(resolved.command),
81
+ arg: makeStyleFn(resolved.arg),
82
+ type: makeStyleFn(resolved.type),
83
+ description: makeStyleFn(resolved.description),
84
+ label: makeStyleFn(resolved.label),
85
+ meta: makeStyleFn(resolved.meta),
86
+ example: makeStyleFn(resolved.example),
87
+ exampleValue: makeStyleFn(resolved.exampleValue),
88
+ deprecated: makeStyleFn(resolved.deprecated)
89
+ };
90
+ }
91
+ //#endregion
92
+ export { colorThemes, createColorizer };
93
+
94
+ //# sourceMappingURL=colorizer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorizer.mjs","names":[],"sources":["../../src/output/colorizer.ts"],"sourcesContent":["// ANSI color/style codes\nconst ansiCodes: Record<AnsiStyle, string> = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n strikethrough: '\\x1b[9m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n\n/**\n * Available ANSI styles that can be combined for each color role.\n */\nexport type AnsiStyle =\n | 'reset'\n | 'bold'\n | 'dim'\n | 'italic'\n | 'underline'\n | 'strikethrough'\n | 'red'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'magenta'\n | 'cyan'\n | 'white'\n | 'gray';\n\n/**\n * Maps each semantic color role to an array of ANSI styles.\n * Partial configs are merged with the default theme.\n */\nexport type ColorConfig = {\n command?: AnsiStyle[];\n arg?: AnsiStyle[];\n type?: AnsiStyle[];\n description?: AnsiStyle[];\n label?: AnsiStyle[];\n meta?: AnsiStyle[];\n example?: AnsiStyle[];\n exampleValue?: AnsiStyle[];\n deprecated?: AnsiStyle[];\n};\n\nexport type Colorizer = {\n command: (text: string) => string;\n arg: (text: string) => string;\n type: (text: string) => string;\n description: (text: string) => string;\n label: (text: string) => string;\n meta: (text: string) => string;\n example: (text: string) => string;\n exampleValue: (text: string) => string;\n deprecated: (text: string) => string;\n};\n\n// ============================================================================\n// Predefined Themes\n// ============================================================================\n\nconst defaultTheme: Required<ColorConfig> = {\n command: ['cyan', 'bold'],\n arg: ['green'],\n type: ['yellow'],\n description: ['dim'],\n label: ['bold'],\n meta: ['gray'],\n example: ['underline'],\n exampleValue: ['italic'],\n deprecated: ['strikethrough', 'gray'],\n};\n\nconst oceanTheme: Required<ColorConfig> = {\n command: ['blue', 'bold'],\n arg: ['cyan'],\n type: ['green'],\n description: ['dim'],\n label: ['bold'],\n meta: ['gray'],\n example: ['underline', 'cyan'],\n exampleValue: ['italic'],\n deprecated: ['strikethrough', 'gray'],\n};\n\nconst warmTheme: Required<ColorConfig> = {\n command: ['yellow', 'bold'],\n arg: ['red'],\n type: ['magenta'],\n description: ['dim'],\n label: ['bold'],\n meta: ['gray'],\n example: ['underline', 'yellow'],\n exampleValue: ['italic'],\n deprecated: ['strikethrough', 'gray'],\n};\n\nconst monochromeTheme: Required<ColorConfig> = {\n command: ['bold'],\n arg: ['underline'],\n type: ['dim'],\n description: ['dim'],\n label: ['bold'],\n meta: ['dim'],\n example: ['underline'],\n exampleValue: ['italic'],\n deprecated: ['strikethrough', 'dim'],\n};\n\n/**\n * Available predefined color themes.\n */\nexport type ColorTheme = 'default' | 'ocean' | 'warm' | 'monochrome';\n\nexport const colorThemes: Record<ColorTheme, Required<ColorConfig>> = {\n default: defaultTheme,\n ocean: oceanTheme,\n warm: warmTheme,\n monochrome: monochromeTheme,\n};\n\nfunction makeStyleFn(styles: AnsiStyle[]): (text: string) => string {\n const prefix = styles.map((s) => ansiCodes[s]).join('');\n return (text: string) => `${prefix}${text}${ansiCodes.reset}`;\n}\n\nfunction resolveConfig(config?: ColorTheme | ColorConfig): Required<ColorConfig> {\n if (!config) return defaultTheme;\n if (typeof config === 'string') return colorThemes[config] ?? defaultTheme;\n return { ...defaultTheme, ...config };\n}\n\nexport function createColorizer(config?: ColorTheme | ColorConfig): Colorizer {\n const resolved = resolveConfig(config);\n return {\n command: makeStyleFn(resolved.command),\n arg: makeStyleFn(resolved.arg),\n type: makeStyleFn(resolved.type),\n description: makeStyleFn(resolved.description),\n label: makeStyleFn(resolved.label),\n meta: makeStyleFn(resolved.meta),\n example: makeStyleFn(resolved.example),\n exampleValue: makeStyleFn(resolved.exampleValue),\n deprecated: makeStyleFn(resolved.deprecated),\n };\n}\n"],"mappings":";AACA,MAAM,YAAuC;CAC3C,OAAO;CACP,MAAM;CACN,KAAK;CACL,QAAQ;CACR,WAAW;CACX,eAAe;CACf,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,SAAS;CACT,MAAM;CACN,OAAO;CACP,MAAM;AACR;AAqDA,MAAM,eAAsC;CAC1C,SAAS,CAAC,QAAQ,MAAM;CACxB,KAAK,CAAC,OAAO;CACb,MAAM,CAAC,QAAQ;CACf,aAAa,CAAC,KAAK;CACnB,OAAO,CAAC,MAAM;CACd,MAAM,CAAC,MAAM;CACb,SAAS,CAAC,WAAW;CACrB,cAAc,CAAC,QAAQ;CACvB,YAAY,CAAC,iBAAiB,MAAM;AACtC;AA2CA,MAAa,cAAyD;CACpE,SAAS;CACT,OAAO;EA1CP,SAAS,CAAC,QAAQ,MAAM;EACxB,KAAK,CAAC,MAAM;EACZ,MAAM,CAAC,OAAO;EACd,aAAa,CAAC,KAAK;EACnB,OAAO,CAAC,MAAM;EACd,MAAM,CAAC,MAAM;EACb,SAAS,CAAC,aAAa,MAAM;EAC7B,cAAc,CAAC,QAAQ;EACvB,YAAY,CAAC,iBAAiB,MAAM;CAkC7B;CACP,MAAM;EA/BN,SAAS,CAAC,UAAU,MAAM;EAC1B,KAAK,CAAC,KAAK;EACX,MAAM,CAAC,SAAS;EAChB,aAAa,CAAC,KAAK;EACnB,OAAO,CAAC,MAAM;EACd,MAAM,CAAC,MAAM;EACb,SAAS,CAAC,aAAa,QAAQ;EAC/B,cAAc,CAAC,QAAQ;EACvB,YAAY,CAAC,iBAAiB,MAAM;CAuB9B;CACN,YAAY;EApBZ,SAAS,CAAC,MAAM;EAChB,KAAK,CAAC,WAAW;EACjB,MAAM,CAAC,KAAK;EACZ,aAAa,CAAC,KAAK;EACnB,OAAO,CAAC,MAAM;EACd,MAAM,CAAC,KAAK;EACZ,SAAS,CAAC,WAAW;EACrB,cAAc,CAAC,QAAQ;EACvB,YAAY,CAAC,iBAAiB,KAAK;CAYvB;AACd;AAEA,SAAS,YAAY,QAA+C;CAClE,MAAM,SAAS,OAAO,KAAK,MAAM,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE;CACtD,QAAQ,SAAiB,GAAG,SAAS,OAAO,UAAU;AACxD;AAEA,SAAS,cAAc,QAA0D;CAC/E,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,OAAO,WAAW,UAAU,OAAO,YAAY,WAAW;CAC9D,OAAO;EAAE,GAAG;EAAc,GAAG;CAAO;AACtC;AAEA,SAAgB,gBAAgB,QAA8C;CAC5E,MAAM,WAAW,cAAc,MAAM;CACrC,OAAO;EACL,SAAS,YAAY,SAAS,OAAO;EACrC,KAAK,YAAY,SAAS,GAAG;EAC7B,MAAM,YAAY,SAAS,IAAI;EAC/B,aAAa,YAAY,SAAS,WAAW;EAC7C,OAAO,YAAY,SAAS,KAAK;EACjC,MAAM,YAAY,SAAS,IAAI;EAC/B,SAAS,YAAY,SAAS,OAAO;EACrC,cAAc,YAAY,SAAS,YAAY;EAC/C,YAAY,YAAY,SAAS,UAAU;CAC7C;AACF"}
@@ -1,29 +1,3 @@
1
- //#region src/output/colorizer.d.ts
2
- /**
3
- * Available ANSI styles that can be combined for each color role.
4
- */
5
- type AnsiStyle = 'reset' | 'bold' | 'dim' | 'italic' | 'underline' | 'strikethrough' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white' | 'gray';
6
- /**
7
- * Maps each semantic color role to an array of ANSI styles.
8
- * Partial configs are merged with the default theme.
9
- */
10
- type ColorConfig = {
11
- command?: AnsiStyle[];
12
- arg?: AnsiStyle[];
13
- type?: AnsiStyle[];
14
- description?: AnsiStyle[];
15
- label?: AnsiStyle[];
16
- meta?: AnsiStyle[];
17
- example?: AnsiStyle[];
18
- exampleValue?: AnsiStyle[];
19
- deprecated?: AnsiStyle[];
20
- };
21
- /**
22
- * Available predefined color themes.
23
- */
24
- type ColorTheme = 'default' | 'ocean' | 'warm' | 'monochrome';
25
- declare const colorThemes: Record<ColorTheme, Required<ColorConfig>>;
26
- //#endregion
27
1
  //#region src/output/formatter.d.ts
28
2
  type HelpFormat = 'text' | 'ansi' | 'console' | 'markdown' | 'html' | 'json';
29
3
  type HelpDetail = 'minimal' | 'standard' | 'full';
@@ -110,5 +84,5 @@ type HelpInfo = {
110
84
  nestedCommands?: HelpInfo[];
111
85
  };
112
86
  //#endregion
113
- export { ColorConfig as a, AnsiStyle as i, HelpFormat as n, ColorTheme as o, HelpInfo as r, colorThemes as s, HelpDetail as t };
114
- //# sourceMappingURL=formatter-CY3KrOEd.d.mts.map
87
+ export { HelpArgumentInfo, HelpBuiltinInfo, HelpDetail, HelpFormat, HelpInfo, HelpPositionalInfo, HelpSubcommandInfo };
88
+ //# sourceMappingURL=formatter.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.mts","names":[],"sources":["../../src/output/formatter.ts"],"mappings":";KAkBY,UAAA;AAAA,KACA,UAAA;;;AADU;KAUV,kBAAA;EACV,IAAA;EACA,WAAA;EACA,QAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA;AAAA;;;;KAMU,gBAAA;EACV,IAAA;EACA,WAAA;EACA,QAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA,aAN0B;EAQ1B,KAAA,aAR0B;EAU1B,OAAA;EACA,UAAA;EACA,MAAA;EACA,QAAA,cARA;EAUA,GAAA,sBAPA;EASA,QAAA,YANA;EAQA,SAAA,YANA;EAQA,QAAA,aAJA;EAMA,SAAA,WAFA;EAIA,KAAA;AAAA;;AAAK;AAMP;KAAY,kBAAA;EACV,IAAA;EACA,KAAA;EACA,WAAA;EACA,OAAA;EACA,UAAA;EACA,MAAA;EACA,cAAA,YADA;EAGA,KAAA;AAAA;;AAAK;AAMP;KAAY,eAAA;EACV,IAAA;EACA,WAAA;EACA,GAAA;IAAQ,IAAA;IAAc,WAAA;EAAA;AAAA;;AAAW;AAOnC;;KAAY,QAAA;EAuBI,4DArBd,IAAA,UAyBY;EAvBZ,KAAA,WA6BiB;EA3BjB,WAAA,WA2ByB;EAzBzB,OAAA,aAJA;EAMA,UAAA,qBAFA;EAIA,MAAA;EAEA,KAAA;IACE,OAAA;IACA,cAAA;IACA,cAAA;IACA,YAAA,WAEA;IAAA,UAAA;EAAA,GAKF;EAFA,WAAA,GAAc,kBAAA,IAId;EAFA,WAAA,GAAc,kBAAA,IAId;EAFA,SAAA,GAAY,gBAAA,IAIZ;EAFA,QAAA,GAAW,eAAA,IAIM;EAFjB,QAAA,aAEyB;EAAzB,cAAA,GAAiB,QAAA;AAAA"}
@@ -0,0 +1,360 @@
1
+ import { camelToKebab } from "../util/shell-utils.mjs";
2
+ import { createAnsiStyler, createConsoleStyler, createHtmlLayout, createHtmlStyler, createMarkdownLayout, createMarkdownStyler, createTextLayout, createTextStyler, shouldUseAnsi, wrapText } from "./styling.mjs";
3
+ //#region src/output/formatter.ts
4
+ /**
5
+ * Creates a formatter that uses the given styler and layout configuration.
6
+ */
7
+ function createGenericFormatter(styler, layout, showAllBuiltins, terminalWidth) {
8
+ const { newline, indent, join, wrapDocument } = layout;
9
+ function formatUsageSection(info) {
10
+ const usageParts = [styler.command(info.usage.command), info.usage.hasSubcommands ? styler.meta("[command]") : ""];
11
+ if (info.positionals && info.positionals.length > 0) for (const arg of info.positionals) {
12
+ const name = arg.name.startsWith("...") ? `${arg.name}` : arg.name;
13
+ usageParts.push(styler.meta(arg.optional ? `[${name}]` : `<${name}>`));
14
+ }
15
+ if (info.usage.hasArguments) usageParts.push(styler.meta("[options]"));
16
+ return [`${styler.label("Usage:")} ${join(usageParts)}`];
17
+ }
18
+ function formatSubcommandsSection(info) {
19
+ const lines = [];
20
+ const subcommands = info.subcommands;
21
+ const subcommandSuffix = (c) => c.hasSubcommands ? " <subcommand>" : "";
22
+ const formatAliasParts = (c) => {
23
+ if (!c.aliases?.length) return {
24
+ plain: "",
25
+ styled: ""
26
+ };
27
+ const realAliases = c.aliases.filter((a) => a !== "[default]");
28
+ const hasDefault = c.aliases.some((a) => a === "[default]");
29
+ const parts = [];
30
+ const styledParts = [];
31
+ if (realAliases.length) {
32
+ parts.push(`(${realAliases.join(", ")})`);
33
+ styledParts.push(`(${realAliases.join(", ")})`);
34
+ }
35
+ if (hasDefault) {
36
+ parts.push("[default]");
37
+ styledParts.push(styler.meta("[default]"));
38
+ }
39
+ return {
40
+ plain: parts.length ? ` ${parts.join(" ")}` : "",
41
+ styled: styledParts.length ? ` ${styledParts.join(" ")}` : ""
42
+ };
43
+ };
44
+ const maxNameLength = Math.max(...subcommands.map((c) => {
45
+ return (c.name + subcommandSuffix(c) + formatAliasParts(c).plain).length;
46
+ }));
47
+ const grouped = Object.groupBy(subcommands, (c) => c.group ?? "");
48
+ const renderSubcommands = (cmds) => {
49
+ for (const subCmd of cmds) {
50
+ const aliasParts = formatAliasParts(subCmd);
51
+ const suffix = subcommandSuffix(subCmd);
52
+ const commandDisplay = subCmd.name + suffix + aliasParts.plain;
53
+ const padding = " ".repeat(Math.max(0, maxNameLength - commandDisplay.length + 2));
54
+ const isDeprecated = !!subCmd.deprecated;
55
+ const isDefaultEntry = subCmd.name === "[default]";
56
+ const lineParts = [isDeprecated ? styler.deprecated(commandDisplay) : (isDefaultEntry ? styler.meta(subCmd.name) : styler.command(subCmd.name)) + (suffix ? styler.meta(suffix) : "") + aliasParts.styled, padding];
57
+ const displayText = subCmd.title ?? subCmd.description;
58
+ if (displayText) lineParts.push(isDeprecated ? styler.deprecated(displayText) : styler.description(displayText));
59
+ if (isDeprecated) {
60
+ const deprecatedMeta = typeof subCmd.deprecated === "string" ? styler.meta(` (deprecated: ${subCmd.deprecated})`) : styler.meta(" (deprecated)");
61
+ lineParts.push(deprecatedMeta);
62
+ }
63
+ lines.push(indent(1) + lineParts.join(""));
64
+ }
65
+ };
66
+ for (const [key, items] of Object.entries(grouped)) {
67
+ if (lines.length > 0) lines.push("");
68
+ lines.push(styler.section(key ? `${key}:` : "Commands:"));
69
+ renderSubcommands(items);
70
+ }
71
+ if (!info.builtins?.length) {
72
+ lines.push("");
73
+ lines.push(styler.meta(`Run "${info.name} [command] --help" for more information on a command.`));
74
+ }
75
+ return lines;
76
+ }
77
+ function formatPositionalsSection(info) {
78
+ const lines = [];
79
+ const args = info.positionals;
80
+ lines.push(styler.section("Arguments:"));
81
+ const maxNameLength = Math.min(32, Math.max(...args.map((a) => a.name.length)));
82
+ const descCol = 2 + maxNameLength + 2;
83
+ const posAvailWidth = terminalWidth ? terminalWidth - descCol : void 0;
84
+ const descColPad = " ".repeat(descCol);
85
+ for (const arg of args) {
86
+ const padding = " ".repeat(Math.max(2, maxNameLength - arg.name.length + 2));
87
+ const prefix = indent(1) + styler.arg(arg.name) + padding;
88
+ const descPlain = arg.description ?? "";
89
+ const styledDesc = descPlain ? styler.description(descPlain) : "";
90
+ const metaParts = [];
91
+ const styledMetaParts = [];
92
+ if (info.usage.stdinField === arg.name) {
93
+ metaParts.push("(stdin)");
94
+ styledMetaParts.push(styler.meta("(stdin)"));
95
+ }
96
+ if (arg.enum) {
97
+ const text = `(choices: ${arg.enum.join(", ")})`;
98
+ metaParts.push(text);
99
+ styledMetaParts.push(styler.meta(text));
100
+ }
101
+ if (arg.default !== void 0) {
102
+ const text = `(default: ${String(arg.default)})`;
103
+ metaParts.push(text);
104
+ styledMetaParts.push(styler.meta(text));
105
+ }
106
+ const metaStyled = join(styledMetaParts);
107
+ if (posAvailWidth && posAvailWidth > 0) if ([descPlain, metaParts.join(" ")].filter(Boolean).join(" ").length <= posAvailWidth) lines.push(prefix + [styledDesc, metaStyled].filter(Boolean).join(" "));
108
+ else if (!descPlain || descPlain.length <= posAvailWidth) {
109
+ lines.push(prefix + styledDesc);
110
+ if (metaStyled) lines.push(descColPad + metaStyled);
111
+ } else {
112
+ const wrapped = wrapText(descPlain, posAvailWidth);
113
+ lines.push(prefix + styler.description(wrapped[0]));
114
+ for (const wline of wrapped.slice(1)) lines.push(descColPad + styler.description(wline));
115
+ if (metaStyled) lines.push(descColPad + metaStyled);
116
+ }
117
+ else lines.push(prefix + join([styledDesc, metaStyled]));
118
+ }
119
+ return lines;
120
+ }
121
+ function formatArgumentsSection(info) {
122
+ const lines = [];
123
+ const argList = info.arguments || [];
124
+ const hasDefault = (value) => {
125
+ if (value === void 0) return false;
126
+ if (value === "") return false;
127
+ if (Array.isArray(value) && value.length === 0) return false;
128
+ return true;
129
+ };
130
+ const argColumns = argList.map((arg) => {
131
+ const kebab = camelToKebab(arg.name);
132
+ const primaryName = kebab && arg.aliases?.includes(kebab) ? kebab : arg.name;
133
+ const remainingAliases = arg.aliases?.filter((a) => a !== primaryName);
134
+ const flagsPlain = arg.flags?.length ? arg.flags.map((f) => `-${f}`).join(", ") : "";
135
+ const negPlain = arg.negative?.length ? arg.negative.map((n) => `--${n}`).join(", ") : "";
136
+ return {
137
+ flagsPlain,
138
+ namesPlain: [
139
+ `--${primaryName}`,
140
+ ...remainingAliases?.map((a) => `--${a}`) || [],
141
+ ...negPlain ? [negPlain] : []
142
+ ].join(", "),
143
+ typePlain: arg.type && arg.type !== "boolean" ? arg.optional ? `[${arg.type}]` : `<${arg.type}>` : "",
144
+ isDeprecated: !!arg.deprecated,
145
+ arg
146
+ };
147
+ });
148
+ const maxFlagsWidth = Math.min(12, Math.max(0, ...argColumns.map((c) => c.flagsPlain.length)));
149
+ const maxNamesWidth = Math.min(32, Math.max(0, ...argColumns.map((c) => c.namesPlain.length)));
150
+ const maxTypeWidth = Math.min(16, Math.max(0, ...argColumns.map((c) => c.typePlain.length)));
151
+ const hasAnyFlags = maxFlagsWidth > 0;
152
+ const descCol = 2 + (hasAnyFlags ? maxFlagsWidth + 2 : 0) + maxNamesWidth + 2 + (maxTypeWidth > 0 ? maxTypeWidth + 2 : 0);
153
+ const argAvailWidth = terminalWidth ? terminalWidth - descCol : void 0;
154
+ const descColPad = " ".repeat(descCol);
155
+ const grouped = Object.groupBy(argColumns, (c) => c.arg.group ?? "");
156
+ const renderArgColumns = (columns) => {
157
+ for (const { flagsPlain, namesPlain, typePlain, isDeprecated, arg } of columns) {
158
+ const parts = [];
159
+ if (hasAnyFlags) {
160
+ const styledFlags = isDeprecated ? flagsPlain ? styler.deprecated(flagsPlain) : "" : flagsPlain ? styler.arg(flagsPlain) : "";
161
+ const flagsPadding = " ".repeat(Math.max(0, maxFlagsWidth - flagsPlain.length));
162
+ const separator = flagsPlain ? ", " : " ";
163
+ parts.push(styledFlags + flagsPadding + separator);
164
+ }
165
+ const styledNames = isDeprecated ? styler.deprecated(namesPlain) : styler.arg(namesPlain);
166
+ const namesPadding = " ".repeat(Math.max(2, maxNamesWidth - namesPlain.length + 2));
167
+ parts.push(styledNames + namesPadding);
168
+ if (maxTypeWidth > 0) {
169
+ const styledType = typePlain ? styler.type(typePlain) : "";
170
+ const typePadding = " ".repeat(Math.max(2, maxTypeWidth - typePlain.length + 2));
171
+ parts.push(styledType + typePadding);
172
+ }
173
+ const prefix = indent(1) + parts.join("");
174
+ const contPad = argAvailWidth ? descColPad : indent(3);
175
+ const inlineMeta = [];
176
+ const styledInlineMeta = [];
177
+ if (isDeprecated && typeof arg.deprecated !== "string") {
178
+ inlineMeta.push("(deprecated)");
179
+ styledInlineMeta.push(styler.meta("(deprecated)"));
180
+ }
181
+ if (hasDefault(arg.default)) {
182
+ const text = `(default: ${String(arg.default)})`;
183
+ inlineMeta.push(text);
184
+ styledInlineMeta.push(styler.meta(text));
185
+ }
186
+ if (arg.enum) {
187
+ const text = `(choices: ${arg.enum.join(", ")})`;
188
+ inlineMeta.push(text);
189
+ styledInlineMeta.push(styler.meta(text));
190
+ }
191
+ const descPlain = arg.description ?? "";
192
+ const styledDesc = descPlain ? isDeprecated ? styler.deprecated(descPlain) : styler.description(descPlain) : "";
193
+ const metaStyled = join(styledInlineMeta);
194
+ if (argAvailWidth && argAvailWidth > 0) if ([descPlain, inlineMeta.join(" ")].filter(Boolean).join(" ").length <= argAvailWidth) lines.push(prefix + [styledDesc, metaStyled].filter(Boolean).join(" "));
195
+ else if (!descPlain || descPlain.length <= argAvailWidth) {
196
+ lines.push(prefix + styledDesc);
197
+ if (metaStyled) lines.push(descColPad + metaStyled);
198
+ } else {
199
+ const wrapped = wrapText(descPlain, argAvailWidth);
200
+ const styleFn = isDeprecated ? styler.deprecated : styler.description;
201
+ lines.push(prefix + styleFn(wrapped[0]));
202
+ for (const wline of wrapped.slice(1)) lines.push(descColPad + styleFn(wline));
203
+ if (metaStyled) lines.push(descColPad + metaStyled);
204
+ }
205
+ else {
206
+ const descParts = [];
207
+ if (styledDesc) descParts.push(styledDesc);
208
+ lines.push(prefix + join(descParts));
209
+ if (styledInlineMeta.length > 0) lines.push(indent(3) + metaStyled);
210
+ }
211
+ const line3Parts = [];
212
+ if (isDeprecated && typeof arg.deprecated === "string") line3Parts.push(styler.meta(`(deprecated: ${arg.deprecated})`));
213
+ if (arg.examples && arg.examples.length > 0) {
214
+ const exampleValues = arg.examples.map((example) => typeof example === "string" ? example : JSON.stringify(example)).join(", ");
215
+ line3Parts.push(styler.example("Example:"), styler.exampleValue(exampleValues));
216
+ }
217
+ if (line3Parts.length > 0) lines.push(contPad + join(line3Parts));
218
+ const line4Parts = [];
219
+ if (info.usage.stdinField === arg.name) line4Parts.push(styler.meta("(stdin)"));
220
+ if (arg.env) {
221
+ const envVars = typeof arg.env === "string" ? [arg.env] : arg.env;
222
+ line4Parts.push(styler.example("Env:"), styler.exampleValue(envVars.join(", ")));
223
+ }
224
+ if (arg.configKey) line4Parts.push(styler.example("Config:"), styler.exampleValue(arg.configKey));
225
+ if (line4Parts.length > 0) lines.push(contPad + join(line4Parts));
226
+ }
227
+ };
228
+ for (const [key, items] of Object.entries(grouped)) {
229
+ if (lines.length > 0) lines.push("");
230
+ lines.push(styler.section(key ? `${key}:` : "Options:"));
231
+ renderArgColumns(items);
232
+ }
233
+ return lines;
234
+ }
235
+ function formatBuiltinsSection(info) {
236
+ const lines = [];
237
+ const builtins = info.builtins;
238
+ if (!showAllBuiltins) {
239
+ lines.push(`${styler.label("Global:")} ${styler.meta([
240
+ "help [command]",
241
+ "version",
242
+ "[command] --repl"
243
+ ].join(", "))}`);
244
+ const hint = info.usage.hasSubcommands ? `Run "${info.name} [command] --help" for more information. Use "--all" for all global commands.` : `Use "${info.name} help --all" for more information on global commands.`;
245
+ lines.push(styler.meta(hint));
246
+ return lines;
247
+ }
248
+ lines.push(styler.section("Global:"));
249
+ const allLengths = [];
250
+ for (const entry of builtins) {
251
+ allLengths.push(entry.name.length);
252
+ if (entry.sub) for (const sub of entry.sub) allLengths.push(sub.name.length + 2);
253
+ }
254
+ const maxLen = Math.max(...allLengths);
255
+ for (const entry of builtins) {
256
+ const padding = " ".repeat(Math.max(2, maxLen - entry.name.length + 2));
257
+ const parts = [styler.command(entry.name)];
258
+ if (entry.description) parts.push(padding + styler.description(entry.description));
259
+ lines.push(indent(1) + parts.join(""));
260
+ if (entry.sub) for (const sub of entry.sub) {
261
+ const subPadding = " ".repeat(Math.max(2, maxLen - sub.name.length));
262
+ const subParts = [styler.arg(sub.name)];
263
+ if (sub.description) subParts.push(subPadding + styler.description(sub.description));
264
+ lines.push(indent(2) + subParts.join(""));
265
+ }
266
+ }
267
+ return lines;
268
+ }
269
+ return { format(info) {
270
+ const lines = [];
271
+ if (info.deprecated) {
272
+ const deprecationMessage = typeof info.deprecated === "string" ? `⚠️ This command is deprecated: ${info.deprecated}` : "⚠️ This command is deprecated";
273
+ lines.push(styler.deprecated(deprecationMessage));
274
+ lines.push("");
275
+ }
276
+ lines.push(...formatUsageSection(info));
277
+ lines.push("");
278
+ if (info.title) {
279
+ lines.push(styler.label(info.title));
280
+ lines.push("");
281
+ }
282
+ if (info.aliases && info.aliases.length > 0) {
283
+ lines.push(styler.meta(`Aliases: ${info.aliases.join(", ")}`));
284
+ lines.push("");
285
+ }
286
+ if (info.description) {
287
+ lines.push(styler.description(info.description));
288
+ lines.push("");
289
+ }
290
+ if (info.examples && info.examples.length > 0) {
291
+ lines.push(styler.section("Examples:"));
292
+ for (const ex of info.examples) lines.push(indent(1) + styler.meta("$ ") + styler.exampleValue(ex));
293
+ lines.push("");
294
+ }
295
+ if (info.subcommands && info.subcommands.length > 0) {
296
+ lines.push(...formatSubcommandsSection(info));
297
+ lines.push("");
298
+ }
299
+ if (info.positionals && info.positionals.length > 0) {
300
+ lines.push(...formatPositionalsSection(info));
301
+ lines.push("");
302
+ }
303
+ if (info.arguments && info.arguments.length > 0) {
304
+ lines.push(...formatArgumentsSection(info));
305
+ lines.push("");
306
+ }
307
+ if (info.builtins && info.builtins.length > 0) {
308
+ lines.push(...formatBuiltinsSection(info));
309
+ lines.push("");
310
+ }
311
+ if (info.arguments?.some((arg) => arg.negatable && arg.default === true)) {
312
+ lines.push(styler.meta("Boolean options can be negated with --no-<option>."));
313
+ lines.push("");
314
+ }
315
+ if (info.nestedCommands?.length) {
316
+ lines.push(styler.section("Subcommand Details:"));
317
+ lines.push("");
318
+ for (const nestedCmd of info.nestedCommands) {
319
+ lines.push(styler.meta("─".repeat(60)));
320
+ lines.push(this.format(nestedCmd));
321
+ }
322
+ }
323
+ const result = lines.join(newline);
324
+ return wrapDocument ? wrapDocument(result) : result;
325
+ } };
326
+ }
327
+ function createJsonFormatter() {
328
+ return { format(info) {
329
+ return JSON.stringify(info, null, 2);
330
+ } };
331
+ }
332
+ /**
333
+ * Creates a minimal formatter that outputs just a single-line usage string.
334
+ */
335
+ function createMinimalFormatter() {
336
+ return { format(info) {
337
+ const parts = [info.usage.command];
338
+ if (info.usage.hasSubcommands) parts.push("[command]");
339
+ if (info.positionals && info.positionals.length > 0) for (const arg of info.positionals) {
340
+ const name = arg.name.startsWith("...") ? `${arg.name}` : arg.name;
341
+ parts.push(arg.optional ? `[${name}]` : `<${name}>`);
342
+ }
343
+ if (info.usage.hasArguments) parts.push("[options]");
344
+ return parts.join(" ");
345
+ } };
346
+ }
347
+ function createFormatter(format, detail = "standard", theme, all, width, terminal, env) {
348
+ if (detail === "minimal") return createMinimalFormatter();
349
+ if (format === "json") return createJsonFormatter();
350
+ const tw = format === "markdown" || format === "html" ? void 0 : width ?? terminal?.columns ?? 80;
351
+ if (format === "ansi" || format === "auto" && shouldUseAnsi(env, terminal?.isTTY)) return createGenericFormatter(createAnsiStyler(theme), createTextLayout(), all, tw);
352
+ if (format === "console") return createGenericFormatter(createConsoleStyler(theme), createTextLayout(), all, tw);
353
+ if (format === "markdown") return createGenericFormatter(createMarkdownStyler(), createMarkdownLayout(), all);
354
+ if (format === "html") return createGenericFormatter(createHtmlStyler(), createHtmlLayout(), all);
355
+ return createGenericFormatter(createTextStyler(), createTextLayout(), all, tw);
356
+ }
357
+ //#endregion
358
+ export { createFormatter };
359
+
360
+ //# sourceMappingURL=formatter.mjs.map