bashkit 0.4.0__tar.gz → 0.5.0__tar.gz

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 (491) hide show
  1. {bashkit-0.4.0 → bashkit-0.5.0}/Cargo.lock +17 -6
  2. {bashkit-0.4.0 → bashkit-0.5.0}/Cargo.toml +1 -1
  3. {bashkit-0.4.0 → bashkit-0.5.0}/PKG-INFO +1 -1
  4. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/Cargo.toml +4 -5
  5. bashkit-0.5.0/crates/bashkit/docs/clap-builtins.md +138 -0
  6. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/custom_builtins.md +4 -5
  7. bashkit-0.5.0/crates/bashkit/src/builtins/cat.rs +193 -0
  8. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/compgen.rs +4 -4
  9. bashkit-0.5.0/crates/bashkit/src/builtins/generated/cat_args.rs +132 -0
  10. bashkit-0.5.0/crates/bashkit/src/builtins/generated/mod.rs +34 -0
  11. bashkit-0.5.0/crates/bashkit/src/builtins/generated/readlink_args.rs +125 -0
  12. bashkit-0.5.0/crates/bashkit/src/builtins/generated/shuf_args.rs +148 -0
  13. bashkit-0.5.0/crates/bashkit/src/builtins/generated/tac_args.rs +72 -0
  14. bashkit-0.5.0/crates/bashkit/src/builtins/generated/truncate_args.rs +99 -0
  15. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/mod.rs +56 -9
  16. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/path.rs +77 -48
  17. bashkit-0.5.0/crates/bashkit/src/builtins/shuf.rs +265 -0
  18. bashkit-0.5.0/crates/bashkit/src/builtins/textrev.rs +192 -0
  19. bashkit-0.5.0/crates/bashkit/src/builtins/truncate.rs +346 -0
  20. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/interpreter/mod.rs +2 -0
  21. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/lib.rs +4 -7
  22. bashkit-0.5.0/crates/bashkit/src/tool_def.rs +1223 -0
  23. bashkit-0.5.0/crates/bashkit/tests/coreutils_differential_tests.rs +548 -0
  24. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/custom_builtins_tests.rs +0 -11
  25. bashkit-0.5.0/crates/bashkit/tests/spec_cases/bash/cat.test.sh +81 -0
  26. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/help-flag.test.sh +3 -3
  27. bashkit-0.5.0/crates/bashkit/tests/spec_cases/bash/readlink.test.sh +55 -0
  28. bashkit-0.5.0/crates/bashkit/tests/spec_cases/bash/shuf.test.sh +65 -0
  29. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/textrev.test.sh +16 -0
  30. bashkit-0.5.0/crates/bashkit/tests/spec_cases/bash/truncate.test.sh +105 -0
  31. bashkit-0.4.0/crates/bashkit/src/builtins/cat.rs +0 -109
  32. bashkit-0.4.0/crates/bashkit/src/builtins/textrev.rs +0 -132
  33. bashkit-0.4.0/crates/bashkit/src/tool_def.rs +0 -440
  34. {bashkit-0.4.0 → bashkit-0.5.0}/README.md +0 -0
  35. {bashkit-0.4.0 → bashkit-0.5.0}/bashkit/__init__.py +0 -0
  36. {bashkit-0.4.0 → bashkit-0.5.0}/bashkit/_bashkit.pyi +0 -0
  37. {bashkit-0.4.0 → bashkit-0.5.0}/bashkit/deepagents.py +0 -0
  38. {bashkit-0.4.0 → bashkit-0.5.0}/bashkit/langchain.py +0 -0
  39. {bashkit-0.4.0 → bashkit-0.5.0}/bashkit/py.typed +0 -0
  40. {bashkit-0.4.0 → bashkit-0.5.0}/bashkit/pydantic_ai.py +0 -0
  41. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/README.md +0 -0
  42. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/benches/parallel_execution.rs +0 -0
  43. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/benches/sqlite.rs +0 -0
  44. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/compatibility.md +0 -0
  45. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/credential-injection.md +0 -0
  46. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/hooks.md +0 -0
  47. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/jq.md +0 -0
  48. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/live_mounts.md +0 -0
  49. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/logging.md +0 -0
  50. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/python.md +0 -0
  51. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/sqlite.md +0 -0
  52. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/ssh.md +0 -0
  53. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/threat-model.md +0 -0
  54. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/docs/typescript.md +0 -0
  55. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/agent_tool.rs +0 -0
  56. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/basic.rs +0 -0
  57. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/clap_builtin.rs +0 -0
  58. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/clap_builtin_subcommands.rs +0 -0
  59. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/custom_backend.rs +0 -0
  60. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/custom_builtins.rs +0 -0
  61. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/custom_filesystem_impl.rs +0 -0
  62. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/custom_fs.rs +0 -0
  63. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/git_workflow.rs +0 -0
  64. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/live_mounts.rs +0 -0
  65. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/python_external_functions.rs +0 -0
  66. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/python_scripts.rs +0 -0
  67. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/realfs_readonly.rs +0 -0
  68. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/realfs_readwrite.rs +0 -0
  69. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/resource_limits.rs +0 -0
  70. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/scripted_tool.rs +0 -0
  71. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/show_tool_output.rs +0 -0
  72. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/sqlite_basic.rs +0 -0
  73. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/sqlite_workflow.rs +0 -0
  74. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/ssh_supabase.rs +0 -0
  75. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/streaming_output.rs +0 -0
  76. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/text_files.rs +0 -0
  77. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/text_processing.rs +0 -0
  78. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/typescript_external_functions.rs +0 -0
  79. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/typescript_scripts.rs +0 -0
  80. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/examples/virtual_identity.rs +0 -0
  81. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/proptest-regressions/builtins/sqlite/tests.txt +0 -0
  82. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/alias.rs +0 -0
  83. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/archive.rs +0 -0
  84. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/arg_parser.rs +0 -0
  85. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/assert.rs +0 -0
  86. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/awk.rs +0 -0
  87. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/base64.rs +0 -0
  88. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/bc.rs +0 -0
  89. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/caller.rs +0 -0
  90. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/checksum.rs +0 -0
  91. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/clear.rs +0 -0
  92. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/column.rs +0 -0
  93. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/comm.rs +0 -0
  94. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/csv.rs +0 -0
  95. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/curl.rs +0 -0
  96. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/cuttr.rs +0 -0
  97. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/date.rs +0 -0
  98. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/diff.rs +0 -0
  99. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/dirstack.rs +0 -0
  100. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/disk.rs +0 -0
  101. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/dotenv.rs +0 -0
  102. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/echo.rs +0 -0
  103. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/environ.rs +0 -0
  104. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/envsubst.rs +0 -0
  105. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/expand.rs +0 -0
  106. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/export.rs +0 -0
  107. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/expr.rs +0 -0
  108. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/fc.rs +0 -0
  109. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/fileops.rs +0 -0
  110. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/flow.rs +0 -0
  111. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/fold.rs +0 -0
  112. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/git/client.rs +0 -0
  113. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/git/cmd.rs +0 -0
  114. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/git/config.rs +0 -0
  115. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/git/mod.rs +0 -0
  116. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/glob_cmd.rs +0 -0
  117. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/grep.rs +0 -0
  118. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/headtail.rs +0 -0
  119. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/help.rs +0 -0
  120. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/hextools.rs +0 -0
  121. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/http.rs +0 -0
  122. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/iconv.rs +0 -0
  123. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/inspect.rs +0 -0
  124. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/introspect.rs +0 -0
  125. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/join.rs +0 -0
  126. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/jq/args.rs +0 -0
  127. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/jq/compat.rs +0 -0
  128. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/jq/convert.rs +0 -0
  129. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/jq/errors.rs +0 -0
  130. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/jq/format.rs +0 -0
  131. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/jq/mod.rs +0 -0
  132. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/jq/regex_compat.rs +0 -0
  133. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/jq/tests.rs +0 -0
  134. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/json.rs +0 -0
  135. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/log.rs +0 -0
  136. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/ls.rs +0 -0
  137. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/mapfile.rs +0 -0
  138. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/mkfifo.rs +0 -0
  139. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/navigation.rs +0 -0
  140. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/nl.rs +0 -0
  141. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/numfmt.rs +0 -0
  142. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/parallel.rs +0 -0
  143. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/paste.rs +0 -0
  144. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/patch.rs +0 -0
  145. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/pipeline.rs +0 -0
  146. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/printf.rs +0 -0
  147. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/python.rs +0 -0
  148. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/read.rs +0 -0
  149. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/retry.rs +0 -0
  150. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/rg.rs +0 -0
  151. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/search_common.rs +0 -0
  152. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/sed.rs +0 -0
  153. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/semver.rs +0 -0
  154. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/seq.rs +0 -0
  155. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/sleep.rs +0 -0
  156. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/sortuniq.rs +0 -0
  157. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/source.rs +0 -0
  158. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/split.rs +0 -0
  159. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/sqlite/dot_commands.rs +0 -0
  160. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/sqlite/engine.rs +0 -0
  161. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/sqlite/formatter.rs +0 -0
  162. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/sqlite/mod.rs +0 -0
  163. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/sqlite/parser.rs +0 -0
  164. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/sqlite/tests.rs +0 -0
  165. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/sqlite/vfs_io.rs +0 -0
  166. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/ssh/allowlist.rs +0 -0
  167. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/ssh/client.rs +0 -0
  168. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/ssh/cmd.rs +0 -0
  169. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/ssh/config.rs +0 -0
  170. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/ssh/handler.rs +0 -0
  171. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/ssh/mod.rs +0 -0
  172. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/ssh/russh_handler.rs +0 -0
  173. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/strings.rs +0 -0
  174. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/system.rs +0 -0
  175. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/template.rs +0 -0
  176. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/test.rs +0 -0
  177. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/timeout.rs +0 -0
  178. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/tomlq.rs +0 -0
  179. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/trap.rs +0 -0
  180. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/tree.rs +0 -0
  181. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/typescript.rs +0 -0
  182. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/vars.rs +0 -0
  183. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/verify.rs +0 -0
  184. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/wait.rs +0 -0
  185. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/wc.rs +0 -0
  186. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/yaml.rs +0 -0
  187. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/yes.rs +0 -0
  188. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/builtins/zip_cmd.rs +0 -0
  189. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/credential.rs +0 -0
  190. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/error.rs +0 -0
  191. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/fs/backend.rs +0 -0
  192. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/fs/limits.rs +0 -0
  193. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/fs/memory.rs +0 -0
  194. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/fs/mod.rs +0 -0
  195. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/fs/mountable.rs +0 -0
  196. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/fs/overlay.rs +0 -0
  197. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/fs/posix.rs +0 -0
  198. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/fs/realfs.rs +0 -0
  199. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/fs/search.rs +0 -0
  200. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/fs/traits.rs +0 -0
  201. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/hooks.rs +0 -0
  202. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/interop/fs.rs +0 -0
  203. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/interop/mod.rs +0 -0
  204. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/interpreter/glob.rs +0 -0
  205. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/interpreter/jobs.rs +0 -0
  206. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/interpreter/state.rs +0 -0
  207. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/limits.rs +0 -0
  208. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/logging_impl.rs +0 -0
  209. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/network/allowlist.rs +0 -0
  210. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/network/bot_auth.rs +0 -0
  211. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/network/client.rs +0 -0
  212. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/network/mod.rs +0 -0
  213. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/parser/ast.rs +0 -0
  214. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/parser/budget.rs +0 -0
  215. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/parser/lexer.rs +0 -0
  216. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/parser/mod.rs +0 -0
  217. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/parser/span.rs +0 -0
  218. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/parser/tokens.rs +0 -0
  219. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/scripted_tool/execute.rs +0 -0
  220. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/scripted_tool/extension.rs +0 -0
  221. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/scripted_tool/mod.rs +0 -0
  222. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/scripted_tool/toolset.rs +0 -0
  223. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/snapshot.rs +0 -0
  224. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/testing.rs +0 -0
  225. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/tool.rs +0 -0
  226. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/src/trace.rs +0 -0
  227. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/allexport_tests.rs +0 -0
  228. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/awk_fuzz_scaffold_tests.rs +0 -0
  229. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/awk_newline_tests.rs +0 -0
  230. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/awk_pattern_tests.rs +0 -0
  231. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/awk_printf_expr_test.rs +0 -0
  232. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/awk_range_pattern_tests.rs +0 -0
  233. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/background_exec_tests.rs +0 -0
  234. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/bash_source_tests.rs +0 -0
  235. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/blackbox_security_tests.rs +0 -0
  236. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/builtin_error_security_tests.rs +0 -0
  237. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/byte_range_panic_tests.rs +0 -0
  238. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/cancellation_tests.rs +0 -0
  239. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/cmdsub_quote_test.rs +0 -0
  240. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/coproc_tests.rs +0 -0
  241. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/credential_injection_tests.rs +0 -0
  242. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/custom_fs_tests.rs +0 -0
  243. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/dev_null_tests.rs +0 -0
  244. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/final_env_tests.rs +0 -0
  245. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/find_multi_path_tests.rs +0 -0
  246. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/git_advanced_tests.rs +0 -0
  247. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/git_inspection_tests.rs +0 -0
  248. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/git_integration_tests.rs +0 -0
  249. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/git_remote_security_tests.rs +0 -0
  250. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/git_security_tests.rs +0 -0
  251. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/harness_example_tests.rs +0 -0
  252. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/history_tests.rs +0 -0
  253. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_1175_test.rs +0 -0
  254. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_274_test.rs +0 -0
  255. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_275_279_282_test.rs +0 -0
  256. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_276_test.rs +0 -0
  257. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_277_test.rs +0 -0
  258. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_289_test.rs +0 -0
  259. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_290_test.rs +0 -0
  260. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_291_test.rs +0 -0
  261. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_853_test.rs +0 -0
  262. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_872_test.rs +0 -0
  263. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_873_test.rs +0 -0
  264. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/issue_875_test.rs +0 -0
  265. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/jq_fuzz_scaffold_tests.rs +0 -0
  266. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/live_mount_tests.rs +0 -0
  267. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/logging_security_tests.rs +0 -0
  268. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/mkfifo_tests.rs +0 -0
  269. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/nested_subscript_tests.rs +0 -0
  270. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/network_security_tests.rs +0 -0
  271. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/output_truncation_tests.rs +0 -0
  272. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/overlay_path_validation_tests.rs +0 -0
  273. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/proptest_differential.rs +0 -0
  274. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/proptest_security.rs +0 -0
  275. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/python_integration_tests.rs +0 -0
  276. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/python_security_tests.rs +0 -0
  277. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/realfs_tests.rs +0 -0
  278. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/regex_limit_tests.rs +0 -0
  279. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/release_profile_tests.rs +0 -0
  280. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/script_execution_tests.rs +0 -0
  281. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/security_audit_pocs.rs +0 -0
  282. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/security_failpoint_tests.rs +0 -0
  283. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/set_e_and_or_tests.rs +0 -0
  284. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_fixtures/azure_discover_rank.sh +0 -0
  285. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_fixtures/azure_generate_url.sh +0 -0
  286. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_fixtures/azure_query_capacity.sh +0 -0
  287. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_fixtures/helm_validate_chart.sh +0 -0
  288. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_fixtures/jwt_test_setup.sh +0 -0
  289. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_fixtures/stitch_download_asset.sh +0 -0
  290. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_fixtures/stitch_fetch.sh +0 -0
  291. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_fixtures/stitch_verify_setup.sh +0 -0
  292. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_fixtures/superpowers_find_polluter.sh +0 -0
  293. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_fixtures/vercel_deploy.sh +0 -0
  294. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/skills_tests.rs +0 -0
  295. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/snapshot_tests.rs +0 -0
  296. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/source_function_tests.rs +0 -0
  297. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/awk/awk.test.sh +0 -0
  298. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/awk/delete-array.test.sh +0 -0
  299. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/awk/dev-stderr.test.sh +0 -0
  300. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/awk/eval-bugs.test.sh +0 -0
  301. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/awk/filename.test.sh +0 -0
  302. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/awk/getline-file.test.sh +0 -0
  303. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/alias.test.sh +0 -0
  304. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/append_redirect.test.sh +0 -0
  305. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/arith-dynamic.test.sh +0 -0
  306. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/arithmetic-base-expansion.test.sh +0 -0
  307. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/arithmetic.test.sh +0 -0
  308. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/array-slicing.test.sh +0 -0
  309. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/array-splat.test.sh +0 -0
  310. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/arrays.test.sh +0 -0
  311. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh +0 -0
  312. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/awk-printf-width.test.sh +0 -0
  313. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/background.test.sh +0 -0
  314. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/bash-c-exports.test.sh +0 -0
  315. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/bash-command.test.sh +0 -0
  316. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/bash-flags.test.sh +0 -0
  317. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/bash-source-var.test.sh +0 -0
  318. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/bash-stdin-pipe.test.sh +0 -0
  319. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/bc.test.sh +0 -0
  320. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/blackbox-edge-cases.test.sh +0 -0
  321. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/blackbox-exploration.test.sh +0 -0
  322. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/brace-expansion.test.sh +0 -0
  323. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/brace_expansion_lookahead.test.sh +0 -0
  324. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/checksum.test.sh +0 -0
  325. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/chown-kill.test.sh +0 -0
  326. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/cmd-suggestions.test.sh +0 -0
  327. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/cmdsub_depth_unquoted.test.sh +0 -0
  328. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/column.test.sh +0 -0
  329. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/comm.test.sh +0 -0
  330. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/command-not-found.test.sh +0 -0
  331. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/command-subst.test.sh +0 -0
  332. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/command.test.sh +0 -0
  333. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/command_v.test.sh +0 -0
  334. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/compgen-path.test.sh +0 -0
  335. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/conditional-short-circuit.test.sh +0 -0
  336. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/conditional.test.sh +0 -0
  337. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/control-flow.test.sh +0 -0
  338. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/cuttr.test.sh +0 -0
  339. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/date.test.sh +0 -0
  340. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/declare.test.sh +0 -0
  341. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/df.test.sh +0 -0
  342. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/diff.test.sh +0 -0
  343. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/dirstack.test.sh +0 -0
  344. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/du.test.sh +0 -0
  345. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/echo.test.sh +0 -0
  346. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/empty-bodies.test.sh +0 -0
  347. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/env.test.sh +0 -0
  348. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/errexit.test.sh +0 -0
  349. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/eval-bugs.test.sh +0 -0
  350. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/exec-command.test.sh +0 -0
  351. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/exec-fd-redirect.test.sh +0 -0
  352. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/exec-fd-variable.test.sh +0 -0
  353. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/exit-status.test.sh +0 -0
  354. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/expr.test.sh +0 -0
  355. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/extglob.test.sh +0 -0
  356. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/file.test.sh +0 -0
  357. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/fileops.test.sh +0 -0
  358. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/find.test.sh +0 -0
  359. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/functions.test.sh +0 -0
  360. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/getopts.test.sh +0 -0
  361. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/glob-options.test.sh +0 -0
  362. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/glob_match_cap.test.sh +0 -0
  363. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/globs.test.sh +0 -0
  364. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/gzip.test.sh +0 -0
  365. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/headtail.test.sh +0 -0
  366. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/heredoc-edge.test.sh +0 -0
  367. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/heredoc.test.sh +0 -0
  368. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/herestring.test.sh +0 -0
  369. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/hextools.test.sh +0 -0
  370. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/history.test.sh +0 -0
  371. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/indirect-expansion.test.sh +0 -0
  372. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/less.test.sh +0 -0
  373. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/ln.test.sh +0 -0
  374. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/ls.test.sh +0 -0
  375. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/memory_budget_desync.test.sh +0 -0
  376. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +0 -0
  377. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/nameref.test.sh +0 -0
  378. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/negative-tests.test.sh +0 -0
  379. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/nl.test.sh +0 -0
  380. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/nounset.test.sh +0 -0
  381. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/numfmt.test.sh +0 -0
  382. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/parse-errors.test.sh +0 -0
  383. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/paste-flags.test.sh +0 -0
  384. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/paste.test.sh +0 -0
  385. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/path.test.sh +0 -0
  386. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/pipes-redirects.test.sh +0 -0
  387. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/printenv.test.sh +0 -0
  388. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/printf.test.sh +0 -0
  389. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/procsub.test.sh +0 -0
  390. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/quote.test.sh +0 -0
  391. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/read-builtin.test.sh +0 -0
  392. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/recursive-cmdsub.test.sh +0 -0
  393. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/regex-limit.test.sh +0 -0
  394. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/replace_pattern_limit.test.sh +0 -0
  395. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/script-exec.test.sh +0 -0
  396. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/seq.test.sh +0 -0
  397. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/set-allexport.test.sh +0 -0
  398. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/shell-grammar.test.sh +0 -0
  399. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/sleep.test.sh +0 -0
  400. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/sortuniq.test.sh +0 -0
  401. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/source.test.sh +0 -0
  402. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/stat.test.sh +0 -0
  403. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/string-ops.test.sh +0 -0
  404. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/strings.test.sh +0 -0
  405. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/subprocess-isolation.test.sh +0 -0
  406. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/subshell.test.sh +0 -0
  407. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/tar.test.sh +0 -0
  408. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/tar_create.test.sh +0 -0
  409. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/tee.test.sh +0 -0
  410. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/temp-binding.test.sh +0 -0
  411. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/test-operators.test.sh +0 -0
  412. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/test-tty.test.sh +0 -0
  413. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/time.test.sh +0 -0
  414. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/timeout.test.sh +0 -0
  415. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/tree.test.sh +0 -0
  416. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/type.test.sh +0 -0
  417. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/unicode.test.sh +0 -0
  418. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/unset-exported-var.test.sh +0 -0
  419. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/var-op-test.test.sh +0 -0
  420. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/variables.test.sh +0 -0
  421. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/wait.test.sh +0 -0
  422. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/watch.test.sh +0 -0
  423. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/wc.test.sh +0 -0
  424. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/word-split.test.sh +0 -0
  425. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/bash/xargs.test.sh +0 -0
  426. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/grep/eval-bugs.test.sh +0 -0
  427. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/grep/grep.test.sh +0 -0
  428. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/grep/rg.test.sh +0 -0
  429. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/jq/jq.test.sh +0 -0
  430. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/python/env_leak.test.sh +0 -0
  431. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/python/python.test.sh +0 -0
  432. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/sed/eval-bugs.test.sh +0 -0
  433. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/sed/sed.test.sh +0 -0
  434. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_cases/typescript/typescript.test.sh +0 -0
  435. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_runner.rs +0 -0
  436. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/spec_tests.rs +0 -0
  437. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/sqlite_compat_tests.rs +0 -0
  438. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/sqlite_differential_tests.rs +0 -0
  439. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/sqlite_fuzz_tests.rs +0 -0
  440. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/sqlite_integration_tests.rs +0 -0
  441. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/sqlite_security_tests.rs +0 -0
  442. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/ssh_builtin_tests.rs +0 -0
  443. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/ssh_supabase_tests.rs +0 -0
  444. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/stack_overflow_regression_tests.rs +0 -0
  445. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/subst_depth_limit_tests.rs +0 -0
  446. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/symlink_overlay_security_tests.rs +0 -0
  447. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/threat_model_tests.rs +0 -0
  448. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/tty_tests.rs +0 -0
  449. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/typescript_integration_tests.rs +0 -0
  450. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/typescript_security_tests.rs +0 -0
  451. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/unicode_security_tests.rs +0 -0
  452. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/unset_function_tests.rs +0 -0
  453. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit/tests/urandom_tests.rs +0 -0
  454. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/Cargo.toml +0 -0
  455. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/README.md +0 -0
  456. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/examples/bash_basics.py +0 -0
  457. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/examples/custom_filesystem_interop.py +0 -0
  458. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/examples/data_pipeline.py +0 -0
  459. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/examples/fastapi_async_tool.py +0 -0
  460. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/examples/jupyter_async_test.ipynb +0 -0
  461. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/examples/k8s_orchestrator.py +0 -0
  462. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/examples/langgraph_async_tool.py +0 -0
  463. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/examples/llm_tool.py +0 -0
  464. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/src/lib.rs +0 -0
  465. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/_bashkit_categories.py +0 -0
  466. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/_security_advanced.py +0 -0
  467. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/_security_core.py +0 -0
  468. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_ai_adapters.py +0 -0
  469. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_async_callbacks.py +0 -0
  470. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_basic.py +0 -0
  471. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_builtins.py +0 -0
  472. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_control_flow.py +0 -0
  473. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_error_handling.py +0 -0
  474. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_fastapi_integration.py +0 -0
  475. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_filesystem_interop.py +0 -0
  476. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_integration.py +0 -0
  477. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_jupyter_compat.py +0 -0
  478. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_langgraph_integration.py +0 -0
  479. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_network_config.py +0 -0
  480. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_network_credentials.py +0 -0
  481. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_python_security.py +0 -0
  482. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_registered_tools.py +0 -0
  483. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_scripts.py +0 -0
  484. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_security.py +0 -0
  485. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_shell_injection.py +0 -0
  486. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_sqlite.py +0 -0
  487. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_streaming_output.py +0 -0
  488. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_strings_and_quoting.py +0 -0
  489. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_tool_metadata.py +0 -0
  490. {bashkit-0.4.0 → bashkit-0.5.0}/crates/bashkit-python/tests/test_vfs.py +0 -0
  491. {bashkit-0.4.0 → bashkit-0.5.0}/pyproject.toml +0 -0
@@ -345,7 +345,7 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
345
345
 
346
346
  [[package]]
347
347
  name = "bashkit"
348
- version = "0.4.0"
348
+ version = "0.5.0"
349
349
  dependencies = [
350
350
  "anyhow",
351
351
  "async-trait",
@@ -393,7 +393,7 @@ dependencies = [
393
393
 
394
394
  [[package]]
395
395
  name = "bashkit-bench"
396
- version = "0.4.0"
396
+ version = "0.5.0"
397
397
  dependencies = [
398
398
  "anyhow",
399
399
  "bashkit",
@@ -407,7 +407,7 @@ dependencies = [
407
407
 
408
408
  [[package]]
409
409
  name = "bashkit-cli"
410
- version = "0.4.0"
410
+ version = "0.5.0"
411
411
  dependencies = [
412
412
  "anyhow",
413
413
  "bashkit",
@@ -421,9 +421,20 @@ dependencies = [
421
421
  "tokio",
422
422
  ]
423
423
 
424
+ [[package]]
425
+ name = "bashkit-coreutils-port"
426
+ version = "0.5.0"
427
+ dependencies = [
428
+ "anyhow",
429
+ "prettyplease",
430
+ "proc-macro2",
431
+ "quote",
432
+ "syn",
433
+ ]
434
+
424
435
  [[package]]
425
436
  name = "bashkit-eval"
426
- version = "0.4.0"
437
+ version = "0.5.0"
427
438
  dependencies = [
428
439
  "anyhow",
429
440
  "async-trait",
@@ -440,7 +451,7 @@ dependencies = [
440
451
 
441
452
  [[package]]
442
453
  name = "bashkit-js"
443
- version = "0.4.0"
454
+ version = "0.5.0"
444
455
  dependencies = [
445
456
  "bashkit",
446
457
  "napi",
@@ -453,7 +464,7 @@ dependencies = [
453
464
 
454
465
  [[package]]
455
466
  name = "bashkit-python"
456
- version = "0.4.0"
467
+ version = "0.5.0"
457
468
  dependencies = [
458
469
  "bashkit",
459
470
  "num-bigint",
@@ -7,7 +7,7 @@ resolver = "2"
7
7
  members = ["crates/*"]
8
8
 
9
9
  [workspace.package]
10
- version = "0.4.0"
10
+ version = "0.5.0"
11
11
  edition = "2024"
12
12
  license = "MIT"
13
13
  authors = ["Everruns"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bashkit
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -77,8 +77,9 @@ hmac = "0.13"
77
77
  # Logging/tracing (optional)
78
78
  tracing = { workspace = true, optional = true }
79
79
 
80
- # CLI-style argument parsing for custom builtins.
81
- clap = { workspace = true, optional = true }
80
+ # CLI-style argument parsing for custom builtins and ported coreutils
81
+ # argument surfaces. Always on see specs/coreutils-args-port.md.
82
+ clap = { workspace = true }
82
83
 
83
84
  # Embedded Python interpreter (optional)
84
85
  monty = { git = "https://github.com/pydantic/monty", rev = "49faa4c", optional = true }
@@ -91,9 +92,7 @@ zapcode-core = { version = "1.5", optional = true }
91
92
  turso_core = { workspace = true, optional = true }
92
93
 
93
94
  [features]
94
- default = ["clap-builtins"]
95
- # Enable `ClapBuiltin` for custom builtins with `#[derive(clap::Parser)]`.
96
- clap-builtins = ["dep:clap"]
95
+ default = []
97
96
  # Enable jq builtin via embedded jaq interpreter
98
97
  # Usage: cargo build --features jq
99
98
  jq = ["dep:jaq-core", "dep:jaq-std", "dep:jaq-json"]
@@ -0,0 +1,138 @@
1
+ # Clap Builtins
2
+
3
+ `ClapBuiltin` lets Rust applications define custom Bashkit commands with
4
+ `#[derive(clap::Parser)]` argument structs. Handlers receive a
5
+ `BashkitContext` that captures stdout, stderr, and exit code for the virtual
6
+ shell. `clap` is an unconditional dependency of `bashkit`, so this trait is
7
+ always available.
8
+
9
+ ## Basic Usage
10
+
11
+ ```rust
12
+ use bashkit::clap::Parser;
13
+ use bashkit::{Bash, BashkitContext, ClapBuiltin, async_trait};
14
+
15
+ #[derive(Parser)]
16
+ #[command(name = "greet", about = "Print a greeting")]
17
+ struct GreetArgs {
18
+ #[arg(short, long, default_value = "World")]
19
+ name: String,
20
+
21
+ #[arg(short, long)]
22
+ shout: bool,
23
+ }
24
+
25
+ struct Greet;
26
+
27
+ #[async_trait]
28
+ impl ClapBuiltin for Greet {
29
+ type Args = GreetArgs;
30
+
31
+ async fn execute_clap(
32
+ &self,
33
+ args: Self::Args,
34
+ ctx: &mut BashkitContext<'_>,
35
+ ) -> bashkit::Result<()> {
36
+ let greeting = format!("Hello, {}!", args.name);
37
+ let greeting = if args.shout {
38
+ greeting.to_uppercase()
39
+ } else {
40
+ greeting
41
+ };
42
+ ctx.write_stdout(format!("{greeting}\n"));
43
+ Ok(())
44
+ }
45
+ }
46
+
47
+ #[tokio::main]
48
+ async fn main() -> bashkit::Result<()> {
49
+ let mut bash = Bash::builder().builtin("greet", Box::new(Greet)).build();
50
+
51
+ let result = bash.exec("greet --name Alice --shout").await?;
52
+ assert_eq!(result.stdout, "HELLO, ALICE!\n");
53
+
54
+ let help = bash.exec("greet --help").await?;
55
+ assert_eq!(help.exit_code, 0);
56
+ assert!(help.stdout.contains("Usage: greet"));
57
+ assert!(help.stderr.is_empty());
58
+
59
+ let error = bash.exec("greet --unknown").await?;
60
+ assert_eq!(error.exit_code, 2);
61
+ assert!(error.stderr.contains("unexpected argument"));
62
+ Ok(())
63
+ }
64
+ ```
65
+
66
+ ## Subcommands
67
+
68
+ Use normal clap subcommands for nested command surfaces.
69
+
70
+ ```rust
71
+ use bashkit::clap::{Parser, Subcommand};
72
+ use bashkit::{Bash, BashkitContext, ClapBuiltin, async_trait};
73
+
74
+ #[derive(Parser)]
75
+ #[command(name = "math")]
76
+ struct MathArgs {
77
+ #[command(subcommand)]
78
+ command: MathCommand,
79
+ }
80
+
81
+ #[derive(Subcommand)]
82
+ enum MathCommand {
83
+ Add { left: i64, right: i64 },
84
+ StdinLen,
85
+ }
86
+
87
+ struct Math;
88
+
89
+ #[async_trait]
90
+ impl ClapBuiltin for Math {
91
+ type Args = MathArgs;
92
+
93
+ async fn execute_clap(
94
+ &self,
95
+ args: Self::Args,
96
+ ctx: &mut BashkitContext<'_>,
97
+ ) -> bashkit::Result<()> {
98
+ let value = match args.command {
99
+ MathCommand::Add { left, right } => left + right,
100
+ MathCommand::StdinLen => ctx.stdin().unwrap_or("").len() as i64,
101
+ };
102
+ ctx.write_stdout(format!("{value}\n"));
103
+ Ok(())
104
+ }
105
+ }
106
+
107
+ #[tokio::main]
108
+ async fn main() -> bashkit::Result<()> {
109
+ let mut bash = Bash::builder().builtin("math", Box::new(Math)).build();
110
+
111
+ let sum = bash.exec("math add 20 22").await?;
112
+ assert_eq!(sum.stdout, "42\n");
113
+
114
+ let stdin_len = bash.exec("printf abc | math stdin-len").await?;
115
+ assert_eq!(stdin_len.stdout, "3\n");
116
+ Ok(())
117
+ }
118
+ ```
119
+
120
+ ## Behavior
121
+
122
+ - The clap parser receives only the command arguments, not the shell command
123
+ name from the script.
124
+ - `BashkitContext::write_stdout()` and `write_stderr()` append virtual command
125
+ output; direct `println!`/`eprintln!` writes to the host process instead.
126
+ - Set non-zero command status with `ctx.set_exit_code(code)` or
127
+ `ctx.fail(message, code)`.
128
+ - `--help` and `--version` return exit code `0` with clap output on stdout.
129
+ - Parse failures return clap's exit code, usually `2`, with diagnostics on
130
+ stderr.
131
+ - Diagnostics are capped at 1 KB so custom builtins keep Bashkit's builtin
132
+ error-output safety guarantees.
133
+
134
+ ## See Also
135
+
136
+ - [`crates/bashkit/examples/clap_builtin.rs`](../examples/clap_builtin.rs)
137
+ - [`crates/bashkit/examples/clap_builtin_subcommands.rs`](../examples/clap_builtin_subcommands.rs)
138
+ - [`crates/bashkit/docs/custom_builtins.md`](./custom_builtins.md)
@@ -7,7 +7,7 @@ virtual filesystem.
7
7
 
8
8
  **See also:**
9
9
  - [API Documentation](https://docs.rs/bashkit) - Full API reference
10
- - [Clap Builtins](../../../docs/clap-builtins.md) - Derive parser structs for custom builtin args
10
+ - [Clap Builtins](./clap-builtins.md) - Derive parser structs for custom builtin args
11
11
  - [Hooks](./hooks.md) - Interceptor hooks for the execution pipeline
12
12
  - [Compatibility Reference](./compatibility.md) - Supported bash features
13
13
  - [Threat Model](./threat-model.md) - Security considerations
@@ -156,10 +156,9 @@ Arguments are passed as a slice of strings, excluding the command name itself:
156
156
  let first_arg = ctx.args.first().map(|s| s.as_str()).unwrap_or("default");
157
157
  ```
158
158
 
159
- For custom builtins with richer flags, options, or subcommands, enable the
160
- default `clap-builtins` feature and implement `ClapBuiltin` with a
161
- `#[derive(clap::Parser)]` argument type. See the `clap_builtins_guide` rustdoc
162
- module for tested examples.
159
+ For custom builtins with richer flags, options, or subcommands, implement
160
+ `ClapBuiltin` with a `#[derive(clap::Parser)]` argument type. See the
161
+ `clap_builtins_guide` rustdoc module for tested examples.
163
162
 
164
163
  ### Environment Variables
165
164
 
@@ -0,0 +1,193 @@
1
+ //! cat builtin.
2
+ //!
3
+ //! Argument surface is generated from uutils/coreutils' `uu_app()` via the
4
+ //! `bashkit-coreutils-port` codegen tool — see `generated/cat_args.rs` and
5
+ //! `crates/bashkit-coreutils-port/`. Behaviour is implemented locally
6
+ //! against the bashkit VFS.
7
+
8
+ use async_trait::async_trait;
9
+ use std::ffi::OsString;
10
+ use std::path::Path;
11
+
12
+ use super::generated::cat_args::cat_command;
13
+ use super::{Builtin, Context, read_text_file};
14
+ use crate::error::Result;
15
+ use crate::interpreter::ExecResult;
16
+
17
+ pub struct Cat;
18
+
19
+ #[async_trait]
20
+ impl Builtin for Cat {
21
+ async fn execute(&self, ctx: Context<'_>) -> Result<ExecResult> {
22
+ // clap expects argv[0] = program name; bashkit's ctx.args excludes it.
23
+ let argv: Vec<OsString> = std::iter::once(OsString::from("cat"))
24
+ .chain(ctx.args.iter().map(OsString::from))
25
+ .collect();
26
+
27
+ // GNU coreutils' help layout opens with the usage line; clap's
28
+ // default template leads with the `about`. uutils handles this via
29
+ // uucore's `localized_help_template`, which we drop during codegen
30
+ // because it pulls in Fluent. Re-apply a GNU-equivalent template.
31
+ let cmd = cat_command().help_template("Usage: {usage}\n{about}\n\n{all-args}\n");
32
+ let matches = match cmd.try_get_matches_from(argv) {
33
+ Ok(m) => m,
34
+ Err(e) => {
35
+ let kind = e.kind();
36
+ let rendered = e.render().to_string();
37
+ if matches!(
38
+ kind,
39
+ clap::error::ErrorKind::DisplayHelp | clap::error::ErrorKind::DisplayVersion
40
+ ) {
41
+ return Ok(ExecResult::ok(rendered));
42
+ }
43
+ return Ok(ExecResult::err(rendered, 2));
44
+ }
45
+ };
46
+
47
+ // Composite flags: -A = -vET, -e = -vE, -t = -vT.
48
+ let g = |k: &str| matches.get_flag(k);
49
+ let show_all = g("show-all");
50
+ let number_nonblank = g("number-nonblank");
51
+ let nonprint_ends = g("e");
52
+ let nonprint_tabs = g("t");
53
+ let show_ends = g("show-ends") || show_all || nonprint_ends;
54
+ let show_tabs = g("show-tabs") || show_all || nonprint_tabs;
55
+ let show_nonprinting = g("show-nonprinting") || show_all || nonprint_ends || nonprint_tabs;
56
+ let number_all = g("number") && !number_nonblank;
57
+ let squeeze = g("squeeze-blank");
58
+
59
+ // GNU `cat` reads stdin when FILE is "-" or absent. clap defaults
60
+ // FILE to "-" so absence and "-" are unified.
61
+ let files: Vec<String> = matches
62
+ .get_many::<OsString>("file")
63
+ .map(|vs| vs.map(|v| v.to_string_lossy().into_owned()).collect())
64
+ .unwrap_or_default();
65
+
66
+ let mut raw = String::new();
67
+ for file in &files {
68
+ if file == "-" {
69
+ if let Some(stdin) = ctx.stdin {
70
+ raw.push_str(stdin);
71
+ }
72
+ } else {
73
+ let path = if Path::new(file).is_absolute() {
74
+ file.clone()
75
+ } else {
76
+ ctx.cwd.join(file).to_string_lossy().into_owned()
77
+ };
78
+ match read_text_file(&*ctx.fs, Path::new(&path), "cat").await {
79
+ Ok(t) => raw.push_str(&t),
80
+ Err(e) => return Ok(e),
81
+ }
82
+ }
83
+ }
84
+
85
+ let output = render(
86
+ &raw,
87
+ show_ends,
88
+ show_tabs,
89
+ show_nonprinting,
90
+ number_all,
91
+ number_nonblank,
92
+ squeeze,
93
+ );
94
+ Ok(ExecResult::ok(output))
95
+ }
96
+ }
97
+
98
+ /// Apply cat's display transforms in a single pass.
99
+ ///
100
+ /// One pass because numbering interacts with squeezing — squeezed blank
101
+ /// lines must not be numbered. Two passes mis-number `cat -ns`.
102
+ fn render(
103
+ raw: &str,
104
+ show_ends: bool,
105
+ show_tabs: bool,
106
+ show_nonprinting: bool,
107
+ number_all: bool,
108
+ number_nonblank: bool,
109
+ squeeze: bool,
110
+ ) -> String {
111
+ use std::fmt::Write;
112
+
113
+ let mut out = String::with_capacity(raw.len());
114
+ let mut counter: u64 = 0;
115
+ let mut prev_blank = false;
116
+
117
+ let mut iter = raw.split_inclusive('\n').peekable();
118
+ if iter.peek().is_none() {
119
+ return out;
120
+ }
121
+
122
+ for chunk in iter {
123
+ let (body, sep): (&str, &str) = match chunk.strip_suffix('\n') {
124
+ Some(b) => (b, "\n"),
125
+ None => (chunk, ""),
126
+ };
127
+ let is_blank = body.is_empty();
128
+
129
+ if squeeze && is_blank && prev_blank {
130
+ continue;
131
+ }
132
+ prev_blank = is_blank;
133
+
134
+ if number_all || (number_nonblank && !is_blank) {
135
+ counter += 1;
136
+ let _ = write!(out, "{counter:>6}\t");
137
+ }
138
+
139
+ if show_nonprinting || show_tabs {
140
+ for b in body.bytes() {
141
+ emit_byte(&mut out, b, show_tabs, show_nonprinting);
142
+ }
143
+ } else {
144
+ out.push_str(body);
145
+ }
146
+
147
+ if show_ends && !sep.is_empty() {
148
+ out.push('$');
149
+ }
150
+ out.push_str(sep);
151
+ }
152
+ out
153
+ }
154
+
155
+ /// GNU cat -v style byte rendering.
156
+ ///
157
+ /// - tab (0x09): literal '\t' unless `show_tabs` (then `^I`).
158
+ /// - bytes < 0x20 (other than tab/newline): `^X` (X = byte + 64) when
159
+ /// show_nonprinting; passed through otherwise.
160
+ /// - 0x7F (DEL): `^?`.
161
+ /// - 0x80..=0xFF (high bit set): `M-` prefix + low-7-bit rendered same way.
162
+ fn emit_byte(out: &mut String, b: u8, show_tabs: bool, show_nonprinting: bool) {
163
+ match b {
164
+ b'\t' if show_tabs => {
165
+ out.push('^');
166
+ out.push('I');
167
+ }
168
+ b'\t' => out.push('\t'),
169
+ b'\n' => out.push('\n'),
170
+ 0..=31 if show_nonprinting => {
171
+ out.push('^');
172
+ out.push((b + 64) as char);
173
+ }
174
+ 0x7f if show_nonprinting => {
175
+ out.push('^');
176
+ out.push('?');
177
+ }
178
+ 128..=255 if show_nonprinting => {
179
+ out.push_str("M-");
180
+ let low = b & 0x7f;
181
+ if (0..32).contains(&low) {
182
+ out.push('^');
183
+ out.push((low + 64) as char);
184
+ } else if low == 0x7f {
185
+ out.push('^');
186
+ out.push('?');
187
+ } else {
188
+ out.push(low as char);
189
+ }
190
+ }
191
+ _ => out.push(b as char),
192
+ }
193
+ }
@@ -29,10 +29,10 @@ const BUILTIN_COMMANDS: &[&str] = &[
29
29
  "history", "hostname", "iconv", "id", "jq", "json", "join", "kill", "ln", "local", "log", "ls",
30
30
  "mkdir", "mktemp", "mv", "nl", "od", "paste", "popd", "printenv", "printf", "pushd", "pwd",
31
31
  "read", "readlink", "readonly", "realpath", "retry", "return", "rev", "rm", "rmdir", "sed",
32
- "semver", "seq", "set", "shift", "shopt", "sleep", "sort", "source", "split", "stat",
33
- "strings", "tac", "tail", "tar", "tee", "test", "timeout", "touch", "tr", "tree", "true",
34
- "uname", "unexpand", "uniq", "unset", "wait", "watch", "wc", "wget", "whoami", "xargs", "xxd",
35
- "yes",
32
+ "semver", "seq", "set", "shift", "shopt", "shuf", "sleep", "sort", "source", "split", "stat",
33
+ "strings", "tac", "tail", "tar", "tee", "test", "timeout", "touch", "tr", "tree", "truncate",
34
+ "true", "uname", "unexpand", "uniq", "unset", "wait", "watch", "wc", "wget", "whoami", "xargs",
35
+ "xxd", "yes",
36
36
  ];
37
37
 
38
38
  #[async_trait]
@@ -0,0 +1,132 @@
1
+ // GENERATED by bashkit-coreutils-port. DO NOT EDIT.
2
+ //
3
+ // Source: uutils/coreutils@39364b6 src/uu/cat/
4
+ // Regenerate: cargo run -p bashkit-coreutils-port -- <UUTILS_DIR> cat <REV>
5
+ //
6
+ // Original uutils licensed MIT; see THIRD_PARTY_LICENSES.
7
+
8
+ #![allow(unused_imports, dead_code)]
9
+ use clap::{Arg, ArgAction, Command, builder::ValueParser};
10
+ use std::ffi::OsString;
11
+ use std::ops::RangeInclusive;
12
+ use std::str::FromStr;
13
+ mod options {
14
+ pub static FILE: &str = "file";
15
+ pub static SHOW_ALL: &str = "show-all";
16
+ pub static NUMBER_NONBLANK: &str = "number-nonblank";
17
+ pub static SHOW_NONPRINTING_ENDS: &str = "e";
18
+ pub static SHOW_ENDS: &str = "show-ends";
19
+ pub static NUMBER: &str = "number";
20
+ pub static SQUEEZE_BLANK: &str = "squeeze-blank";
21
+ pub static SHOW_NONPRINTING_TABS: &str = "t";
22
+ pub static SHOW_TABS: &str = "show-tabs";
23
+ pub static SHOW_NONPRINTING: &str = "show-nonprinting";
24
+ pub static IGNORED_U: &str = "ignored-u";
25
+ }
26
+ /// Vendored stand-in for `uucore::format_usage`.
27
+ ///
28
+ /// Upstream wraps the usage line with stylized "Usage:" prefix logic
29
+ /// driven by uucore's locale stack. For our purposes the raw string
30
+ /// is enough; clap's `override_usage` accepts the literal as-is.
31
+ fn format_usage(s: &str) -> String {
32
+ s.to_string()
33
+ }
34
+ pub fn cat_command() -> Command {
35
+ Command::new("cat")
36
+ .version(env!("CARGO_PKG_VERSION"))
37
+ .override_usage(
38
+ format_usage(&::std::string::String::from("cat [OPTION]... [FILE]...")),
39
+ )
40
+ .about(
41
+ ::std::string::String::from(
42
+ "Concatenate FILE(s), or standard input, to standard output\nWith no FILE, or when FILE is -, read standard input.",
43
+ ),
44
+ )
45
+ .infer_long_args(true)
46
+ .args_override_self(true)
47
+ .arg(
48
+ Arg::new(options::FILE)
49
+ .hide(true)
50
+ .action(ArgAction::Append)
51
+ .value_parser(clap::value_parser!(OsString))
52
+ .default_value("-")
53
+ .value_hint(clap::ValueHint::FilePath),
54
+ )
55
+ .arg(
56
+ Arg::new(options::SHOW_ALL)
57
+ .short('A')
58
+ .long(options::SHOW_ALL)
59
+ .help(::std::string::String::from("equivalent to -vET"))
60
+ .action(ArgAction::SetTrue),
61
+ )
62
+ .arg(
63
+ Arg::new(options::NUMBER_NONBLANK)
64
+ .short('b')
65
+ .long(options::NUMBER_NONBLANK)
66
+ .help(
67
+ ::std::string::String::from(
68
+ "number nonempty output lines, overrides -n",
69
+ ),
70
+ )
71
+ .action(ArgAction::SetTrue),
72
+ )
73
+ .arg(
74
+ Arg::new(options::SHOW_NONPRINTING_ENDS)
75
+ .short('e')
76
+ .help(::std::string::String::from("equivalent to -vE"))
77
+ .action(ArgAction::SetTrue),
78
+ )
79
+ .arg(
80
+ Arg::new(options::SHOW_ENDS)
81
+ .short('E')
82
+ .long(options::SHOW_ENDS)
83
+ .help(::std::string::String::from("display $ at end of each line"))
84
+ .action(ArgAction::SetTrue),
85
+ )
86
+ .arg(
87
+ Arg::new(options::NUMBER)
88
+ .short('n')
89
+ .long(options::NUMBER)
90
+ .help(::std::string::String::from("number all output lines"))
91
+ .action(ArgAction::SetTrue),
92
+ )
93
+ .arg(
94
+ Arg::new(options::SQUEEZE_BLANK)
95
+ .short('s')
96
+ .long(options::SQUEEZE_BLANK)
97
+ .help(
98
+ ::std::string::String::from("suppress repeated empty output lines"),
99
+ )
100
+ .action(ArgAction::SetTrue),
101
+ )
102
+ .arg(
103
+ Arg::new(options::SHOW_NONPRINTING_TABS)
104
+ .short('t')
105
+ .help(::std::string::String::from("equivalent to -vT"))
106
+ .action(ArgAction::SetTrue),
107
+ )
108
+ .arg(
109
+ Arg::new(options::SHOW_TABS)
110
+ .short('T')
111
+ .long(options::SHOW_TABS)
112
+ .help(::std::string::String::from("display TAB characters at ^I"))
113
+ .action(ArgAction::SetTrue),
114
+ )
115
+ .arg(
116
+ Arg::new(options::SHOW_NONPRINTING)
117
+ .short('v')
118
+ .long(options::SHOW_NONPRINTING)
119
+ .help(
120
+ ::std::string::String::from(
121
+ "use ^ and M- notation, except for LF (\\n) and TAB (\\t)",
122
+ ),
123
+ )
124
+ .action(ArgAction::SetTrue),
125
+ )
126
+ .arg(
127
+ Arg::new(options::IGNORED_U)
128
+ .short('u')
129
+ .help(::std::string::String::from("(ignored)"))
130
+ .action(ArgAction::SetTrue),
131
+ )
132
+ }
@@ -0,0 +1,34 @@
1
+ // GENERATED MODULE INDEX. Edit individual `*_args.rs` files only via the
2
+ // `bashkit-coreutils-port` codegen tool — see crates/bashkit-coreutils-port.
3
+ //
4
+ // Each `<util>_args.rs` exposes `pub fn <util>_command() -> clap::Command`
5
+ // derived from uutils/coreutils' `uu_app()` definitions, with `translate!()`
6
+ // keys resolved against the corresponding `en-US.ftl`.
7
+
8
+ /// Pinned uutils/coreutils revision used by:
9
+ ///
10
+ /// 1. The `bashkit-coreutils-port` codegen tool (drift workflow checks
11
+ /// out uutils at this rev before regenerating `<util>_args.rs`).
12
+ /// 2. The `coreutils_differential_tests` body-drift harness (drift
13
+ /// workflow builds the `coreutils` multicall from this same rev
14
+ /// before running the harness with `BASHKIT_RUN_COREUTILS_DIFF=1`).
15
+ ///
16
+ /// Single source of truth: when this constant moves, both the args
17
+ /// surfaces and the body-drift gate move with it. Bumping is normally
18
+ /// the work of the auto-PR opened by `coreutils-args-drift.yml`; manual
19
+ /// bumps require regenerating every `<util>_args.rs` file at the new
20
+ /// rev so headers stay aligned with this constant. The static test
21
+ /// `builtins::tests::generated_args_headers_match_pinned_uutils_\
22
+ /// revision` enforces that invariant.
23
+ //
24
+ // The constant is read at port time (codegen, drift workflow, justfile)
25
+ // and at test time (the invariant assertion). Nothing in the lib's
26
+ // runtime path needs it, hence `allow(dead_code)`.
27
+ #[allow(dead_code)]
28
+ pub const UUTILS_REVISION: &str = "39364b6";
29
+
30
+ pub mod cat_args;
31
+ pub mod readlink_args;
32
+ pub mod shuf_args;
33
+ pub mod tac_args;
34
+ pub mod truncate_args;