@flowscripter/dynamic-cli-framework 1.1.5 → 1.2.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 (165) hide show
  1. package/.github/workflows/release-bun-library.yml +1 -0
  2. package/README/core-commands.md +40 -0
  3. package/README/core-service-providers.md +198 -0
  4. package/README/development.md +60 -0
  5. package/README/implementation-details.md +474 -0
  6. package/README/key-concepts.md +751 -0
  7. package/README.md +12 -1413
  8. package/bun.lock +20 -18
  9. package/index.ts +98 -1
  10. package/package.json +8 -7
  11. package/src/api/BaseCLIFeatureOptions.ts +10 -0
  12. package/src/api/CLIConfig.ts +5 -0
  13. package/src/api/RunResult.ts +16 -0
  14. package/src/api/argument/Argument.ts +40 -1
  15. package/src/api/argument/ArgumentValueTypes.ts +1 -1
  16. package/src/api/command/SubCommand.ts +1 -1
  17. package/src/api/service/ServiceProvider.ts +3 -3
  18. package/src/api/service/core/ArgumentPrompterService.ts +10 -0
  19. package/src/api/service/core/AsciiBannerGeneratorService.ts +44 -7
  20. package/src/api/service/core/CompletionService.ts +36 -0
  21. package/src/api/service/core/DataDumpGeneratorService.ts +27 -0
  22. package/src/api/service/core/ImagePrinterService.ts +26 -0
  23. package/src/api/service/core/KeyValueService.ts +22 -5
  24. package/src/api/service/core/PrinterService.ts +127 -1
  25. package/src/api/service/core/PrompterService.ts +49 -0
  26. package/src/api/service/core/SecretService.ts +27 -0
  27. package/src/api/service/core/ShutdownService.ts +17 -1
  28. package/src/api/service/core/Table.ts +85 -0
  29. package/src/api/service/core/TableGeneratorService.ts +38 -0
  30. package/src/api/service/core/TreePrinterService.ts +11 -0
  31. package/src/cli/BaseCLI.ts +116 -44
  32. package/src/cli/DefaultRuntimeCLI.ts +10 -18
  33. package/src/command/CompletionCommand.ts +179 -0
  34. package/src/command/MultiCommandCliHelpCommand.ts +20 -32
  35. package/src/command/SingleCommandCliHelpCommand.ts +10 -1
  36. package/src/launcher.ts +16 -58
  37. package/src/runtime/command/CommandValidator.ts +70 -6
  38. package/src/runtime/runner.ts +112 -31
  39. package/src/runtime/scanner.ts +18 -15
  40. package/src/runtime/values/argumentValueValidation.ts +93 -10
  41. package/src/runtime/values/globalCommandValuePopulation.ts +1 -1
  42. package/src/runtime/values/subCommandValuePopulation.ts +9 -8
  43. package/src/service/argumentPrompter/ArgumentPrompterServiceProvider.ts +34 -0
  44. package/src/service/argumentPrompter/DefaultArgumentPrompterService.ts +330 -0
  45. package/src/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.ts +1 -1
  46. package/src/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.ts +254 -17
  47. package/src/service/banner/BannerServiceProvider.ts +2 -2
  48. package/src/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.ts +85 -0
  49. package/src/service/chiselAsciiBannerGenerator/chisel.flf.json +3 -0
  50. package/src/service/completion/CompletionServiceProvider.ts +212 -0
  51. package/src/service/completion/DefaultCompletionService.ts +364 -0
  52. package/src/service/completion/shell/ShellHandler.ts +16 -0
  53. package/src/service/completion/shell/bash.ts +47 -0
  54. package/src/service/completion/shell/fish.ts +43 -0
  55. package/src/service/completion/shell/powershell.ts +66 -0
  56. package/src/service/completion/shell/zsh.ts +50 -0
  57. package/src/service/configuration/ConfigurationServiceProvider.ts +138 -42
  58. package/src/service/configuration/DefaultKeyValueService.ts +53 -7
  59. package/src/service/configuration/DefaultSecretService.ts +85 -0
  60. package/src/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.ts +41 -0
  61. package/src/service/dataDumpGenerator/DefaultDataDumpGeneratorService.ts +80 -0
  62. package/src/service/imagePrinter/DefaultImagePrinterService.ts +23 -0
  63. package/src/service/imagePrinter/ImagePrinterServiceProvider.ts +32 -0
  64. package/src/service/prettyPrinter/PrettyPrinterServiceProvider.ts +1 -1
  65. package/src/service/printer/DefaultPrinterService.ts +147 -27
  66. package/src/service/printer/PrinterServiceProvider.ts +7 -7
  67. package/src/service/printer/command/LogLevelCommand.ts +2 -1
  68. package/src/service/printer/command/NoHyperlinksCommand.ts +40 -0
  69. package/src/service/printer/terminal/Progress.ts +21 -4
  70. package/src/service/printer/terminal/Spinner.ts +32 -8
  71. package/src/service/printer/terminal/Theme.ts +1 -1
  72. package/src/service/prompter/DefaultPrompterService.ts +87 -0
  73. package/src/service/prompter/PrompterServiceProvider.ts +36 -0
  74. package/src/service/prompter/command/NoPromptCommand.ts +40 -0
  75. package/src/service/prompter/prompt/PromptContext.ts +47 -0
  76. package/src/service/prompter/prompt/promptAcknowledge.ts +28 -0
  77. package/src/service/prompter/prompt/promptMultiSelect.ts +99 -0
  78. package/src/service/prompter/prompt/promptOpenUrl.ts +97 -0
  79. package/src/service/prompter/prompt/promptSingleSelect.ts +102 -0
  80. package/src/service/prompter/prompt/promptText.ts +107 -0
  81. package/src/service/prompter/prompt/promptToggle.ts +28 -0
  82. package/src/service/shutdown/DefaultShutdownService.ts +13 -0
  83. package/src/service/shutdown/ShutdownServiceProvider.ts +28 -9
  84. package/src/service/shutdown/ShutdownState.ts +5 -0
  85. package/src/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.ts +1 -1
  86. package/src/service/tableGenerator/DefaultTableGeneratorService.ts +415 -0
  87. package/src/service/tableGenerator/TableGeneratorServiceProvider.ts +43 -0
  88. package/src/service/treePrinter/DefaultTreePrinterService.ts +49 -0
  89. package/src/service/treePrinter/TreePrinterServiceProvider.ts +40 -0
  90. package/src/terminal/Ansi.ts +27 -0
  91. package/src/terminal/ImageRenderer.ts +199 -0
  92. package/src/terminal/KeyReader.ts +23 -0
  93. package/src/terminal/PngDecoder.ts +143 -0
  94. package/src/{service/printer/terminal → terminal}/Styler.ts +3 -0
  95. package/src/{service/printer/terminal → terminal}/Terminal.ts +1 -0
  96. package/src/terminal/TtyKeyReader.ts +83 -0
  97. package/src/terminal/TtyStyler.ts +78 -0
  98. package/src/{service/printer/terminal → terminal}/TtyTerminal.ts +9 -1
  99. package/src/terminal/supportsHyperlinks.ts +110 -0
  100. package/src/util/configHelper.ts +2 -2
  101. package/src/util/envVarHelper.ts +2 -2
  102. package/src/util/helpHelper.ts +139 -123
  103. package/src/util/logger.ts +16 -14
  104. package/src/util/runnerHelper.ts +41 -0
  105. package/tests/cli/BaseCLI.test.ts +50 -54
  106. package/tests/command/CompletionCommand.test.ts +68 -0
  107. package/tests/command/UsageCommand.test.ts +3 -2
  108. package/tests/command/VersionCommand.test.ts +3 -2
  109. package/tests/fixtures/Context.ts +9 -2
  110. package/tests/fixtures/util.ts +1 -1
  111. package/tests/runtime/command/CommandValidator.test.ts +103 -0
  112. package/tests/runtime/parser.test.ts +9 -7
  113. package/tests/runtime/registry/DefaultServiceProviderRegistry.test.ts +3 -3
  114. package/tests/runtime/runner.test.ts +36 -0
  115. package/tests/runtime/values/argumentValueValidation.test.ts +215 -1
  116. package/tests/service/argumentPrompter/ArgumentPrompterServiceProvider.test.ts +47 -0
  117. package/tests/service/argumentPrompter/DefaultArgumentPrompterService.test.ts +754 -0
  118. package/tests/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.test.ts +5 -4
  119. package/tests/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.test.ts +163 -3
  120. package/tests/service/asciiBannerGenerator/__snapshots__/DefaultAsciiBannerGeneratorService.test.ts.snap +1 -1
  121. package/tests/service/banner/BannerServiceProvider.test.ts +8 -4
  122. package/tests/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.test.ts +52 -0
  123. package/tests/service/completion/CompletionServiceProvider.test.ts +404 -0
  124. package/tests/service/completion/DefaultCompletionService.test.ts +278 -0
  125. package/tests/service/completion/shell/bash.test.ts +73 -0
  126. package/tests/service/completion/shell/fish.test.ts +62 -0
  127. package/tests/service/completion/shell/powershell.test.ts +59 -0
  128. package/tests/service/completion/shell/zsh.test.ts +60 -0
  129. package/tests/service/configuration/ConfigurationServiceProvider.test.ts +24 -12
  130. package/tests/service/configuration/DefaultKeyValueService.test.ts +118 -16
  131. package/tests/service/configuration/DefaultSecretService.test.ts +148 -0
  132. package/tests/service/configuration/command/ConfigCommand.test.ts +29 -0
  133. package/tests/service/configuration/command/DumpConfigCommand.test.ts +60 -0
  134. package/tests/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.test.ts +57 -0
  135. package/tests/service/dataDumpGenerator/DefaultDataDumpGeneratorService.test.ts +217 -0
  136. package/tests/service/imagePrinter/DefaultImagePrinterService.test.ts +96 -0
  137. package/tests/service/imagePrinter/ImagePrinterServiceProvider.test.ts +17 -0
  138. package/tests/service/prettyPrinter/DefaultPrettyPrinterService.test.ts +2 -2
  139. package/tests/service/prettyPrinter/PrettyPrinterServiceProvider.test.ts +5 -4
  140. package/tests/service/printer/DefaultPrinterService.test.ts +233 -2
  141. package/tests/service/printer/PrinterServiceProvider.test.ts +6 -5
  142. package/tests/service/printer/command/DarkModeCommand.test.ts +83 -0
  143. package/tests/service/printer/command/LogLevelCommand.test.ts +8 -6
  144. package/tests/service/printer/command/NoColorCommand.test.ts +83 -0
  145. package/tests/service/printer/command/NoHyperlinksCommand.test.ts +89 -0
  146. package/tests/service/printer/terminal/Progress.test.ts +64 -4
  147. package/tests/service/printer/terminal/Spinner.test.ts +44 -3
  148. package/tests/service/prompter/DefaultPrompterService.test.ts +615 -0
  149. package/tests/service/prompter/PrompterServiceProvider.test.ts +47 -0
  150. package/tests/service/prompter/command/NoPromptCommand.test.ts +58 -0
  151. package/tests/service/shutdown/ShutdownServiceProvider.test.ts +4 -2
  152. package/tests/service/syntaxHighlighter/DefaultSyntaxHighlighterService.test.ts +3 -2
  153. package/tests/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.test.ts +5 -4
  154. package/tests/service/tableGenerator/DefaultTableGeneratorService.test.ts +363 -0
  155. package/tests/service/tableGenerator/TableGeneratorServiceProvider.test.ts +47 -0
  156. package/tests/service/treePrinter/DefaultTreePrinterService.test.ts +144 -0
  157. package/tests/service/treePrinter/TreePrinterServiceProvider.test.ts +55 -0
  158. package/tests/terminal/ImageRenderer.test.ts +161 -0
  159. package/tests/terminal/PngDecoder.test.ts +223 -0
  160. package/tests/terminal/supportsHyperlinks.test.ts +149 -0
  161. package/tests/util/configHelper.test.ts +4 -4
  162. package/tests/util/logger.test.ts +23 -1
  163. package/tsconfig.json +31 -0
  164. package/src/service/printer/terminal/Ansi.ts +0 -10
  165. package/src/service/printer/terminal/TtyStyler.ts +0 -39
package/bun.lock CHANGED
@@ -1,39 +1,41 @@
1
1
  {
2
2
  "lockfileVersion": 1,
3
+ "configVersion": 1,
3
4
  "workspaces": {
4
5
  "": {
5
- "name": "@flowscripter/dynamic-plugin-framework",
6
+ "name": "@flowscripter/dynamic-cli-framework",
6
7
  "dependencies": {
7
8
  "emphasize": "^7.0.0",
8
9
  "fastest-levenshtein": "^1.0.16",
9
- "figlet": "^1.8.1",
10
+ "figlet": "^1.11.0",
10
11
  "highlight.js": "^11.11.1",
11
- "prettier": "^3.5.3",
12
- "supports-color": "^10.0.0",
13
- "ts-log": "^2.2.7",
12
+ "prettier": "^3.8.3",
13
+ "supports-color": "^10.2.2",
14
+ "supports-terminal-graphics": "^0.1.0",
14
15
  },
15
16
  "devDependencies": {
16
- "@types/bun": "^1.2.9",
17
+ "@types/bun": "^1.3.14",
18
+ "@types/node": "^25.9.1",
17
19
  },
18
20
  "peerDependencies": {
19
- "typescript": "^5.8.3",
21
+ "typescript": "^6.0.3",
20
22
  },
21
23
  },
22
24
  },
23
25
  "packages": {
24
- "@types/bun": ["@types/bun@1.2.9", "", { "dependencies": { "bun-types": "1.2.9" } }, "sha512-epShhLGQYc4Bv/aceHbmBhOz1XgUnuTZgcxjxk+WXwNyDXavv5QHD1QEFV0FwbTSQtNq6g4ZcV6y0vZakTjswg=="],
26
+ "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="],
25
27
 
26
28
  "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
27
29
 
28
- "@types/node": ["@types/node@22.13.4", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg=="],
30
+ "@types/node": ["@types/node@25.9.1", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg=="],
29
31
 
30
32
  "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
31
33
 
32
- "@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="],
34
+ "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="],
33
35
 
34
- "bun-types": ["bun-types@1.2.9", "", { "dependencies": { "@types/node": "*", "@types/ws": "*" } }, "sha512-dk/kOEfQbajENN/D6FyiSgOKEuUi9PWfqKQJEgwKrCMWbjS/S6tEXp178mWvWAcUSYm9ArDlWHZKO3T/4cLXiw=="],
36
+ "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
35
37
 
36
- "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="],
38
+ "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
37
39
 
38
40
  "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
39
41
 
@@ -43,21 +45,21 @@
43
45
 
44
46
  "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="],
45
47
 
46
- "figlet": ["figlet@1.8.1", "", { "bin": { "figlet": "bin/index.js" } }, "sha512-kEC3Sme+YvA8Hkibv0NR1oClGcWia0VB2fC1SlMy027cwe795Xx40Xiv/nw/iFAwQLupymWh+uhAAErn/7hwPg=="],
48
+ "figlet": ["figlet@1.11.0", "", { "dependencies": { "commander": "^14.0.0" }, "bin": { "figlet": "bin/index.js" } }, "sha512-EEx3OS/l2bFqcUNN2NM9FPJp8vAMrgbCxsbl2hbcJNNxOEwVe3mEzrhan7TbJQViZa8mMqhihlbCaqD+LyYKTQ=="],
47
49
 
48
50
  "highlight.js": ["highlight.js@11.11.1", "", {}, "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w=="],
49
51
 
50
52
  "lowlight": ["lowlight@3.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.0.0", "highlight.js": "~11.9.0" } }, "sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ=="],
51
53
 
52
- "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="],
54
+ "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="],
53
55
 
54
- "supports-color": ["supports-color@10.0.0", "", {}, "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ=="],
56
+ "supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="],
55
57
 
56
- "ts-log": ["ts-log@2.2.7", "", {}, "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg=="],
58
+ "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="],
57
59
 
58
- "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
60
+ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
59
61
 
60
- "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="],
62
+ "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="],
61
63
 
62
64
  "emphasize/highlight.js": ["highlight.js@11.9.0", "", {}, "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw=="],
63
65
 
package/index.ts CHANGED
@@ -39,21 +39,43 @@ export type { default as ServiceProviderRegistry } from "./src/runtime/registry/
39
39
  // Core Services
40
40
  export { ASCII_BANNER_GENERATOR_SERVICE_ID } from "./src/api/service/core/AsciiBannerGeneratorService.ts";
41
41
  export type { default as AsciiBannerGeneratorService } from "./src/api/service/core/AsciiBannerGeneratorService.ts";
42
+ export type {
43
+ BannerColorEffects,
44
+ BannerGenerateOptions,
45
+ ColorEffect,
46
+ ColorEffectDirection,
47
+ FixedColorEffect,
48
+ GradientColorEffect,
49
+ RainbowColorEffect,
50
+ } from "./src/api/service/core/AsciiBannerGeneratorService.ts";
42
51
  export { default as DefaultAsciiBannerGeneratorService } from "./src/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.ts";
43
52
  export { default as AsciiBannerGeneratorServiceProvider } from "./src/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.ts";
53
+ export { default as ChiselFontAsciiBannerGeneratorService } from "./src/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.ts";
54
+ export type {
55
+ ChiselBannerColors,
56
+ ChiselBannerGenerateOptions,
57
+ } from "./src/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.ts";
44
58
 
45
59
  export { default as BannerServiceProvider } from "./src/service/banner/BannerServiceProvider.ts";
46
60
 
47
61
  export { KEY_VALUE_SERVICE_ID } from "./src/api/service/core/KeyValueService.ts";
62
+ export { SECRET_SENTINEL_PREFIX } from "./src/api/service/core/KeyValueService.ts";
48
63
  export type { default as KeyValueService } from "./src/api/service/core/KeyValueService.ts";
64
+ export type { default as SecretService } from "./src/api/service/core/SecretService.ts";
49
65
  export { default as DefaultKeyValueService } from "./src/service/configuration/DefaultKeyValueService.ts";
66
+ export { default as DefaultSecretService } from "./src/service/configuration/DefaultSecretService.ts";
50
67
  export { default as ConfigurationServiceProvider } from "./src/service/configuration/ConfigurationServiceProvider.ts";
51
68
 
52
69
  export { PRINTER_SERVICE_ID } from "./src/api/service/core/PrinterService.ts";
53
70
  export type {
54
71
  default as PrinterService,
55
72
  } from "./src/api/service/core/PrinterService.ts";
56
- export { Icon, Level } from "./src/api/service/core/PrinterService.ts";
73
+ export {
74
+ Icon,
75
+ Level,
76
+ ProgressStyle,
77
+ SpinnerStyle,
78
+ } from "./src/api/service/core/PrinterService.ts";
57
79
  export { default as DefaultPrinterService } from "./src/service/printer/DefaultPrinterService.ts";
58
80
  export { default as PrinterServiceProvider } from "./src/service/printer/PrinterServiceProvider.ts";
59
81
 
@@ -64,6 +86,7 @@ export { default as ShutdownServiceProvider } from "./src/service/shutdown/Shutd
64
86
 
65
87
  export { SYNTAX_HIGHLIGHTER_SERVICE_ID } from "./src/api/service/core/SyntaxHighlighterService.ts";
66
88
  export type { default as SyntaxHighlighterService } from "./src/api/service/core/SyntaxHighlighterService.ts";
89
+ export type { ColorScheme } from "./src/api/service/core/SyntaxHighlighterService.ts";
67
90
  export { default as DefaultSyntaxHighlighterService } from "./src/service/syntaxHighlighter/DefaultSyntaxHighlighterService.ts";
68
91
  export { default as SyntaxHighlighterServiceProvider } from "./src/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.ts";
69
92
 
@@ -72,6 +95,69 @@ export type { default as PrettyPrinterService } from "./src/api/service/core/Pre
72
95
  export { default as DefaultPrettyPrinterService } from "./src/service/prettyPrinter/DefaultPrettyPrinterService.ts";
73
96
  export { default as PrettyPrinterServiceProvider } from "./src/service/prettyPrinter/PrettyPrinterServiceProvider.ts";
74
97
 
98
+ export { IMAGE_PRINTER_SERVICE_ID } from "./src/api/service/core/ImagePrinterService.ts";
99
+ export type { default as ImagePrinterService } from "./src/api/service/core/ImagePrinterService.ts";
100
+ export { default as DefaultImagePrinterService } from "./src/service/imagePrinter/DefaultImagePrinterService.ts";
101
+ export { default as ImagePrinterServiceProvider } from "./src/service/imagePrinter/ImagePrinterServiceProvider.ts";
102
+
103
+ export { TREE_PRINTER_SERVICE_ID } from "./src/api/service/core/TreePrinterService.ts";
104
+ export type { default as TreePrinterService } from "./src/api/service/core/TreePrinterService.ts";
105
+ export type { TreeNode } from "./src/api/service/core/TreePrinterService.ts";
106
+ export { default as DefaultTreePrinterService } from "./src/service/treePrinter/DefaultTreePrinterService.ts";
107
+ export { default as TreePrinterServiceProvider } from "./src/service/treePrinter/TreePrinterServiceProvider.ts";
108
+
109
+ export { TABLE_GENERATOR_SERVICE_ID } from "./src/api/service/core/TableGeneratorService.ts";
110
+ export type { default as TableGeneratorService } from "./src/api/service/core/TableGeneratorService.ts";
111
+ export {
112
+ Align,
113
+ type CellOptions,
114
+ type ColumnOptions,
115
+ type RowOptions,
116
+ type TableOptions,
117
+ } from "./src/api/service/core/TableGeneratorService.ts";
118
+ export { default as Table } from "./src/api/service/core/Table.ts";
119
+ export { default as DefaultTableGeneratorService } from "./src/service/tableGenerator/DefaultTableGeneratorService.ts";
120
+ export { default as TableGeneratorServiceProvider } from "./src/service/tableGenerator/TableGeneratorServiceProvider.ts";
121
+
122
+ export { DATA_DUMP_GENERATOR_SERVICE_ID } from "./src/api/service/core/DataDumpGeneratorService.ts";
123
+ export type { default as DataDumpGeneratorService } from "./src/api/service/core/DataDumpGeneratorService.ts";
124
+ export {
125
+ type ByteRangeColor,
126
+ DumpFormat,
127
+ type HexDumpGenerateOptions,
128
+ } from "./src/api/service/core/DataDumpGeneratorService.ts";
129
+ export { default as DefaultDataDumpGeneratorService } from "./src/service/dataDumpGenerator/DefaultDataDumpGeneratorService.ts";
130
+ export { default as DataDumpGeneratorServiceProvider } from "./src/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.ts";
131
+
132
+ export { COMPLETION_SERVICE_ID } from "./src/api/service/core/CompletionService.ts";
133
+ export type { default as CompletionService } from "./src/api/service/core/CompletionService.ts";
134
+ export {
135
+ type CompletionItem,
136
+ ShellType,
137
+ } from "./src/api/service/core/CompletionService.ts";
138
+ export { default as DefaultCompletionService } from "./src/service/completion/DefaultCompletionService.ts";
139
+ export { default as CompletionServiceProvider } from "./src/service/completion/CompletionServiceProvider.ts";
140
+
141
+ export { PROMPTER_SERVICE_ID } from "./src/api/service/core/PrompterService.ts";
142
+ export type { default as PrompterService } from "./src/api/service/core/PrompterService.ts";
143
+ export {
144
+ type Prompt,
145
+ type PromptOption,
146
+ type PromptResult,
147
+ PromptType,
148
+ } from "./src/api/service/core/PrompterService.ts";
149
+ export { default as DefaultPrompterService } from "./src/service/prompter/DefaultPrompterService.ts";
150
+ export {
151
+ DEFAULT_PROMPTER_CONFIG,
152
+ type PrompterServiceConfig,
153
+ } from "./src/service/prompter/DefaultPrompterService.ts";
154
+ export { default as PrompterServiceProvider } from "./src/service/prompter/PrompterServiceProvider.ts";
155
+
156
+ export { ARGUMENT_PROMPTER_SERVICE_ID } from "./src/api/service/core/ArgumentPrompterService.ts";
157
+ export type { default as ArgumentPrompterService } from "./src/api/service/core/ArgumentPrompterService.ts";
158
+ export { default as DefaultArgumentPrompterService } from "./src/service/argumentPrompter/DefaultArgumentPrompterService.ts";
159
+ export { default as ArgumentPrompterServiceProvider } from "./src/service/argumentPrompter/ArgumentPrompterServiceProvider.ts";
160
+
75
161
  // CLI API
76
162
  export type { InvalidArgument } from "./src/api/RunResult.ts";
77
163
  export type { default as Context } from "./src/api/Context.ts";
@@ -80,6 +166,7 @@ export type {
80
166
  InvalidArgumentReason,
81
167
  RunState,
82
168
  } from "./src/api/RunResult.ts";
169
+ export type { default as BaseCLIFeatureOptions } from "./src/api/BaseCLIFeatureOptions.ts";
83
170
  export type { default as CLIConfig } from "./src/api/CLIConfig.ts";
84
171
  export type { default as CLI } from "./src/api/CLI.ts";
85
172
 
@@ -87,6 +174,16 @@ export type { default as CLI } from "./src/api/CLI.ts";
87
174
  export { default as BaseCLI } from "./src/cli/BaseCLI.ts";
88
175
  export { default as DefaultRuntimeCLI } from "./src/cli/DefaultRuntimeCLI.ts";
89
176
 
177
+ // Terminal API
178
+ export type { default as Terminal } from "./src/terminal/Terminal.ts";
179
+ export type { default as Styler } from "./src/terminal/Styler.ts";
180
+ export type {
181
+ default as KeyReader,
182
+ KeyEvent,
183
+ } from "./src/terminal/KeyReader.ts";
184
+ export { SpecialKey } from "./src/terminal/KeyReader.ts";
185
+ export { default as TtyKeyReader } from "./src/terminal/TtyKeyReader.ts";
186
+
90
187
  // Convenience functions
91
188
  export {
92
189
  launchMultiCommandCLI,
package/package.json CHANGED
@@ -18,23 +18,24 @@
18
18
  ],
19
19
  "module": "index.ts",
20
20
  "type": "module",
21
- "version": "1.1.5",
21
+ "version": "1.2.0",
22
22
  "publishConfig": {
23
23
  "access": "public"
24
24
  },
25
25
  "devDependencies": {
26
- "@types/bun": "^1.2.9"
26
+ "@types/bun": "^1.3.14",
27
+ "@types/node": "^25.9.1"
27
28
  },
28
29
  "peerDependencies": {
29
- "typescript": "^5.8.3"
30
+ "typescript": "^6.0.3"
30
31
  },
31
32
  "dependencies": {
32
33
  "emphasize": "^7.0.0",
33
34
  "fastest-levenshtein": "^1.0.16",
34
- "figlet": "^1.8.1",
35
+ "figlet": "^1.11.0",
35
36
  "highlight.js": "^11.11.1",
36
- "prettier": "^3.5.3",
37
- "supports-color": "^10.0.0",
38
- "ts-log": "^2.2.7"
37
+ "prettier": "^3.8.3",
38
+ "supports-color": "^10.2.2",
39
+ "supports-terminal-graphics": "^0.1.0"
39
40
  }
40
41
  }
@@ -0,0 +1,10 @@
1
+ export default interface BaseCLIFeatureOptions {
2
+ readonly configFileSupportEnabled?: boolean;
3
+ readonly envVarsSupportEnabled?: boolean;
4
+ readonly keyValueServiceEnabled?: boolean;
5
+ readonly secretServiceEnabled?: boolean;
6
+ readonly argumentPrompterServiceEnabled?: boolean;
7
+ readonly completionServiceEnabled?: boolean;
8
+ readonly imagePrinterServiceEnabled?: boolean;
9
+ readonly validateAllCommands?: boolean;
10
+ }
@@ -12,6 +12,11 @@ export default interface CLIConfig {
12
12
  */
13
13
  readonly description?: string;
14
14
 
15
+ /**
16
+ * Optional sub-message to display below the banner.
17
+ */
18
+ readonly subMessage?: string;
19
+
15
20
  /**
16
21
  * Version of the CLI application.
17
22
  */
@@ -34,6 +34,11 @@ export enum RunState {
34
34
  * General runtime error related to the framework.
35
35
  */
36
36
  RUNTIME_ERROR = 4,
37
+
38
+ /**
39
+ * Execution was interrupted by a signal (e.g. Ctrl-C or SIGTERM).
40
+ */
41
+ INTERRUPTED = 130,
37
42
  }
38
43
 
39
44
  /**
@@ -84,6 +89,11 @@ export enum InvalidArgumentReason {
84
89
  * Attempt to set a primitive value on a complex object object.
85
90
  */
86
91
  OPTION_IS_COMPLEX = 8,
92
+
93
+ /**
94
+ * The value failed a custom validation function defined on the argument.
95
+ */
96
+ CUSTOM_VALIDATION = 9,
87
97
  }
88
98
 
89
99
  /**
@@ -114,6 +124,12 @@ export interface InvalidArgument {
114
124
  | PopulatedArgumentValues
115
125
  | PopulatedArgumentValueType
116
126
  | Array<PopulatedArgumentValues | PopulatedArgumentValueType>;
127
+
128
+ /**
129
+ * An optional message providing detail about the validation failure.
130
+ * Populated when {@link reason} is {@link InvalidArgumentReason.CUSTOM_VALIDATION}.
131
+ */
132
+ readonly message?: string;
117
133
  }
118
134
 
119
135
  /**
@@ -1,5 +1,7 @@
1
1
  import type {
2
2
  ArgumentSingleValueType,
3
+ ArgumentValues,
4
+ ArgumentValueType,
3
5
  ArgumentValueTypeName,
4
6
  } from "./ArgumentValueTypes.ts";
5
7
 
@@ -13,10 +15,25 @@ export default interface Argument {
13
15
  readonly type: ArgumentValueTypeName;
14
16
 
15
17
  /**
16
- * Optional list of values that the value must match.
18
+ * Optional list of values that the value must match. This is not supported for {@link ArgumentValueTypeName.BOOLEAN}.
17
19
  */
18
20
  readonly allowableValues?: ReadonlyArray<ArgumentSingleValueType>;
19
21
 
22
+ /**
23
+ * Optional (default is `false`) for {@link ArgumentValueTypeName.STRING} when comparing a value against {@link allowableValues}.
24
+ */
25
+ readonly isCaseInsensitive?: boolean;
26
+
27
+ /**
28
+ * Optional for {@link ArgumentValueTypeName.INTEGER} or {@link ArgumentValueTypeName.NUMBER} when validating a value.
29
+ */
30
+ readonly minValueInclusive?: number;
31
+
32
+ /**
33
+ * Optional for {@link ArgumentValueTypeName.INTEGER} or {@link ArgumentValueTypeName.NUMBER} when validating a value.
34
+ */
35
+ readonly maxValueInclusive?: number;
36
+
20
37
  /**
21
38
  * Optional configuration key to use for the argument. Must consist of alphanumeric non-whitespace uppercase
22
39
  * ASCII or `_` characters. Must not start with a digit.
@@ -33,4 +50,26 @@ export default interface Argument {
33
50
  * it will only be used if the parent {@link Command} has specified {@link Command.enableConfiguration} as `true`.
34
51
  */
35
52
  readonly configurationKey?: string;
53
+
54
+ /**
55
+ * Optional custom validation function invoked after all built-in validation
56
+ * has passed. Receives the validated and type-converted value.
57
+ *
58
+ * Return `undefined` if the value is valid, or a string describing the
59
+ * validation error. The error string is associated with
60
+ * {@link InvalidArgumentReason.CUSTOM_VALIDATION}.
61
+ *
62
+ * Example: ensure array values are unique:
63
+ * ```typescript
64
+ * validate: (value) => {
65
+ * const arr = value as string[];
66
+ * return new Set(arr).size !== arr.length
67
+ * ? "values must be unique"
68
+ * : undefined;
69
+ * }
70
+ * ```
71
+ */
72
+ readonly validate?: (
73
+ value: ArgumentValueType | ArgumentValues | Array<ArgumentValues>,
74
+ ) => string | undefined;
36
75
  }
@@ -48,7 +48,7 @@ export enum ArgumentValueTypeName {
48
48
  NUMBER = 1,
49
49
  INTEGER = 2,
50
50
  BOOLEAN = 3,
51
- SECRET,
51
+ SECRET = 4,
52
52
  }
53
53
 
54
54
  /**
@@ -21,7 +21,7 @@ export default interface SubCommand extends Command {
21
21
  readonly positionals: ReadonlyArray<Positional>;
22
22
 
23
23
  /**
24
- * Optional grouping topic of the command to structuring of help output.
24
+ * Optional grouping topic of the command for structuring of help output.
25
25
  */
26
26
  readonly helpTopic?: string;
27
27
 
@@ -18,7 +18,7 @@ export interface ServiceInfo {
18
18
  }
19
19
 
20
20
  /**
21
- * Interface allowing services to be provided to the CLI.
21
+ * Interface allowing a service to be provided to the CLI.
22
22
  */
23
23
  export interface ServiceProvider {
24
24
  /**
@@ -33,11 +33,11 @@ export interface ServiceProvider {
33
33
  readonly servicePriority: number;
34
34
 
35
35
  /**
36
- * Return {@link ServiceInfo} containing the service and any commands which should be registered in the CLI.
36
+ * Return {@link ServiceInfo} containing the service and any commands it provides which should be registered in the CLI.
37
37
  *
38
38
  * @param cliConfig the {@link CLIConfig} for the CLI.
39
39
  */
40
- provide(cliConfig: CLIConfig): Promise<ServiceInfo>;
40
+ getServiceInfo(cliConfig: CLIConfig): Promise<ServiceInfo>;
41
41
 
42
42
  /**
43
43
  * Initialise the service. This will be invoked AFTER any {@link GlobalModifierCommand} provided in the
@@ -0,0 +1,10 @@
1
+ import type { ParseResult } from "../../../runtime/parser.ts";
2
+
3
+ export const ARGUMENT_PROMPTER_SERVICE_ID =
4
+ "@flowscripter/dynamic-cli-framework/argument-prompter-service";
5
+
6
+ export default interface ArgumentPrompterService {
7
+ promptForMissingArguments(
8
+ parseResult: ParseResult,
9
+ ): Promise<ParseResult>;
10
+ }
@@ -1,8 +1,46 @@
1
1
  export const ASCII_BANNER_GENERATOR_SERVICE_ID =
2
2
  "@flowscripter/dynamic-cli-framework/ascii-banner-generator-service";
3
3
 
4
+ export type ColorEffectDirection = "horizontal" | "vertical";
5
+
6
+ export interface FixedColorEffect {
7
+ type: "fixed";
8
+ color: string; // hex "#rrggbb"
9
+ }
10
+
11
+ export interface GradientColorEffect {
12
+ type: "gradient";
13
+ colors: string[]; // 2+ hex color stops
14
+ direction: ColorEffectDirection;
15
+ }
16
+
17
+ export interface RainbowColorEffect {
18
+ type: "rainbow";
19
+ spread?: number; // default 8.0
20
+ frequency?: number; // default 0.3
21
+ seed?: number; // default 0 = random seed
22
+ direction: ColorEffectDirection;
23
+ }
24
+
25
+ export type ColorEffect =
26
+ | FixedColorEffect
27
+ | GradientColorEffect
28
+ | RainbowColorEffect;
29
+
30
+ export interface BannerColorEffects {
31
+ background?: ColorEffect;
32
+ messageForeground?: ColorEffect;
33
+ subMessageForeground?: ColorEffect;
34
+ }
35
+
36
+ export interface BannerGenerateOptions {
37
+ fontName?: string;
38
+ subMessage?: string;
39
+ colorEffects?: BannerColorEffects;
40
+ }
41
+
4
42
  /**
5
- * Service allowing a text string to be rendered using an ASCII banner [FIGlet](http://www.figlet.org) font.
43
+ * Service allowing a text string to be rendered using an ASCII banner font.
6
44
  */
7
45
  export default interface AsciiBannerGeneratorService {
8
46
  /**
@@ -12,11 +50,10 @@ export default interface AsciiBannerGeneratorService {
12
50
  * (replacing newlines with `\n`) and placing in a simple JSON file: `{ "font": "<figlet font definition>" }`.
13
51
  * This can then be imported as follows:
14
52
  *
15
- * `import { font as myFont } from "./myfont.json" with { type: "json" };
53
+ * `import { font as myFont } from "./myfont.json" with { type: "json" };`
16
54
  *
17
55
  * @param fontName the name used to refer to the font.
18
- * @param fontDefinition the definition for the syntax conforming to the
19
- * [FIGfont format](http://www.jave.de/figlet/figfont.html#creating).
56
+ * @param fontDefinition the definition for the syntax conforming to the FIGfont format.
20
57
  */
21
58
  registerFont(fontName: string, fontDefinition: string): void;
22
59
 
@@ -26,10 +63,10 @@ export default interface AsciiBannerGeneratorService {
26
63
  getRegisteredFonts(): ReadonlyArray<string>;
27
64
 
28
65
  /**
29
- * Generate an ASCII banner text for the message using the specified font.
66
+ * Generate an ASCII banner text for the message using the specified options.
30
67
  *
31
68
  * @param message the message to output.
32
- * @param fontName the font to use.
69
+ * @param options optional generation options.
33
70
  */
34
- generate(message: string, fontName: string): Promise<string>;
71
+ generate(message: string, options?: BannerGenerateOptions): Promise<string>;
35
72
  }
@@ -0,0 +1,36 @@
1
+ export const COMPLETION_SERVICE_ID =
2
+ "@flowscripter/dynamic-cli-framework/completion-service";
3
+
4
+ export enum ShellType {
5
+ BASH = "bash",
6
+ ZSH = "zsh",
7
+ FISH = "fish",
8
+ POWERSHELL = "powershell",
9
+ }
10
+
11
+ export interface CompletionItem {
12
+ readonly value: string;
13
+ readonly description?: string;
14
+ }
15
+
16
+ /**
17
+ * Interface for a service providing shell auto-completion support.
18
+ */
19
+ export default interface CompletionService {
20
+ generateCompletions(
21
+ shellType: ShellType,
22
+ line: string,
23
+ cursorPosition: number,
24
+ ): Promise<ReadonlyArray<CompletionItem>>;
25
+
26
+ getBootstrapScript(shellType: ShellType, cliName: string): string;
27
+
28
+ getDefaultConfigPath(shellType: ShellType): string;
29
+
30
+ validateShellEnvironment(shellType: ShellType): Promise<boolean>;
31
+
32
+ formatCompletions(
33
+ shellType: ShellType,
34
+ completions: ReadonlyArray<CompletionItem>,
35
+ ): string;
36
+ }
@@ -0,0 +1,27 @@
1
+ import { Buffer } from "node:buffer";
2
+
3
+ export const DATA_DUMP_GENERATOR_SERVICE_ID =
4
+ "@flowscripter/dynamic-cli-framework/data-dump-generator-service";
5
+
6
+ export enum DumpFormat {
7
+ HEX = "HEX",
8
+ ASCII = "ASCII",
9
+ }
10
+
11
+ export interface ByteRangeColor {
12
+ start: number;
13
+ end: number;
14
+ color: string;
15
+ }
16
+
17
+ export interface HexDumpGenerateOptions {
18
+ format?: DumpFormat;
19
+ bytesPerGroup?: number;
20
+ groupsPerRow?: number;
21
+ spacesBetweenGroups?: number;
22
+ colorScheme?: ByteRangeColor[];
23
+ }
24
+
25
+ export default interface DataDumpGeneratorService {
26
+ generate(data: Buffer, options?: HexDumpGenerateOptions): string;
27
+ }
@@ -0,0 +1,26 @@
1
+ export const IMAGE_PRINTER_SERVICE_ID =
2
+ "@flowscripter/dynamic-cli-framework/image-printer-service";
3
+
4
+ /**
5
+ * Service for rendering images in the terminal.
6
+ *
7
+ * Uses the Kitty or iTerm2 graphics protocol when supported, otherwise falls back
8
+ * to ANSI half-block character rendering. Terminal multiplexers (tmux, screen) always
9
+ * use the ANSI fallback as they do not pass through graphics protocol escape sequences.
10
+ */
11
+ export default interface ImagePrinterService {
12
+ /**
13
+ * Render an image as a string suitable for terminal output.
14
+ *
15
+ * @param imageBuffer the raw image data (e.g. PNG file contents).
16
+ * @param widthPercentage the percentage of terminal width to use for rendering. Defaults to 100.
17
+ * @param hexFormattedBackgroundColor optional background color for transparent pixels.
18
+ * This should be a valid hex formatted string e.g. "#rrggbb". If not specified,
19
+ * transparent pixels show through to the terminal background.
20
+ */
21
+ image(
22
+ imageBuffer: Uint8Array,
23
+ widthPercentage?: number,
24
+ hexFormattedBackgroundColor?: string,
25
+ ): Promise<string>;
26
+ }