kiriya 0.1.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 (282) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/LICENSE +21 -0
  3. package/README.md +87 -0
  4. package/dist/src/config/clean-rules.js +39 -0
  5. package/dist/src/config/config-keys.js +24 -0
  6. package/dist/src/config/dependency-directories.js +16 -0
  7. package/dist/src/config/modules.js +38 -0
  8. package/dist/src/config/protected-paths.js +32 -0
  9. package/dist/src/config/rebuildable-directories.js +20 -0
  10. package/dist/src/core/application/command-registry.js +57 -0
  11. package/dist/src/core/application/config-values.js +33 -0
  12. package/dist/src/core/application/path-guard.js +69 -0
  13. package/dist/src/core/application/paths.js +77 -0
  14. package/dist/src/core/application/plugin-loader.js +100 -0
  15. package/dist/src/core/application/process-ending.js +28 -0
  16. package/dist/src/core/application/root-scope.js +123 -0
  17. package/dist/src/core/application/safety.js +26 -0
  18. package/dist/src/core/application/text-input.js +44 -0
  19. package/dist/src/core/application/walk.js +34 -0
  20. package/dist/src/core/domain/command.js +8 -0
  21. package/dist/src/core/domain/encodings.js +70 -0
  22. package/dist/src/core/domain/errors.js +49 -0
  23. package/dist/src/core/domain/glob.js +57 -0
  24. package/dist/src/core/domain/global-options.js +10 -0
  25. package/dist/src/core/domain/input-schema.js +54 -0
  26. package/dist/src/core/domain/message.js +7 -0
  27. package/dist/src/core/domain/module.js +2 -0
  28. package/dist/src/core/domain/names.js +22 -0
  29. package/dist/src/core/domain/ports/clipboard.js +2 -0
  30. package/dist/src/core/domain/ports/clock.js +2 -0
  31. package/dist/src/core/domain/ports/command-catalog.js +2 -0
  32. package/dist/src/core/domain/ports/compression.js +2 -0
  33. package/dist/src/core/domain/ports/config-store.js +2 -0
  34. package/dist/src/core/domain/ports/confirmation.js +2 -0
  35. package/dist/src/core/domain/ports/environment.js +2 -0
  36. package/dist/src/core/domain/ports/file-content.js +2 -0
  37. package/dist/src/core/domain/ports/file-system.js +2 -0
  38. package/dist/src/core/domain/ports/hasher.js +2 -0
  39. package/dist/src/core/domain/ports/network.js +2 -0
  40. package/dist/src/core/domain/ports/opener.js +2 -0
  41. package/dist/src/core/domain/ports/passthrough.js +2 -0
  42. package/dist/src/core/domain/ports/plugin-inventory.js +2 -0
  43. package/dist/src/core/domain/ports/plugin-source.js +2 -0
  44. package/dist/src/core/domain/ports/port-table.js +2 -0
  45. package/dist/src/core/domain/ports/process-runner.js +2 -0
  46. package/dist/src/core/domain/ports/process-table.js +2 -0
  47. package/dist/src/core/domain/ports/protected-paths.js +2 -0
  48. package/dist/src/core/domain/ports/random-source.js +2 -0
  49. package/dist/src/core/domain/ports/standard-input.js +2 -0
  50. package/dist/src/core/domain/ports/system-info.js +2 -0
  51. package/dist/src/core/domain/ports/trash.js +2 -0
  52. package/dist/src/core/domain/secrets.js +59 -0
  53. package/dist/src/core/domain/targets.js +41 -0
  54. package/dist/src/core/domain/text-case.js +39 -0
  55. package/dist/src/core/domain/values/bytes.js +13 -0
  56. package/dist/src/core/domain/view.js +2 -0
  57. package/dist/src/core/infrastructure/node/can-listen.js +10 -0
  58. package/dist/src/core/infrastructure/node/closed-standard-input.adapter.js +12 -0
  59. package/dist/src/core/infrastructure/node/config-location.js +27 -0
  60. package/dist/src/core/infrastructure/node/fs-errors.js +22 -0
  61. package/dist/src/core/infrastructure/node/json-config-store.adapter.js +69 -0
  62. package/dist/src/core/infrastructure/node/node-compression.adapter.js +82 -0
  63. package/dist/src/core/infrastructure/node/node-environment.adapter.js +21 -0
  64. package/dist/src/core/infrastructure/node/node-file-content.adapter.js +99 -0
  65. package/dist/src/core/infrastructure/node/node-file-system.adapter.js +169 -0
  66. package/dist/src/core/infrastructure/node/node-hasher.adapter.js +32 -0
  67. package/dist/src/core/infrastructure/node/node-network.adapter.js +168 -0
  68. package/dist/src/core/infrastructure/node/node-plugin-source.adapter.js +89 -0
  69. package/dist/src/core/infrastructure/node/node-process-runner.adapter.js +48 -0
  70. package/dist/src/core/infrastructure/node/node-random-source.adapter.js +7 -0
  71. package/dist/src/core/infrastructure/node/node-standard-input.adapter.js +24 -0
  72. package/dist/src/core/infrastructure/node/node-system-info.adapter.js +63 -0
  73. package/dist/src/core/infrastructure/node/process-signals.js +51 -0
  74. package/dist/src/core/infrastructure/node/run-program.js +65 -0
  75. package/dist/src/core/infrastructure/node/system-clock.adapter.js +22 -0
  76. package/dist/src/core/infrastructure/node/typed-programs.js +45 -0
  77. package/dist/src/core/infrastructure/platform/linux/freedesktop-trash.adapter.js +115 -0
  78. package/dist/src/core/infrastructure/platform/linux/linux-clipboard.adapter.js +70 -0
  79. package/dist/src/core/infrastructure/platform/linux/linux-opener.adapter.js +21 -0
  80. package/dist/src/core/infrastructure/platform/linux/linux-port-table.adapter.js +97 -0
  81. package/dist/src/core/infrastructure/platform/linux/linux-process-table.adapter.js +61 -0
  82. package/dist/src/core/infrastructure/platform/macos/macos-clipboard.adapter.js +29 -0
  83. package/dist/src/core/infrastructure/platform/macos/macos-opener.adapter.js +13 -0
  84. package/dist/src/core/infrastructure/platform/macos/macos-port-table.adapter.js +86 -0
  85. package/dist/src/core/infrastructure/platform/macos/macos-process-table.adapter.js +62 -0
  86. package/dist/src/core/infrastructure/platform/macos/macos-trash.adapter.js +64 -0
  87. package/dist/src/core/infrastructure/platform/windows/system32.js +6 -0
  88. package/dist/src/core/infrastructure/platform/windows/windows-clipboard.adapter.js +50 -0
  89. package/dist/src/core/infrastructure/platform/windows/windows-opener.adapter.js +11 -0
  90. package/dist/src/core/infrastructure/platform/windows/windows-port-table.adapter.js +38 -0
  91. package/dist/src/core/infrastructure/platform/windows/windows-process-table.adapter.js +134 -0
  92. package/dist/src/core/infrastructure/platform/windows/windows-trash.adapter.js +86 -0
  93. package/dist/src/core/presentation/cli/argv.js +83 -0
  94. package/dist/src/core/presentation/cli/cli-application.js +201 -0
  95. package/dist/src/core/presentation/cli/cli-view-format.js +46 -0
  96. package/dist/src/core/presentation/cli/help.js +202 -0
  97. package/dist/src/core/presentation/cli/json-output.js +28 -0
  98. package/dist/src/core/presentation/cli/style.js +21 -0
  99. package/dist/src/core/presentation/cli/suggest.js +25 -0
  100. package/dist/src/core/presentation/cli/terminal-confirmation.js +63 -0
  101. package/dist/src/core/presentation/ended-processes.js +18 -0
  102. package/dist/src/core/presentation/i18n/translator.js +23 -0
  103. package/dist/src/core/presentation/list-preview.js +10 -0
  104. package/dist/src/core/presentation/mcp/elicitation.js +55 -0
  105. package/dist/src/core/presentation/mcp/mcp-application.js +60 -0
  106. package/dist/src/core/presentation/mcp/mcp-confirmation.js +59 -0
  107. package/dist/src/core/presentation/mcp/mcp-server.js +355 -0
  108. package/dist/src/core/presentation/mcp/protocol.js +32 -0
  109. package/dist/src/core/presentation/mcp/request-state.js +66 -0
  110. package/dist/src/core/presentation/mcp/tool-definitions.js +149 -0
  111. package/dist/src/core/presentation/mcp/tool-results.js +56 -0
  112. package/dist/src/i18n/locales/en.js +827 -0
  113. package/dist/src/main.js +154 -0
  114. package/dist/src/modules/archive/application/archive-sources.js +55 -0
  115. package/dist/src/modules/archive/application/create-tar.use-case.js +123 -0
  116. package/dist/src/modules/archive/application/create-zip.use-case.js +106 -0
  117. package/dist/src/modules/archive/application/extract-tar.use-case.js +240 -0
  118. package/dist/src/modules/archive/application/extract-zip.use-case.js +181 -0
  119. package/dist/src/modules/archive/application/tar-reader.js +45 -0
  120. package/dist/src/modules/archive/application/zip-reader.js +57 -0
  121. package/dist/src/modules/archive/archive.module.js +27 -0
  122. package/dist/src/modules/archive/domain/crc32.js +18 -0
  123. package/dist/src/modules/archive/domain/tar-format.js +97 -0
  124. package/dist/src/modules/archive/domain/tar-stream.js +223 -0
  125. package/dist/src/modules/archive/domain/zip-format.js +158 -0
  126. package/dist/src/modules/archive/presentation/tar.view.js +17 -0
  127. package/dist/src/modules/archive/presentation/untar.view.js +30 -0
  128. package/dist/src/modules/archive/presentation/unzip.view.js +24 -0
  129. package/dist/src/modules/archive/presentation/zip.view.js +17 -0
  130. package/dist/src/modules/clip/application/copy-text.use-case.js +43 -0
  131. package/dist/src/modules/clip/application/paste-text.use-case.js +25 -0
  132. package/dist/src/modules/clip/clip.module.js +16 -0
  133. package/dist/src/modules/clip/presentation/clip.views.js +7 -0
  134. package/dist/src/modules/completion/application/print-script.use-case.js +38 -0
  135. package/dist/src/modules/completion/application/suggest-words.use-case.js +37 -0
  136. package/dist/src/modules/completion/completion.module.js +14 -0
  137. package/dist/src/modules/completion/domain/scripts.js +91 -0
  138. package/dist/src/modules/completion/domain/suggest.js +134 -0
  139. package/dist/src/modules/completion/presentation/completion.views.js +6 -0
  140. package/dist/src/modules/config/application/config-commands.js +14 -0
  141. package/dist/src/modules/config/application/get-setting.use-case.js +25 -0
  142. package/dist/src/modules/config/application/list-config-keys.use-case.js +26 -0
  143. package/dist/src/modules/config/application/list-settings.use-case.js +28 -0
  144. package/dist/src/modules/config/application/set-setting.use-case.js +53 -0
  145. package/dist/src/modules/config/application/show-config-path.use-case.js +21 -0
  146. package/dist/src/modules/config/application/unset-setting.use-case.js +28 -0
  147. package/dist/src/modules/config/config.module.js +28 -0
  148. package/dist/src/modules/config/presentation/config.views.js +33 -0
  149. package/dist/src/modules/convert/application/convert-case.use-case.js +38 -0
  150. package/dist/src/modules/convert/application/convert-codecs.use-case.js +92 -0
  151. package/dist/src/modules/convert/application/convert-input.js +16 -0
  152. package/dist/src/modules/convert/application/convert-json.use-case.js +51 -0
  153. package/dist/src/modules/convert/application/convert-time.use-case.js +39 -0
  154. package/dist/src/modules/convert/application/decode-jwt.use-case.js +52 -0
  155. package/dist/src/modules/convert/convert.module.js +29 -0
  156. package/dist/src/modules/convert/domain/json-syntax.js +135 -0
  157. package/dist/src/modules/convert/domain/jwt.js +29 -0
  158. package/dist/src/modules/convert/domain/moments.js +20 -0
  159. package/dist/src/modules/convert/presentation/convert.views.js +44 -0
  160. package/dist/src/modules/docker/application/clean-engine.use-case.js +77 -0
  161. package/dist/src/modules/docker/application/compose-project.js +45 -0
  162. package/dist/src/modules/docker/application/docker-engine.js +40 -0
  163. package/dist/src/modules/docker/application/list-containers.use-case.js +69 -0
  164. package/dist/src/modules/docker/application/run-compose.use-case.js +83 -0
  165. package/dist/src/modules/docker/application/show-logs.use-case.js +51 -0
  166. package/dist/src/modules/docker/application/stop-project.use-case.js +56 -0
  167. package/dist/src/modules/docker/docker.module.js +23 -0
  168. package/dist/src/modules/docker/domain/compose-file.js +105 -0
  169. package/dist/src/modules/docker/domain/engine-output.js +65 -0
  170. package/dist/src/modules/docker/presentation/docker.views.js +63 -0
  171. package/dist/src/modules/doctor/application/run-checks.use-case.js +128 -0
  172. package/dist/src/modules/doctor/doctor.module.js +13 -0
  173. package/dist/src/modules/doctor/domain/versions.js +22 -0
  174. package/dist/src/modules/doctor/presentation/doctor.view.js +30 -0
  175. package/dist/src/modules/env/application/check-dotenv.use-case.js +116 -0
  176. package/dist/src/modules/env/application/inspect-path.use-case.js +71 -0
  177. package/dist/src/modules/env/application/path-entries.js +28 -0
  178. package/dist/src/modules/env/application/show-variables.use-case.js +47 -0
  179. package/dist/src/modules/env/domain/dotenv.js +62 -0
  180. package/dist/src/modules/env/env.module.js +17 -0
  181. package/dist/src/modules/env/presentation/env.views.js +43 -0
  182. package/dist/src/modules/files/application/clean-builds.use-case.js +149 -0
  183. package/dist/src/modules/files/application/compare-paths.use-case.js +127 -0
  184. package/dist/src/modules/files/application/copy-paths.use-case.js +101 -0
  185. package/dist/src/modules/files/application/create-paths.use-case.js +85 -0
  186. package/dist/src/modules/files/application/delete-paths.use-case.js +127 -0
  187. package/dist/src/modules/files/application/find-duplicates.use-case.js +105 -0
  188. package/dist/src/modules/files/application/find-files.use-case.js +131 -0
  189. package/dist/src/modules/files/application/hash-files.use-case.js +73 -0
  190. package/dist/src/modules/files/application/list-entries.use-case.js +87 -0
  191. package/dist/src/modules/files/application/measure-folders.use-case.js +102 -0
  192. package/dist/src/modules/files/application/move-entry.js +19 -0
  193. package/dist/src/modules/files/application/move-paths.use-case.js +82 -0
  194. package/dist/src/modules/files/application/read-text.use-case.js +92 -0
  195. package/dist/src/modules/files/application/rename-paths.use-case.js +184 -0
  196. package/dist/src/modules/files/application/replace-text.use-case.js +146 -0
  197. package/dist/src/modules/files/application/search-text.use-case.js +115 -0
  198. package/dist/src/modules/files/application/show-info.use-case.js +80 -0
  199. package/dist/src/modules/files/application/show-tree.use-case.js +75 -0
  200. package/dist/src/modules/files/application/sync-folders.use-case.js +162 -0
  201. package/dist/src/modules/files/application/text-files.js +46 -0
  202. package/dist/src/modules/files/application/transfers.js +35 -0
  203. package/dist/src/modules/files/domain/case-style.js +18 -0
  204. package/dist/src/modules/files/domain/filters.js +9 -0
  205. package/dist/src/modules/files/domain/sync-plan.js +35 -0
  206. package/dist/src/modules/files/domain/text-encoding.js +75 -0
  207. package/dist/src/modules/files/domain/values.js +28 -0
  208. package/dist/src/modules/files/files.module.js +70 -0
  209. package/dist/src/modules/files/presentation/clean.view.js +15 -0
  210. package/dist/src/modules/files/presentation/compare.view.js +50 -0
  211. package/dist/src/modules/files/presentation/copy.view.js +17 -0
  212. package/dist/src/modules/files/presentation/delete.view.js +16 -0
  213. package/dist/src/modules/files/presentation/dupes.view.js +20 -0
  214. package/dist/src/modules/files/presentation/find.view.js +16 -0
  215. package/dist/src/modules/files/presentation/grep.view.js +27 -0
  216. package/dist/src/modules/files/presentation/hash.view.js +15 -0
  217. package/dist/src/modules/files/presentation/info.view.js +36 -0
  218. package/dist/src/modules/files/presentation/list.view.js +17 -0
  219. package/dist/src/modules/files/presentation/move.view.js +14 -0
  220. package/dist/src/modules/files/presentation/new.view.js +8 -0
  221. package/dist/src/modules/files/presentation/read.view.js +6 -0
  222. package/dist/src/modules/files/presentation/rename.view.js +16 -0
  223. package/dist/src/modules/files/presentation/replace.view.js +26 -0
  224. package/dist/src/modules/files/presentation/size.view.js +24 -0
  225. package/dist/src/modules/files/presentation/sync.view.js +37 -0
  226. package/dist/src/modules/files/presentation/tree.view.js +22 -0
  227. package/dist/src/modules/gen/application/gen-options.js +18 -0
  228. package/dist/src/modules/gen/application/generate-passwords.use-case.js +39 -0
  229. package/dist/src/modules/gen/application/generate-tokens.use-case.js +38 -0
  230. package/dist/src/modules/gen/application/generate-ulids.use-case.js +40 -0
  231. package/dist/src/modules/gen/application/generate-uuids.use-case.js +32 -0
  232. package/dist/src/modules/gen/domain/identifiers.js +65 -0
  233. package/dist/src/modules/gen/domain/secrets.js +43 -0
  234. package/dist/src/modules/gen/gen.module.js +20 -0
  235. package/dist/src/modules/git/application/fetch-repositories.use-case.js +50 -0
  236. package/dist/src/modules/git/application/git-client.js +62 -0
  237. package/dist/src/modules/git/application/pull-repositories.use-case.js +67 -0
  238. package/dist/src/modules/git/application/repositories.js +67 -0
  239. package/dist/src/modules/git/application/show-status.use-case.js +49 -0
  240. package/dist/src/modules/git/application/switch-branch.use-case.js +118 -0
  241. package/dist/src/modules/git/domain/repository-status.js +37 -0
  242. package/dist/src/modules/git/git.module.js +25 -0
  243. package/dist/src/modules/git/presentation/git.views.js +100 -0
  244. package/dist/src/modules/net/application/check-connection.use-case.js +71 -0
  245. package/dist/src/modules/net/application/list-addresses.use-case.js +29 -0
  246. package/dist/src/modules/net/application/lookup-name.use-case.js +55 -0
  247. package/dist/src/modules/net/net.module.js +17 -0
  248. package/dist/src/modules/net/presentation/net.views.js +39 -0
  249. package/dist/src/modules/open/application/open-target.use-case.js +53 -0
  250. package/dist/src/modules/open/domain/targets.js +45 -0
  251. package/dist/src/modules/open/open.module.js +12 -0
  252. package/dist/src/modules/open/presentation/open.view.js +6 -0
  253. package/dist/src/modules/port/application/end-port-owners.use-case.js +68 -0
  254. package/dist/src/modules/port/application/find-free-port.use-case.js +40 -0
  255. package/dist/src/modules/port/application/find-listeners.use-case.js +34 -0
  256. package/dist/src/modules/port/application/port-owners.js +25 -0
  257. package/dist/src/modules/port/domain/port-number.js +8 -0
  258. package/dist/src/modules/port/port.module.js +17 -0
  259. package/dist/src/modules/port/presentation/port.views.js +27 -0
  260. package/dist/src/modules/proc/application/end-processes.use-case.js +77 -0
  261. package/dist/src/modules/proc/application/find-processes.use-case.js +50 -0
  262. package/dist/src/modules/proc/application/list-processes.use-case.js +41 -0
  263. package/dist/src/modules/proc/application/show-tree.use-case.js +40 -0
  264. package/dist/src/modules/proc/domain/process-tree.js +55 -0
  265. package/dist/src/modules/proc/presentation/proc.views.js +28 -0
  266. package/dist/src/modules/proc/proc.module.js +19 -0
  267. package/dist/src/modules/sys/application/create-report.use-case.js +30 -0
  268. package/dist/src/modules/sys/application/find-tools.use-case.js +20 -0
  269. package/dist/src/modules/sys/application/machine-facts.js +44 -0
  270. package/dist/src/modules/sys/application/show-info.use-case.js +29 -0
  271. package/dist/src/modules/sys/domain/tools.js +17 -0
  272. package/dist/src/modules/sys/presentation/sys.views.js +67 -0
  273. package/dist/src/modules/sys/sys.module.js +17 -0
  274. package/dist/src/modules/wait/application/poll.js +26 -0
  275. package/dist/src/modules/wait/application/wait-file.use-case.js +55 -0
  276. package/dist/src/modules/wait/application/wait-port.use-case.js +76 -0
  277. package/dist/src/modules/wait/application/wait-url.use-case.js +71 -0
  278. package/dist/src/modules/wait/domain/reasons.js +14 -0
  279. package/dist/src/modules/wait/domain/wait-input.js +50 -0
  280. package/dist/src/modules/wait/presentation/wait.views.js +31 -0
  281. package/dist/src/modules/wait/wait.module.js +21 -0
  282. package/package.json +57 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-store.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=confirmation.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-content.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-system.js.map
@@ -0,0 +1,2 @@
1
+ export const HASH_ALGORITHMS = ["sha256", "sha1", "md5", "sha512"];
2
+ //# sourceMappingURL=hasher.js.map
@@ -0,0 +1,2 @@
1
+ export const DNS_RECORD_TYPES = ["a", "aaaa", "cname", "mx", "txt", "ns"];
2
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=opener.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=passthrough.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin-inventory.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin-source.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=port-table.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process-runner.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process-table.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protected-paths.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=random-source.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=standard-input.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=system-info.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trash.js.map
@@ -0,0 +1,59 @@
1
+ import { splitWords } from "./text-case.js";
2
+ const SECRET_ASSIGNMENT = /(pass(word)?|pwd|secret|token|api[-_]?key)\s*[=:]/i;
3
+ const PRIVATE_KEY = /-----BEGIN [A-Z ]*PRIVATE KEY-----/;
4
+ /** `scheme://user:password@host`. */
5
+ const URL_CREDENTIALS = /[a-z][a-z0-9+.-]*:\/\/[^\s/:@]+:[^\s/@]+@/i;
6
+ /** A JSON Web Token: two base64url JSON parts, then the signature. */
7
+ const JWT = /eyJ[A-Za-z0-9_-]{8,}\.eyJ[A-Za-z0-9_-]{8,}\./;
8
+ /** Tokens whose issuers give them a recognisable prefix, such as GitHub, GitLab, Slack and npm tokens and AWS access keys. */
9
+ const PREFIXED_TOKEN = /^(?:(?:ghp|gho|ghu|ghs|ghr)_|github_pat_|glpat-|xox[abprs]-|npm_|sk-)[A-Za-z0-9_-]{16,}$|^AKIA[0-9A-Z]{16}$/;
10
+ /** Text that looks like it carries a secret: `Password=...`, a private key, a URL with a password, or a token. */
11
+ export function looksSecret(value) {
12
+ return (SECRET_ASSIGNMENT.test(value) ||
13
+ PRIVATE_KEY.test(value) ||
14
+ URL_CREDENTIALS.test(value) ||
15
+ JWT.test(value) ||
16
+ PREFIXED_TOKEN.test(value.trim()));
17
+ }
18
+ const SECRET_WORDS = new Set([
19
+ "password",
20
+ "passwd",
21
+ "passphrase",
22
+ "pass",
23
+ "pwd",
24
+ "secret",
25
+ "secrets",
26
+ "token",
27
+ "tokens",
28
+ "credential",
29
+ "credentials",
30
+ "cookie",
31
+ "dsn",
32
+ ]);
33
+ const SECRET_ENDINGS = /(?:password|passwd|passphrase|secret|token)s?$/;
34
+ const SECRET_PHRASES = [
35
+ "apikey",
36
+ "accesskey",
37
+ "privatekey",
38
+ "secretkey",
39
+ "signingkey",
40
+ "encryptionkey",
41
+ "masterkey",
42
+ "licensekey",
43
+ "subscriptionkey",
44
+ "accountkey",
45
+ "connectionstring",
46
+ ];
47
+ /**
48
+ * A variable or setting name whose value is usually a secret, such as `GITHUB_TOKEN`,
49
+ * `DB_PASSWORD`, `apiKey` or `ConnectionStrings__Default`. `PWD`, the working folder, is not.
50
+ */
51
+ export function isSecretName(name) {
52
+ if (name.toUpperCase() === "PWD")
53
+ return false;
54
+ const words = splitWords(name).map((word) => word.toLowerCase());
55
+ const joined = words.join("");
56
+ return (words.some((word) => SECRET_WORDS.has(word) || SECRET_ENDINGS.test(word)) ||
57
+ SECRET_PHRASES.some((phrase) => joined.includes(phrase)));
58
+ }
59
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1,41 @@
1
+ /** The ports URL schemes use when a URL names none. */
2
+ const DEFAULT_PORTS = {
3
+ "http:": 80,
4
+ "https:": 443,
5
+ "ws:": 80,
6
+ "wss:": 443,
7
+ "ftp:": 21,
8
+ "ssh:": 22,
9
+ };
10
+ function validPort(text) {
11
+ if (!/^\d{1,5}$/.test(text))
12
+ return null;
13
+ const port = Number(text);
14
+ return port >= 1 && port <= 65_535 ? port : null;
15
+ }
16
+ /** `host:port`, `[IPv6]:port`, or a URL such as https://example.com whose scheme gives the port; null for anything else. */
17
+ export function parseTarget(text) {
18
+ const value = text.trim();
19
+ if (/^[a-z][a-z0-9+.-]*:\/\//i.test(value)) {
20
+ let url;
21
+ try {
22
+ url = new URL(value);
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ const port = url.port === "" ? (DEFAULT_PORTS[url.protocol] ?? null) : validPort(url.port);
28
+ const host = url.hostname.replace(/^\[(.*)\]$/, "$1");
29
+ return port === null || host === "" ? null : { host, port };
30
+ }
31
+ const match = /^\[([^\]]+)\]:(\d+)$/.exec(value) ?? /^([^:\s[\]]+):(\d+)$/.exec(value);
32
+ if (match === null)
33
+ return null;
34
+ const port = validPort(match[2] ?? "");
35
+ return port === null ? null : { host: match[1] ?? "", port };
36
+ }
37
+ /** host:port, with an IPv6 address in brackets. */
38
+ export function formatTarget(target) {
39
+ return target.host.includes(":") ? `[${target.host}]:${target.port}` : `${target.host}:${target.port}`;
40
+ }
41
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +1,39 @@
1
+ export const TEXT_CASES = ["kebab", "snake", "camel", "pascal", "constant", "title", "lower", "upper"];
2
+ /** "userProfile_v2 Final" -> ["user", "Profile", "v2", "Final"]; letters of any script count. */
3
+ export function splitWords(text) {
4
+ return text
5
+ .replace(/(\p{Ll}|\p{N})(\p{Lu})/gu, "$1 $2")
6
+ .replace(/(\p{Lu}+)(\p{Lu}\p{Ll})/gu, "$1 $2")
7
+ .split(/[^\p{L}\p{N}\p{M}]+/u)
8
+ .filter((word) => word.length > 0);
9
+ }
10
+ /**
11
+ * Text in another case. Words are found at separators, case changes and digits;
12
+ * `lower` and `upper` keep the text as it is apart from its case.
13
+ */
14
+ export function toCase(text, style) {
15
+ if (style === "lower")
16
+ return text.toLowerCase();
17
+ if (style === "upper")
18
+ return text.toUpperCase();
19
+ const words = splitWords(text);
20
+ if (words.length === 0)
21
+ return text;
22
+ const lower = words.map((word) => word.toLowerCase());
23
+ const capital = (word) => word.charAt(0).toUpperCase() + word.slice(1);
24
+ switch (style) {
25
+ case "kebab":
26
+ return lower.join("-");
27
+ case "snake":
28
+ return lower.join("_");
29
+ case "constant":
30
+ return lower.join("_").toUpperCase();
31
+ case "camel":
32
+ return lower.map((word, index) => (index === 0 ? word : capital(word))).join("");
33
+ case "pascal":
34
+ return lower.map(capital).join("");
35
+ case "title":
36
+ return lower.map(capital).join(" ");
37
+ }
38
+ }
39
+ //# sourceMappingURL=text-case.js.map
@@ -0,0 +1,13 @@
1
+ const UNITS = ["B", "KB", "MB", "GB", "TB"];
2
+ /** 1536 -> "1.5 KB". Units of 1024, the same on every OS. */
3
+ export function formatBytes(bytes) {
4
+ let value = bytes;
5
+ let unit = 0;
6
+ while (value >= 1024 && unit < UNITS.length - 1) {
7
+ value /= 1024;
8
+ unit += 1;
9
+ }
10
+ const shown = unit === 0 ? String(value) : value.toFixed(value >= 10 ? 0 : 1);
11
+ return `${shown} ${UNITS[unit] ?? "B"}`;
12
+ }
13
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1,10 @@
1
+ import { createServer } from "node:net";
2
+ /** Opens a TCP server on every interface and closes it again; false when the port is taken or not allowed. */
3
+ export function canListen(port) {
4
+ return new Promise((resolve) => {
5
+ const server = createServer();
6
+ server.once("error", () => resolve(false));
7
+ server.listen({ port, exclusive: true }, () => server.close(() => resolve(true)));
8
+ });
9
+ }
10
+ //# sourceMappingURL=can-listen.js.map
@@ -0,0 +1,12 @@
1
+ import { UsageError } from "../../domain/errors.js";
2
+ /**
3
+ * Standard input that carries something else, such as MCP messages, so no command may
4
+ * read it. It reports a terminal, which makes a command ask for its value as an argument.
5
+ */
6
+ export class ClosedStandardInput {
7
+ isTerminal = true;
8
+ read() {
9
+ return Promise.reject(new UsageError("core.input.missing"));
10
+ }
11
+ }
12
+ //# sourceMappingURL=closed-standard-input.adapter.js.map
@@ -0,0 +1,27 @@
1
+ import path from "node:path";
2
+ /**
3
+ * Where this user's configuration file lives (docs/usage.md): KIRIYA_CONFIG
4
+ * when set; otherwise %APPDATA% on Windows, $XDG_CONFIG_HOME or ~/.config on Linux,
5
+ * and Application Support on macOS. A relative XDG value is ignored, as the specification says.
6
+ */
7
+ export function configFilePath(environment, cwd) {
8
+ const paths = environment.os === "windows" ? path.win32 : path.posix;
9
+ const override = environment.variable("KIRIYA_CONFIG");
10
+ if (override !== undefined && override !== "")
11
+ return paths.resolve(cwd, override);
12
+ const home = environment.homeDirectory;
13
+ const absolute = (value) => value !== undefined && paths.isAbsolute(value);
14
+ switch (environment.os) {
15
+ case "windows": {
16
+ const appData = environment.variable("APPDATA");
17
+ return paths.join(absolute(appData) ? appData : paths.join(home, "AppData", "Roaming"), "kiriya", "config.json");
18
+ }
19
+ case "macos":
20
+ return paths.join(home, "Library", "Application Support", "kiriya", "config.json");
21
+ case "linux": {
22
+ const configHome = environment.variable("XDG_CONFIG_HOME");
23
+ return paths.join(absolute(configHome) ? configHome : paths.join(home, ".config"), "kiriya", "config.json");
24
+ }
25
+ }
26
+ }
27
+ //# sourceMappingURL=config-location.js.map
@@ -0,0 +1,22 @@
1
+ import { ConflictError, NotFoundError, OperationFailedError, RefusedError } from "../../domain/errors.js";
2
+ export function errorCode(error) {
3
+ return error.code ?? "UNKNOWN";
4
+ }
5
+ const MISSING = new Set(["ENOENT", "ENOTDIR"]);
6
+ export function isMissing(error) {
7
+ return MISSING.has(errorCode(error));
8
+ }
9
+ /** Node.js errors become typed errors here, so no errno code reaches a use case. */
10
+ export function translateFsError(error, path) {
11
+ const code = errorCode(error);
12
+ if (MISSING.has(code))
13
+ throw new NotFoundError("core.fs.not-found", { path }, { cause: error });
14
+ if (code === "EACCES" || code === "EPERM")
15
+ throw new RefusedError("core.fs.permission", { path }, { cause: error });
16
+ if (code === "EEXIST" || code === "ERR_FS_CP_EEXIST")
17
+ throw new ConflictError("core.fs.exists", { path }, { cause: error });
18
+ if (code === "EISDIR")
19
+ throw new ConflictError("core.fs.is-folder", { path }, { cause: error });
20
+ throw new OperationFailedError("core.fs.failed", { path, detail: code }, { cause: error });
21
+ }
22
+ //# sourceMappingURL=fs-errors.js.map
@@ -0,0 +1,69 @@
1
+ import { lstat, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { OperationFailedError } from "../../domain/errors.js";
4
+ import { isMissing, translateFsError } from "./fs-errors.js";
5
+ export class JsonConfigStore {
6
+ path;
7
+ constructor(path) {
8
+ this.path = path;
9
+ }
10
+ async exists() {
11
+ try {
12
+ await lstat(this.path);
13
+ return true;
14
+ }
15
+ catch (error) {
16
+ if (isMissing(error))
17
+ return false;
18
+ return translateFsError(error, this.path);
19
+ }
20
+ }
21
+ async read() {
22
+ let text;
23
+ try {
24
+ text = await readFile(this.path, "utf8");
25
+ }
26
+ catch (error) {
27
+ if (isMissing(error))
28
+ return {};
29
+ return translateFsError(error, this.path);
30
+ }
31
+ let parsed;
32
+ try {
33
+ parsed = JSON.parse(text);
34
+ }
35
+ catch (error) {
36
+ throw new OperationFailedError("core.config.invalid-json", { path: this.path }, { cause: error });
37
+ }
38
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
39
+ throw new OperationFailedError("core.config.not-an-object", { path: this.path });
40
+ }
41
+ const values = {};
42
+ for (const [key, value] of Object.entries(parsed)) {
43
+ if (typeof value === "string") {
44
+ values[key] = value;
45
+ }
46
+ else if (Array.isArray(value) && value.every((item) => typeof item === "string")) {
47
+ values[key] = value;
48
+ }
49
+ else {
50
+ throw new OperationFailedError("core.config.invalid-field", { path: this.path, field: key });
51
+ }
52
+ }
53
+ return values;
54
+ }
55
+ async write(values) {
56
+ const sorted = Object.fromEntries(Object.entries(values).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
57
+ const temporary = `${this.path}.${process.pid}.tmp`;
58
+ try {
59
+ await mkdir(dirname(this.path), { recursive: true });
60
+ await writeFile(temporary, `${JSON.stringify(sorted, null, 2)}\n`, "utf8");
61
+ await rename(temporary, this.path);
62
+ }
63
+ catch (error) {
64
+ await rm(temporary, { force: true });
65
+ translateFsError(error, this.path);
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=json-config-store.adapter.js.map
@@ -0,0 +1,82 @@
1
+ import { createGunzip, createGzip, deflateRaw, inflateRaw } from "node:zlib";
2
+ import { OperationFailedError } from "../../domain/errors.js";
3
+ function failed(error) {
4
+ return new OperationFailedError("core.compression.failed", { detail: error.message }, { cause: error });
5
+ }
6
+ /** A zlib transform whose output is collected as it arrives and handed back on each push. */
7
+ class ZlibStream {
8
+ transform;
9
+ ready = [];
10
+ failure = null;
11
+ finished;
12
+ constructor(transform) {
13
+ this.transform = transform;
14
+ transform.on("data", (chunk) => this.ready.push(chunk));
15
+ this.finished = new Promise((resolve) => {
16
+ transform.once("end", () => resolve());
17
+ transform.once("error", (error) => {
18
+ this.failure = error;
19
+ resolve();
20
+ });
21
+ });
22
+ }
23
+ push(data) {
24
+ if (this.failure !== null)
25
+ return Promise.reject(failed(this.failure));
26
+ return new Promise((resolve, reject) => {
27
+ // zlib destroys itself on damaged data without calling back the write in progress, so its error settles this too.
28
+ const onError = (error) => reject(failed(error));
29
+ this.transform.once("error", onError);
30
+ this.transform.write(data, (error) => {
31
+ this.transform.off("error", onError);
32
+ const problem = error ?? this.failure;
33
+ if (problem === null || problem === undefined)
34
+ resolve(this.take());
35
+ else
36
+ reject(failed(problem));
37
+ });
38
+ });
39
+ }
40
+ async end() {
41
+ if (this.failure === null)
42
+ this.transform.end();
43
+ await this.finished;
44
+ if (this.failure !== null)
45
+ throw failed(this.failure);
46
+ return this.take();
47
+ }
48
+ take() {
49
+ const output = Buffer.concat(this.ready);
50
+ this.ready = [];
51
+ return output;
52
+ }
53
+ }
54
+ export class NodeCompressionAdapter {
55
+ deflateRaw(data) {
56
+ return new Promise((resolve, reject) => {
57
+ deflateRaw(data, { level: 6 }, (error, result) => {
58
+ if (error === null)
59
+ resolve(result);
60
+ else
61
+ reject(failed(error));
62
+ });
63
+ });
64
+ }
65
+ inflateRaw(data) {
66
+ return new Promise((resolve, reject) => {
67
+ inflateRaw(data, (error, result) => {
68
+ if (error === null)
69
+ resolve(result);
70
+ else
71
+ reject(failed(error));
72
+ });
73
+ });
74
+ }
75
+ gzip() {
76
+ return new ZlibStream(createGzip({ level: 6 }));
77
+ }
78
+ gunzip() {
79
+ return new ZlibStream(createGunzip());
80
+ }
81
+ }
82
+ //# sourceMappingURL=node-compression.adapter.js.map
@@ -0,0 +1,21 @@
1
+ import { homedir } from "node:os";
2
+ function osFamily(platform) {
3
+ if (platform === "win32")
4
+ return "windows";
5
+ if (platform === "darwin")
6
+ return "macos";
7
+ // Other Unix-like systems follow the Linux adapters until they get their own.
8
+ return "linux";
9
+ }
10
+ export class NodeEnvironmentAdapter {
11
+ os = osFamily(process.platform);
12
+ homeDirectory = homedir();
13
+ variable(name) {
14
+ return process.env[name];
15
+ }
16
+ variables() {
17
+ const entries = Object.entries(process.env).filter((entry) => entry[1] !== undefined);
18
+ return Object.fromEntries(entries);
19
+ }
20
+ }
21
+ //# sourceMappingURL=node-environment.adapter.js.map
@@ -0,0 +1,99 @@
1
+ import { open, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { OperationFailedError } from "../../domain/errors.js";
3
+ import { translateFsError } from "./fs-errors.js";
4
+ class NodeFileReader {
5
+ handle;
6
+ path;
7
+ size;
8
+ constructor(handle, path, size) {
9
+ this.handle = handle;
10
+ this.path = path;
11
+ this.size = size;
12
+ }
13
+ async readAt(position, length) {
14
+ const buffer = new Uint8Array(length);
15
+ let done = 0;
16
+ try {
17
+ while (done < length) {
18
+ const { bytesRead } = await this.handle.read(buffer, done, length - done, position + done);
19
+ if (bytesRead === 0)
20
+ throw new OperationFailedError("core.fs.truncated", { path: this.path });
21
+ done += bytesRead;
22
+ }
23
+ }
24
+ catch (error) {
25
+ if (error instanceof OperationFailedError)
26
+ throw error;
27
+ translateFsError(error, this.path);
28
+ }
29
+ return buffer;
30
+ }
31
+ close() {
32
+ return this.handle.close();
33
+ }
34
+ }
35
+ class NodeFileWriter {
36
+ handle;
37
+ path;
38
+ constructor(handle, path) {
39
+ this.handle = handle;
40
+ this.path = path;
41
+ }
42
+ async write(data) {
43
+ try {
44
+ let done = 0;
45
+ while (done < data.length) {
46
+ const { bytesWritten } = await this.handle.write(data, done, data.length - done);
47
+ done += bytesWritten;
48
+ }
49
+ }
50
+ catch (error) {
51
+ translateFsError(error, this.path);
52
+ }
53
+ }
54
+ close() {
55
+ return this.handle.close();
56
+ }
57
+ async discard() {
58
+ // The handle may already be closed by a failed write; removing the file is what matters.
59
+ await this.handle.close().catch(() => undefined);
60
+ await rm(this.path, { force: true });
61
+ }
62
+ }
63
+ export class NodeFileContentAdapter {
64
+ async read(path) {
65
+ try {
66
+ return await readFile(path);
67
+ }
68
+ catch (error) {
69
+ return translateFsError(error, path);
70
+ }
71
+ }
72
+ async write(path, data) {
73
+ try {
74
+ await writeFile(path, data);
75
+ }
76
+ catch (error) {
77
+ translateFsError(error, path);
78
+ }
79
+ }
80
+ async openForReading(path) {
81
+ try {
82
+ const handle = await open(path, "r");
83
+ const { size } = await handle.stat();
84
+ return new NodeFileReader(handle, path, size);
85
+ }
86
+ catch (error) {
87
+ return translateFsError(error, path);
88
+ }
89
+ }
90
+ async createExclusive(path) {
91
+ try {
92
+ return new NodeFileWriter(await open(path, "wx"), path);
93
+ }
94
+ catch (error) {
95
+ return translateFsError(error, path);
96
+ }
97
+ }
98
+ }
99
+ //# sourceMappingURL=node-file-content.adapter.js.map