bashkit 0.3.0__tar.gz → 0.4.1__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 (475) hide show
  1. {bashkit-0.3.0 → bashkit-0.4.1}/Cargo.lock +20 -9
  2. {bashkit-0.3.0 → bashkit-0.4.1}/Cargo.toml +1 -1
  3. {bashkit-0.3.0 → bashkit-0.4.1}/PKG-INFO +1 -1
  4. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/Cargo.toml +12 -2
  5. bashkit-0.4.1/crates/bashkit/benches/sqlite.rs +424 -0
  6. bashkit-0.4.1/crates/bashkit/docs/clap-builtins.md +151 -0
  7. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/custom_builtins.md +39 -0
  8. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/threat-model.md +38 -0
  9. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/typescript.md +10 -0
  10. bashkit-0.4.1/crates/bashkit/examples/clap_builtin.rs +54 -0
  11. bashkit-0.4.1/crates/bashkit/examples/clap_builtin_subcommands.rs +63 -0
  12. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/mod.rs +240 -1
  13. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/python.rs +5 -5
  14. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/sqlite/mod.rs +158 -73
  15. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/sqlite/parser.rs +107 -17
  16. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/sqlite/tests.rs +38 -3
  17. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/sqlite/vfs_io.rs +26 -22
  18. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/typescript.rs +89 -1
  19. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/lib.rs +93 -43
  20. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/scripted_tool/execute.rs +27 -481
  21. bashkit-0.4.1/crates/bashkit/src/scripted_tool/extension.rs +552 -0
  22. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/scripted_tool/mod.rs +32 -0
  23. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/tool.rs +150 -2
  24. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/custom_builtins_tests.rs +133 -0
  25. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/python_integration_tests.rs +1 -1
  26. bashkit-0.4.1/crates/bashkit/tests/sqlite_differential_tests.rs +331 -0
  27. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/sqlite_integration_tests.rs +98 -0
  28. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/ssh_supabase_tests.rs +18 -7
  29. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/threat_model_tests.rs +8 -8
  30. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/typescript_security_tests.rs +16 -1
  31. {bashkit-0.3.0 → bashkit-0.4.1}/README.md +0 -0
  32. {bashkit-0.3.0 → bashkit-0.4.1}/bashkit/__init__.py +0 -0
  33. {bashkit-0.3.0 → bashkit-0.4.1}/bashkit/_bashkit.pyi +0 -0
  34. {bashkit-0.3.0 → bashkit-0.4.1}/bashkit/deepagents.py +0 -0
  35. {bashkit-0.3.0 → bashkit-0.4.1}/bashkit/langchain.py +0 -0
  36. {bashkit-0.3.0 → bashkit-0.4.1}/bashkit/py.typed +0 -0
  37. {bashkit-0.3.0 → bashkit-0.4.1}/bashkit/pydantic_ai.py +0 -0
  38. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/README.md +0 -0
  39. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/benches/parallel_execution.rs +0 -0
  40. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/compatibility.md +0 -0
  41. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/credential-injection.md +0 -0
  42. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/hooks.md +0 -0
  43. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/jq.md +0 -0
  44. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/live_mounts.md +0 -0
  45. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/logging.md +0 -0
  46. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/python.md +0 -0
  47. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/sqlite.md +0 -0
  48. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/docs/ssh.md +0 -0
  49. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/agent_tool.rs +0 -0
  50. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/basic.rs +0 -0
  51. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/custom_backend.rs +0 -0
  52. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/custom_builtins.rs +0 -0
  53. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/custom_filesystem_impl.rs +0 -0
  54. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/custom_fs.rs +0 -0
  55. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/git_workflow.rs +0 -0
  56. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/live_mounts.rs +0 -0
  57. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/python_external_functions.rs +0 -0
  58. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/python_scripts.rs +0 -0
  59. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/realfs_readonly.rs +0 -0
  60. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/realfs_readwrite.rs +0 -0
  61. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/resource_limits.rs +0 -0
  62. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/scripted_tool.rs +0 -0
  63. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/show_tool_output.rs +0 -0
  64. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/sqlite_basic.rs +0 -0
  65. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/sqlite_workflow.rs +0 -0
  66. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/ssh_supabase.rs +0 -0
  67. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/streaming_output.rs +0 -0
  68. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/text_files.rs +0 -0
  69. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/text_processing.rs +0 -0
  70. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/typescript_external_functions.rs +0 -0
  71. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/typescript_scripts.rs +0 -0
  72. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/examples/virtual_identity.rs +0 -0
  73. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/proptest-regressions/builtins/sqlite/tests.txt +0 -0
  74. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/alias.rs +0 -0
  75. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/archive.rs +0 -0
  76. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/arg_parser.rs +0 -0
  77. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/assert.rs +0 -0
  78. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/awk.rs +0 -0
  79. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/base64.rs +0 -0
  80. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/bc.rs +0 -0
  81. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/caller.rs +0 -0
  82. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/cat.rs +0 -0
  83. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/checksum.rs +0 -0
  84. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/clear.rs +0 -0
  85. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/column.rs +0 -0
  86. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/comm.rs +0 -0
  87. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/compgen.rs +0 -0
  88. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/csv.rs +0 -0
  89. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/curl.rs +0 -0
  90. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/cuttr.rs +0 -0
  91. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/date.rs +0 -0
  92. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/diff.rs +0 -0
  93. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/dirstack.rs +0 -0
  94. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/disk.rs +0 -0
  95. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/dotenv.rs +0 -0
  96. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/echo.rs +0 -0
  97. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/environ.rs +0 -0
  98. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/envsubst.rs +0 -0
  99. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/expand.rs +0 -0
  100. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/export.rs +0 -0
  101. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/expr.rs +0 -0
  102. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/fc.rs +0 -0
  103. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/fileops.rs +0 -0
  104. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/flow.rs +0 -0
  105. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/fold.rs +0 -0
  106. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/git/client.rs +0 -0
  107. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/git/cmd.rs +0 -0
  108. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/git/config.rs +0 -0
  109. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/git/mod.rs +0 -0
  110. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/glob_cmd.rs +0 -0
  111. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/grep.rs +0 -0
  112. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/headtail.rs +0 -0
  113. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/help.rs +0 -0
  114. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/hextools.rs +0 -0
  115. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/http.rs +0 -0
  116. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/iconv.rs +0 -0
  117. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/inspect.rs +0 -0
  118. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/introspect.rs +0 -0
  119. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/join.rs +0 -0
  120. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/jq/args.rs +0 -0
  121. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/jq/compat.rs +0 -0
  122. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/jq/convert.rs +0 -0
  123. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/jq/errors.rs +0 -0
  124. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/jq/format.rs +0 -0
  125. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/jq/mod.rs +0 -0
  126. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/jq/regex_compat.rs +0 -0
  127. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/jq/tests.rs +0 -0
  128. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/json.rs +0 -0
  129. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/log.rs +0 -0
  130. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/ls.rs +0 -0
  131. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/mapfile.rs +0 -0
  132. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/mkfifo.rs +0 -0
  133. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/navigation.rs +0 -0
  134. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/nl.rs +0 -0
  135. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/numfmt.rs +0 -0
  136. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/parallel.rs +0 -0
  137. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/paste.rs +0 -0
  138. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/patch.rs +0 -0
  139. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/path.rs +0 -0
  140. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/pipeline.rs +0 -0
  141. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/printf.rs +0 -0
  142. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/read.rs +0 -0
  143. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/retry.rs +0 -0
  144. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/rg.rs +0 -0
  145. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/search_common.rs +0 -0
  146. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/sed.rs +0 -0
  147. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/semver.rs +0 -0
  148. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/seq.rs +0 -0
  149. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/sleep.rs +0 -0
  150. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/sortuniq.rs +0 -0
  151. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/source.rs +0 -0
  152. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/split.rs +0 -0
  153. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/sqlite/dot_commands.rs +0 -0
  154. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/sqlite/engine.rs +0 -0
  155. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/sqlite/formatter.rs +0 -0
  156. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/ssh/allowlist.rs +0 -0
  157. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/ssh/client.rs +0 -0
  158. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/ssh/cmd.rs +0 -0
  159. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/ssh/config.rs +0 -0
  160. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/ssh/handler.rs +0 -0
  161. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/ssh/mod.rs +0 -0
  162. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/ssh/russh_handler.rs +0 -0
  163. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/strings.rs +0 -0
  164. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/system.rs +0 -0
  165. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/template.rs +0 -0
  166. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/test.rs +0 -0
  167. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/textrev.rs +0 -0
  168. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/timeout.rs +0 -0
  169. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/tomlq.rs +0 -0
  170. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/trap.rs +0 -0
  171. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/tree.rs +0 -0
  172. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/vars.rs +0 -0
  173. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/verify.rs +0 -0
  174. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/wait.rs +0 -0
  175. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/wc.rs +0 -0
  176. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/yaml.rs +0 -0
  177. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/yes.rs +0 -0
  178. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/builtins/zip_cmd.rs +0 -0
  179. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/credential.rs +0 -0
  180. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/error.rs +0 -0
  181. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/fs/backend.rs +0 -0
  182. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/fs/limits.rs +0 -0
  183. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/fs/memory.rs +0 -0
  184. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/fs/mod.rs +0 -0
  185. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/fs/mountable.rs +0 -0
  186. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/fs/overlay.rs +0 -0
  187. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/fs/posix.rs +0 -0
  188. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/fs/realfs.rs +0 -0
  189. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/fs/search.rs +0 -0
  190. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/fs/traits.rs +0 -0
  191. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/hooks.rs +0 -0
  192. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/interop/fs.rs +0 -0
  193. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/interop/mod.rs +0 -0
  194. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/interpreter/glob.rs +0 -0
  195. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/interpreter/jobs.rs +0 -0
  196. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/interpreter/mod.rs +0 -0
  197. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/interpreter/state.rs +0 -0
  198. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/limits.rs +0 -0
  199. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/logging_impl.rs +0 -0
  200. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/network/allowlist.rs +0 -0
  201. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/network/bot_auth.rs +0 -0
  202. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/network/client.rs +0 -0
  203. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/network/mod.rs +0 -0
  204. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/parser/ast.rs +0 -0
  205. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/parser/budget.rs +0 -0
  206. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/parser/lexer.rs +0 -0
  207. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/parser/mod.rs +0 -0
  208. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/parser/span.rs +0 -0
  209. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/parser/tokens.rs +0 -0
  210. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/scripted_tool/toolset.rs +0 -0
  211. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/snapshot.rs +0 -0
  212. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/testing.rs +0 -0
  213. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/tool_def.rs +0 -0
  214. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/src/trace.rs +0 -0
  215. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/allexport_tests.rs +0 -0
  216. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/awk_fuzz_scaffold_tests.rs +0 -0
  217. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/awk_newline_tests.rs +0 -0
  218. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/awk_pattern_tests.rs +0 -0
  219. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/awk_printf_expr_test.rs +0 -0
  220. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/awk_range_pattern_tests.rs +0 -0
  221. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/background_exec_tests.rs +0 -0
  222. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/bash_source_tests.rs +0 -0
  223. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/blackbox_security_tests.rs +0 -0
  224. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/builtin_error_security_tests.rs +0 -0
  225. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/byte_range_panic_tests.rs +0 -0
  226. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/cancellation_tests.rs +0 -0
  227. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/cmdsub_quote_test.rs +0 -0
  228. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/coproc_tests.rs +0 -0
  229. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/credential_injection_tests.rs +0 -0
  230. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/custom_fs_tests.rs +0 -0
  231. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/dev_null_tests.rs +0 -0
  232. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/final_env_tests.rs +0 -0
  233. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/find_multi_path_tests.rs +0 -0
  234. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/git_advanced_tests.rs +0 -0
  235. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/git_inspection_tests.rs +0 -0
  236. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/git_integration_tests.rs +0 -0
  237. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/git_remote_security_tests.rs +0 -0
  238. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/git_security_tests.rs +0 -0
  239. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/harness_example_tests.rs +0 -0
  240. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/history_tests.rs +0 -0
  241. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_1175_test.rs +0 -0
  242. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_274_test.rs +0 -0
  243. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_275_279_282_test.rs +0 -0
  244. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_276_test.rs +0 -0
  245. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_277_test.rs +0 -0
  246. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_289_test.rs +0 -0
  247. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_290_test.rs +0 -0
  248. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_291_test.rs +0 -0
  249. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_853_test.rs +0 -0
  250. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_872_test.rs +0 -0
  251. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_873_test.rs +0 -0
  252. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/issue_875_test.rs +0 -0
  253. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/jq_fuzz_scaffold_tests.rs +0 -0
  254. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/live_mount_tests.rs +0 -0
  255. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/logging_security_tests.rs +0 -0
  256. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/mkfifo_tests.rs +0 -0
  257. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/nested_subscript_tests.rs +0 -0
  258. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/network_security_tests.rs +0 -0
  259. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/output_truncation_tests.rs +0 -0
  260. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/overlay_path_validation_tests.rs +0 -0
  261. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/proptest_differential.rs +0 -0
  262. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/proptest_security.rs +0 -0
  263. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/python_security_tests.rs +0 -0
  264. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/realfs_tests.rs +0 -0
  265. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/regex_limit_tests.rs +0 -0
  266. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/release_profile_tests.rs +0 -0
  267. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/script_execution_tests.rs +0 -0
  268. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/security_audit_pocs.rs +0 -0
  269. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/security_failpoint_tests.rs +0 -0
  270. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/set_e_and_or_tests.rs +0 -0
  271. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_fixtures/azure_discover_rank.sh +0 -0
  272. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_fixtures/azure_generate_url.sh +0 -0
  273. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_fixtures/azure_query_capacity.sh +0 -0
  274. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_fixtures/helm_validate_chart.sh +0 -0
  275. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_fixtures/jwt_test_setup.sh +0 -0
  276. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_fixtures/stitch_download_asset.sh +0 -0
  277. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_fixtures/stitch_fetch.sh +0 -0
  278. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_fixtures/stitch_verify_setup.sh +0 -0
  279. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_fixtures/superpowers_find_polluter.sh +0 -0
  280. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_fixtures/vercel_deploy.sh +0 -0
  281. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/skills_tests.rs +0 -0
  282. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/snapshot_tests.rs +0 -0
  283. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/source_function_tests.rs +0 -0
  284. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/awk/awk.test.sh +0 -0
  285. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/awk/delete-array.test.sh +0 -0
  286. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/awk/dev-stderr.test.sh +0 -0
  287. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/awk/eval-bugs.test.sh +0 -0
  288. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/awk/filename.test.sh +0 -0
  289. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/awk/getline-file.test.sh +0 -0
  290. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/alias.test.sh +0 -0
  291. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/append_redirect.test.sh +0 -0
  292. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/arith-dynamic.test.sh +0 -0
  293. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/arithmetic-base-expansion.test.sh +0 -0
  294. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/arithmetic.test.sh +0 -0
  295. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/array-slicing.test.sh +0 -0
  296. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/array-splat.test.sh +0 -0
  297. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/arrays.test.sh +0 -0
  298. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh +0 -0
  299. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/awk-printf-width.test.sh +0 -0
  300. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/background.test.sh +0 -0
  301. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/bash-c-exports.test.sh +0 -0
  302. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/bash-command.test.sh +0 -0
  303. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/bash-flags.test.sh +0 -0
  304. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/bash-source-var.test.sh +0 -0
  305. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/bash-stdin-pipe.test.sh +0 -0
  306. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/bc.test.sh +0 -0
  307. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/blackbox-edge-cases.test.sh +0 -0
  308. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/blackbox-exploration.test.sh +0 -0
  309. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/brace-expansion.test.sh +0 -0
  310. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/brace_expansion_lookahead.test.sh +0 -0
  311. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/checksum.test.sh +0 -0
  312. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/chown-kill.test.sh +0 -0
  313. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/cmd-suggestions.test.sh +0 -0
  314. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/cmdsub_depth_unquoted.test.sh +0 -0
  315. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/column.test.sh +0 -0
  316. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/comm.test.sh +0 -0
  317. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/command-not-found.test.sh +0 -0
  318. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/command-subst.test.sh +0 -0
  319. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/command.test.sh +0 -0
  320. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/command_v.test.sh +0 -0
  321. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/compgen-path.test.sh +0 -0
  322. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/conditional-short-circuit.test.sh +0 -0
  323. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/conditional.test.sh +0 -0
  324. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/control-flow.test.sh +0 -0
  325. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/cuttr.test.sh +0 -0
  326. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/date.test.sh +0 -0
  327. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/declare.test.sh +0 -0
  328. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/df.test.sh +0 -0
  329. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/diff.test.sh +0 -0
  330. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/dirstack.test.sh +0 -0
  331. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/du.test.sh +0 -0
  332. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/echo.test.sh +0 -0
  333. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/empty-bodies.test.sh +0 -0
  334. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/env.test.sh +0 -0
  335. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/errexit.test.sh +0 -0
  336. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/eval-bugs.test.sh +0 -0
  337. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/exec-command.test.sh +0 -0
  338. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/exec-fd-redirect.test.sh +0 -0
  339. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/exec-fd-variable.test.sh +0 -0
  340. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/exit-status.test.sh +0 -0
  341. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/expr.test.sh +0 -0
  342. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/extglob.test.sh +0 -0
  343. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/file.test.sh +0 -0
  344. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/fileops.test.sh +0 -0
  345. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/find.test.sh +0 -0
  346. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/functions.test.sh +0 -0
  347. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/getopts.test.sh +0 -0
  348. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/glob-options.test.sh +0 -0
  349. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/glob_match_cap.test.sh +0 -0
  350. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/globs.test.sh +0 -0
  351. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/gzip.test.sh +0 -0
  352. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/headtail.test.sh +0 -0
  353. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/help-flag.test.sh +0 -0
  354. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/heredoc-edge.test.sh +0 -0
  355. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/heredoc.test.sh +0 -0
  356. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/herestring.test.sh +0 -0
  357. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/hextools.test.sh +0 -0
  358. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/history.test.sh +0 -0
  359. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/indirect-expansion.test.sh +0 -0
  360. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/less.test.sh +0 -0
  361. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/ln.test.sh +0 -0
  362. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/ls.test.sh +0 -0
  363. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/memory_budget_desync.test.sh +0 -0
  364. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +0 -0
  365. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/nameref.test.sh +0 -0
  366. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/negative-tests.test.sh +0 -0
  367. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/nl.test.sh +0 -0
  368. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/nounset.test.sh +0 -0
  369. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/numfmt.test.sh +0 -0
  370. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/parse-errors.test.sh +0 -0
  371. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/paste-flags.test.sh +0 -0
  372. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/paste.test.sh +0 -0
  373. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/path.test.sh +0 -0
  374. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/pipes-redirects.test.sh +0 -0
  375. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/printenv.test.sh +0 -0
  376. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/printf.test.sh +0 -0
  377. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/procsub.test.sh +0 -0
  378. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/quote.test.sh +0 -0
  379. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/read-builtin.test.sh +0 -0
  380. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/recursive-cmdsub.test.sh +0 -0
  381. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/regex-limit.test.sh +0 -0
  382. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/replace_pattern_limit.test.sh +0 -0
  383. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/script-exec.test.sh +0 -0
  384. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/seq.test.sh +0 -0
  385. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/set-allexport.test.sh +0 -0
  386. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/shell-grammar.test.sh +0 -0
  387. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/sleep.test.sh +0 -0
  388. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/sortuniq.test.sh +0 -0
  389. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/source.test.sh +0 -0
  390. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/stat.test.sh +0 -0
  391. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/string-ops.test.sh +0 -0
  392. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/strings.test.sh +0 -0
  393. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/subprocess-isolation.test.sh +0 -0
  394. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/subshell.test.sh +0 -0
  395. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/tar.test.sh +0 -0
  396. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/tar_create.test.sh +0 -0
  397. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/tee.test.sh +0 -0
  398. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/temp-binding.test.sh +0 -0
  399. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/test-operators.test.sh +0 -0
  400. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/test-tty.test.sh +0 -0
  401. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/textrev.test.sh +0 -0
  402. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/time.test.sh +0 -0
  403. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/timeout.test.sh +0 -0
  404. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/tree.test.sh +0 -0
  405. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/type.test.sh +0 -0
  406. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/unicode.test.sh +0 -0
  407. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/unset-exported-var.test.sh +0 -0
  408. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/var-op-test.test.sh +0 -0
  409. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/variables.test.sh +0 -0
  410. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/wait.test.sh +0 -0
  411. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/watch.test.sh +0 -0
  412. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/wc.test.sh +0 -0
  413. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/word-split.test.sh +0 -0
  414. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/bash/xargs.test.sh +0 -0
  415. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/grep/eval-bugs.test.sh +0 -0
  416. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/grep/grep.test.sh +0 -0
  417. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/grep/rg.test.sh +0 -0
  418. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/jq/jq.test.sh +0 -0
  419. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/python/env_leak.test.sh +0 -0
  420. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/python/python.test.sh +0 -0
  421. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/sed/eval-bugs.test.sh +0 -0
  422. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/sed/sed.test.sh +0 -0
  423. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_cases/typescript/typescript.test.sh +0 -0
  424. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_runner.rs +0 -0
  425. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/spec_tests.rs +0 -0
  426. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/sqlite_compat_tests.rs +0 -0
  427. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/sqlite_fuzz_tests.rs +0 -0
  428. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/sqlite_security_tests.rs +0 -0
  429. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/ssh_builtin_tests.rs +0 -0
  430. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/stack_overflow_regression_tests.rs +0 -0
  431. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/subst_depth_limit_tests.rs +0 -0
  432. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/symlink_overlay_security_tests.rs +0 -0
  433. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/tty_tests.rs +0 -0
  434. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/typescript_integration_tests.rs +0 -0
  435. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/unicode_security_tests.rs +0 -0
  436. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/unset_function_tests.rs +0 -0
  437. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit/tests/urandom_tests.rs +0 -0
  438. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/Cargo.toml +0 -0
  439. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/README.md +0 -0
  440. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/examples/bash_basics.py +0 -0
  441. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/examples/custom_filesystem_interop.py +0 -0
  442. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/examples/data_pipeline.py +0 -0
  443. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/examples/fastapi_async_tool.py +0 -0
  444. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/examples/jupyter_async_test.ipynb +0 -0
  445. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/examples/k8s_orchestrator.py +0 -0
  446. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/examples/langgraph_async_tool.py +0 -0
  447. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/examples/llm_tool.py +0 -0
  448. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/src/lib.rs +0 -0
  449. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/_bashkit_categories.py +0 -0
  450. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/_security_advanced.py +0 -0
  451. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/_security_core.py +0 -0
  452. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_ai_adapters.py +0 -0
  453. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_async_callbacks.py +0 -0
  454. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_basic.py +0 -0
  455. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_builtins.py +0 -0
  456. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_control_flow.py +0 -0
  457. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_error_handling.py +0 -0
  458. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_fastapi_integration.py +0 -0
  459. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_filesystem_interop.py +0 -0
  460. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_integration.py +0 -0
  461. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_jupyter_compat.py +0 -0
  462. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_langgraph_integration.py +0 -0
  463. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_network_config.py +0 -0
  464. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_network_credentials.py +0 -0
  465. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_python_security.py +0 -0
  466. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_registered_tools.py +0 -0
  467. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_scripts.py +0 -0
  468. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_security.py +0 -0
  469. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_shell_injection.py +0 -0
  470. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_sqlite.py +0 -0
  471. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_streaming_output.py +0 -0
  472. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_strings_and_quoting.py +0 -0
  473. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_tool_metadata.py +0 -0
  474. {bashkit-0.3.0 → bashkit-0.4.1}/crates/bashkit-python/tests/test_vfs.py +0 -0
  475. {bashkit-0.3.0 → bashkit-0.4.1}/pyproject.toml +0 -0
@@ -345,12 +345,13 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
345
345
 
346
346
  [[package]]
347
347
  name = "bashkit"
348
- version = "0.3.0"
348
+ version = "0.4.1"
349
349
  dependencies = [
350
350
  "anyhow",
351
351
  "async-trait",
352
352
  "base64",
353
353
  "chrono",
354
+ "clap",
354
355
  "criterion",
355
356
  "ed25519-dalek 2.2.0",
356
357
  "fail",
@@ -392,7 +393,7 @@ dependencies = [
392
393
 
393
394
  [[package]]
394
395
  name = "bashkit-bench"
395
- version = "0.3.0"
396
+ version = "0.4.1"
396
397
  dependencies = [
397
398
  "anyhow",
398
399
  "bashkit",
@@ -406,7 +407,7 @@ dependencies = [
406
407
 
407
408
  [[package]]
408
409
  name = "bashkit-cli"
409
- version = "0.3.0"
410
+ version = "0.4.1"
410
411
  dependencies = [
411
412
  "anyhow",
412
413
  "bashkit",
@@ -422,7 +423,7 @@ dependencies = [
422
423
 
423
424
  [[package]]
424
425
  name = "bashkit-eval"
425
- version = "0.3.0"
426
+ version = "0.4.1"
426
427
  dependencies = [
427
428
  "anyhow",
428
429
  "async-trait",
@@ -439,7 +440,7 @@ dependencies = [
439
440
 
440
441
  [[package]]
441
442
  name = "bashkit-js"
442
- version = "0.3.0"
443
+ version = "0.4.1"
443
444
  dependencies = [
444
445
  "bashkit",
445
446
  "napi",
@@ -452,7 +453,7 @@ dependencies = [
452
453
 
453
454
  [[package]]
454
455
  name = "bashkit-python"
455
- version = "0.3.0"
456
+ version = "0.4.1"
456
457
  dependencies = [
457
458
  "bashkit",
458
459
  "num-bigint",
@@ -2811,8 +2812,8 @@ dependencies = [
2811
2812
 
2812
2813
  [[package]]
2813
2814
  name = "monty"
2814
- version = "0.0.11"
2815
- source = "git+https://github.com/pydantic/monty?rev=2e9df4b#2e9df4b508e8a9ac80f3a6a26ed680242d1f460d"
2815
+ version = "0.0.17"
2816
+ source = "git+https://github.com/pydantic/monty?rev=49faa4c#49faa4c8ae94490eae286e76259adcc35f64f0a5"
2816
2817
  dependencies = [
2817
2818
  "ahash",
2818
2819
  "bytemuck",
@@ -2827,11 +2828,12 @@ dependencies = [
2827
2828
  "num-integer",
2828
2829
  "num-traits",
2829
2830
  "postcard",
2830
- "pyo3-build-config",
2831
2831
  "ruff_python_ast",
2832
2832
  "ruff_python_parser",
2833
+ "ruff_python_stdlib",
2833
2834
  "ruff_text_size",
2834
2835
  "serde",
2836
+ "serde_json",
2835
2837
  "smallvec",
2836
2838
  "speedate",
2837
2839
  "strum 0.27.2",
@@ -4246,6 +4248,15 @@ dependencies = [
4246
4248
  "unicode_names2",
4247
4249
  ]
4248
4250
 
4251
+ [[package]]
4252
+ name = "ruff_python_stdlib"
4253
+ version = "0.0.0"
4254
+ source = "git+https://github.com/astral-sh/ruff.git?rev=6ded4bed1651e30b34dd04cdaa50c763036abb0d#6ded4bed1651e30b34dd04cdaa50c763036abb0d"
4255
+ dependencies = [
4256
+ "bitflags",
4257
+ "unicode-ident",
4258
+ ]
4259
+
4249
4260
  [[package]]
4250
4261
  name = "ruff_python_trivia"
4251
4262
  version = "0.0.0"
@@ -7,7 +7,7 @@ resolver = "2"
7
7
  members = ["crates/*"]
8
8
 
9
9
  [workspace.package]
10
- version = "0.3.0"
10
+ version = "0.4.1"
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.3.0
3
+ Version: 0.4.1
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -77,8 +77,11 @@ 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 }
82
+
80
83
  # Embedded Python interpreter (optional)
81
- monty = { git = "https://github.com/pydantic/monty", rev = "2e9df4b", optional = true }
84
+ monty = { git = "https://github.com/pydantic/monty", rev = "49faa4c", optional = true }
82
85
 
83
86
  # Embedded TypeScript interpreter (optional)
84
87
  zapcode-core = { version = "1.5", optional = true }
@@ -88,7 +91,9 @@ zapcode-core = { version = "1.5", optional = true }
88
91
  turso_core = { workspace = true, optional = true }
89
92
 
90
93
  [features]
91
- default = []
94
+ default = ["clap-builtins"]
95
+ # Enable `ClapBuiltin` for custom builtins with `#[derive(clap::Parser)]`.
96
+ clap-builtins = ["dep:clap"]
92
97
  # Enable jq builtin via embedded jaq interpreter
93
98
  # Usage: cargo build --features jq
94
99
  jq = ["dep:jaq-core", "dep:jaq-std", "dep:jaq-json"]
@@ -153,6 +158,11 @@ serial_test = { workspace = true }
153
158
  name = "parallel_execution"
154
159
  harness = false
155
160
 
161
+ [[bench]]
162
+ name = "sqlite"
163
+ harness = false
164
+ required-features = ["sqlite"]
165
+
156
166
  [[example]]
157
167
  name = "agent_tool"
158
168
  required-features = ["http_client"]
@@ -0,0 +1,424 @@
1
+ //! SQLite builtin benchmark for Bashkit
2
+ //!
3
+ //! Targets the `sqlite` builtin (Turso, in-process) along the dimensions
4
+ //! that actually matter for users:
5
+ //!
6
+ //! - **Workload shapes**: bulk INSERT, batched UPDATE, indexed vs full-scan
7
+ //! SELECT, aggregate (GROUP BY + COUNT/SUM/AVG).
8
+ //! - **Output modes**: list (default), CSV, JSON, markdown — exercise the
9
+ //! formatter on the same row set.
10
+ //! - **Backends**: `Memory` (load whole DB into turso's `MemoryIO`) vs `Vfs`
11
+ //! (custom IO trait talking to bashkit's FileSystem).
12
+ //! - **Persistence cost**: opening a fresh DB per invocation (load + flush)
13
+ //! vs `:memory:` (zero VFS round-trip).
14
+ //! - **Concurrency**: N parallel sqlite sessions over a shared VFS, each
15
+ //! with its own DB file — measures the cooperative-IO path under load.
16
+ //!
17
+ //! Each bench prints a single-row sentinel so successful execution can be
18
+ //! eyeballed in `cargo bench` output without parsing Criterion JSON.
19
+
20
+ use bashkit::{Bash, FileSystem, InMemoryFs, SqliteBackend, SqliteLimits};
21
+ use criterion::{BenchmarkId, Criterion, Throughput, criterion_group, criterion_main};
22
+ use std::sync::Arc;
23
+ use tokio::runtime::Runtime;
24
+
25
+ /// Row counts to exercise scaling. Kept modest so a full `cargo bench` run
26
+ /// finishes in reasonable time on CI hardware; tune up locally if you need
27
+ /// more signal.
28
+ const ROW_COUNTS: &[usize] = &[100, 1_000, 10_000];
29
+
30
+ /// Concurrency levels for the parallel-sessions group.
31
+ const SESSION_COUNTS: &[usize] = &[4, 16, 64];
32
+
33
+ /// Build a Bash with sqlite enabled and the opt-in env set. Optionally
34
+ /// share a filesystem so multiple sessions hit the same VFS.
35
+ fn make_bash(backend: SqliteBackend, fs: Option<Arc<dyn FileSystem>>) -> Bash {
36
+ let mut builder = Bash::builder()
37
+ .sqlite_with_limits(
38
+ SqliteLimits::default()
39
+ .backend(backend)
40
+ // Lift caps so large-N benches don't trip the defaults.
41
+ .max_rows_per_query(1_000_000)
42
+ .max_statements(1_000_000)
43
+ .max_script_bytes(64 * 1024 * 1024),
44
+ )
45
+ .env("BASHKIT_ALLOW_INPROCESS_SQLITE", "1");
46
+ if let Some(fs) = fs {
47
+ builder = builder.fs(fs);
48
+ }
49
+ builder.build()
50
+ }
51
+
52
+ /// SQL that seeds a `kv(id, k, v)` table with `n` rows using a recursive CTE.
53
+ /// Faster than emitting `n` literal `INSERT` statements through the parser.
54
+ fn seed_kv_sql(n: usize) -> String {
55
+ format!(
56
+ r#"
57
+ CREATE TABLE IF NOT EXISTS kv(id INTEGER PRIMARY KEY, k TEXT, v INTEGER);
58
+ WITH RECURSIVE seq(i) AS (
59
+ SELECT 1 UNION ALL SELECT i+1 FROM seq WHERE i < {n}
60
+ )
61
+ INSERT INTO kv(k, v) SELECT 'key' || i, i*7 % 113 FROM seq;
62
+ "#
63
+ )
64
+ }
65
+
66
+ // ---------------------------------------------------------------------------
67
+ // Workload helpers (each takes a fresh Bash, runs the workload, returns).
68
+ // ---------------------------------------------------------------------------
69
+
70
+ async fn bench_insert(backend: SqliteBackend, n: usize) {
71
+ let mut bash = make_bash(backend, None);
72
+ let script = format!(
73
+ "sqlite /tmp/bench.sqlite \"{}; SELECT count(*) FROM kv\"",
74
+ seed_kv_sql(n).replace('"', "\\\"")
75
+ );
76
+ let _ = bash.exec(&script).await;
77
+ }
78
+
79
+ async fn bench_update(backend: SqliteBackend, n: usize) {
80
+ let mut bash = make_bash(backend, None);
81
+ let setup = seed_kv_sql(n).replace('"', "\\\"");
82
+ let script = format!(
83
+ "sqlite /tmp/bench.sqlite \"{setup}; UPDATE kv SET v = v + 1 WHERE k LIKE 'key1%'; SELECT changes()\""
84
+ );
85
+ let _ = bash.exec(&script).await;
86
+ }
87
+
88
+ async fn bench_index_create_and_query(backend: SqliteBackend, n: usize) {
89
+ let mut bash = make_bash(backend, None);
90
+ let setup = seed_kv_sql(n).replace('"', "\\\"");
91
+ // Without index → with index → repeat the same point-query, measuring
92
+ // the combined "schema change + indexed lookup" path. The point-query
93
+ // alone is benched in `bench_query_indexed` below.
94
+ let script = format!(
95
+ "sqlite /tmp/bench.sqlite \"{setup}; CREATE INDEX IF NOT EXISTS idx_kv_k ON kv(k); SELECT v FROM kv WHERE k = 'key42'\""
96
+ );
97
+ let _ = bash.exec(&script).await;
98
+ }
99
+
100
+ async fn bench_query_indexed(backend: SqliteBackend, n: usize) {
101
+ let mut bash = make_bash(backend, None);
102
+ let setup = seed_kv_sql(n).replace('"', "\\\"");
103
+ let script = format!(
104
+ "sqlite /tmp/bench.sqlite \"{setup}; CREATE INDEX idx_kv_k ON kv(k); SELECT count(*) FROM kv WHERE k IN ('key1','key100','key1000','key9999')\""
105
+ );
106
+ let _ = bash.exec(&script).await;
107
+ }
108
+
109
+ async fn bench_query_full_scan(backend: SqliteBackend, n: usize) {
110
+ let mut bash = make_bash(backend, None);
111
+ let setup = seed_kv_sql(n).replace('"', "\\\"");
112
+ // No index → forces a full scan with a LIKE predicate that the planner
113
+ // cannot satisfy from sqlite_master.
114
+ let script = format!(
115
+ "sqlite /tmp/bench.sqlite \"{setup}; SELECT count(*) FROM kv WHERE k LIKE '%99%'\""
116
+ );
117
+ let _ = bash.exec(&script).await;
118
+ }
119
+
120
+ async fn bench_aggregate(backend: SqliteBackend, n: usize) {
121
+ let mut bash = make_bash(backend, None);
122
+ let setup = seed_kv_sql(n).replace('"', "\\\"");
123
+ let script = format!(
124
+ "sqlite /tmp/bench.sqlite \"{setup}; SELECT v % 10 AS bucket, count(*), sum(v), avg(v) FROM kv GROUP BY bucket ORDER BY bucket\""
125
+ );
126
+ let _ = bash.exec(&script).await;
127
+ }
128
+
129
+ async fn bench_output_mode(backend: SqliteBackend, n: usize, mode_flag: &str) {
130
+ let mut bash = make_bash(backend, None);
131
+ let setup = seed_kv_sql(n).replace('"', "\\\"");
132
+ // Materialise the full row set through the formatter — this is what
133
+ // changes between modes; the underlying scan is identical.
134
+ let script = format!(
135
+ "sqlite {mode_flag} -header /tmp/bench.sqlite \"{setup}; SELECT id, k, v FROM kv ORDER BY id\""
136
+ );
137
+ let _ = bash.exec(&script).await;
138
+ }
139
+
140
+ async fn bench_persistence_per_invocation(backend: SqliteBackend, n: usize) {
141
+ // Two invocations: write, then read — measures load+flush per call.
142
+ let fs: Arc<dyn FileSystem> = Arc::new(InMemoryFs::new());
143
+ let mut bash = make_bash(backend, Some(Arc::clone(&fs)));
144
+ let setup = seed_kv_sql(n).replace('"', "\\\"");
145
+ let _ = bash
146
+ .exec(&format!("sqlite /tmp/persist.sqlite \"{setup}\""))
147
+ .await;
148
+ let _ = bash
149
+ .exec("sqlite /tmp/persist.sqlite 'SELECT count(*) FROM kv'")
150
+ .await;
151
+ }
152
+
153
+ async fn bench_in_memory_only(n: usize) {
154
+ let mut bash = make_bash(SqliteBackend::Memory, None);
155
+ let setup = seed_kv_sql(n).replace('"', "\\\"");
156
+ // `:memory:` skips the VFS entirely; isolates pure engine cost.
157
+ let script = format!("sqlite :memory: \"{setup}; SELECT count(*) FROM kv\"");
158
+ let _ = bash.exec(&script).await;
159
+ }
160
+
161
+ async fn bench_parallel_sessions(sessions: usize, rows: usize, backend: SqliteBackend) {
162
+ // Shared VFS, distinct DB file per session — tests the cooperative-IO
163
+ // path without contending on a single sqlite file (which the builtin
164
+ // doesn't try to coordinate; see `specs/sqlite-builtin.md`).
165
+ let fs: Arc<dyn FileSystem> = Arc::new(InMemoryFs::new());
166
+ let handles: Vec<_> = (0..sessions)
167
+ .map(|i| {
168
+ let fs = Arc::clone(&fs);
169
+ tokio::spawn(async move {
170
+ let mut bash = make_bash(backend, Some(fs));
171
+ let setup = seed_kv_sql(rows).replace('"', "\\\"");
172
+ let script = format!(
173
+ "sqlite /tmp/sess_{i}.sqlite \"{setup}; SELECT count(*), sum(v) FROM kv\""
174
+ );
175
+ let _ = bash.exec(&script).await;
176
+ })
177
+ })
178
+ .collect();
179
+ for h in handles {
180
+ let _ = h.await;
181
+ }
182
+ }
183
+
184
+ // ---------------------------------------------------------------------------
185
+ // Criterion groups
186
+ // ---------------------------------------------------------------------------
187
+
188
+ fn bench_crud(c: &mut Criterion) {
189
+ let rt = Runtime::new().unwrap();
190
+ let mut group = c.benchmark_group("sqlite_crud");
191
+ group.sample_size(20);
192
+
193
+ for &n in ROW_COUNTS {
194
+ group.throughput(Throughput::Elements(n as u64));
195
+
196
+ group.bench_with_input(BenchmarkId::new("insert_mem", n), &n, |b, &n| {
197
+ b.to_async(&rt)
198
+ .iter(|| bench_insert(SqliteBackend::Memory, n));
199
+ });
200
+ group.bench_with_input(BenchmarkId::new("insert_vfs", n), &n, |b, &n| {
201
+ b.to_async(&rt).iter(|| bench_insert(SqliteBackend::Vfs, n));
202
+ });
203
+
204
+ group.bench_with_input(BenchmarkId::new("update_mem", n), &n, |b, &n| {
205
+ b.to_async(&rt)
206
+ .iter(|| bench_update(SqliteBackend::Memory, n));
207
+ });
208
+ group.bench_with_input(BenchmarkId::new("update_vfs", n), &n, |b, &n| {
209
+ b.to_async(&rt).iter(|| bench_update(SqliteBackend::Vfs, n));
210
+ });
211
+ }
212
+
213
+ group.finish();
214
+ }
215
+
216
+ fn bench_indexing(c: &mut Criterion) {
217
+ let rt = Runtime::new().unwrap();
218
+ let mut group = c.benchmark_group("sqlite_index");
219
+ group.sample_size(20);
220
+
221
+ for &n in ROW_COUNTS {
222
+ group.throughput(Throughput::Elements(n as u64));
223
+
224
+ group.bench_with_input(BenchmarkId::new("create_index_mem", n), &n, |b, &n| {
225
+ b.to_async(&rt)
226
+ .iter(|| bench_index_create_and_query(SqliteBackend::Memory, n));
227
+ });
228
+ group.bench_with_input(BenchmarkId::new("indexed_lookup_mem", n), &n, |b, &n| {
229
+ b.to_async(&rt)
230
+ .iter(|| bench_query_indexed(SqliteBackend::Memory, n));
231
+ });
232
+ group.bench_with_input(BenchmarkId::new("full_scan_mem", n), &n, |b, &n| {
233
+ b.to_async(&rt)
234
+ .iter(|| bench_query_full_scan(SqliteBackend::Memory, n));
235
+ });
236
+ }
237
+
238
+ group.finish();
239
+ }
240
+
241
+ fn bench_queries(c: &mut Criterion) {
242
+ let rt = Runtime::new().unwrap();
243
+ let mut group = c.benchmark_group("sqlite_query");
244
+ group.sample_size(20);
245
+
246
+ for &n in ROW_COUNTS {
247
+ group.throughput(Throughput::Elements(n as u64));
248
+
249
+ group.bench_with_input(BenchmarkId::new("aggregate_mem", n), &n, |b, &n| {
250
+ b.to_async(&rt)
251
+ .iter(|| bench_aggregate(SqliteBackend::Memory, n));
252
+ });
253
+ group.bench_with_input(BenchmarkId::new("aggregate_vfs", n), &n, |b, &n| {
254
+ b.to_async(&rt)
255
+ .iter(|| bench_aggregate(SqliteBackend::Vfs, n));
256
+ });
257
+ group.bench_with_input(BenchmarkId::new("aggregate_in_memory", n), &n, |b, &n| {
258
+ b.to_async(&rt).iter(|| bench_in_memory_only(n));
259
+ });
260
+ }
261
+
262
+ group.finish();
263
+ }
264
+
265
+ fn bench_output_modes(c: &mut Criterion) {
266
+ let rt = Runtime::new().unwrap();
267
+ let mut group = c.benchmark_group("sqlite_output_mode");
268
+ group.sample_size(20);
269
+
270
+ let n = 1_000;
271
+ group.throughput(Throughput::Elements(n as u64));
272
+ for (label, flag) in [
273
+ ("list", ""),
274
+ ("csv", "-csv"),
275
+ ("json", "-json"),
276
+ ("markdown", "-markdown"),
277
+ ("box", "-box"),
278
+ ] {
279
+ group.bench_function(label, |b| {
280
+ b.to_async(&rt)
281
+ .iter(|| bench_output_mode(SqliteBackend::Memory, n, flag));
282
+ });
283
+ }
284
+
285
+ group.finish();
286
+ }
287
+
288
+ fn bench_persistence(c: &mut Criterion) {
289
+ let rt = Runtime::new().unwrap();
290
+ let mut group = c.benchmark_group("sqlite_persistence");
291
+ group.sample_size(20);
292
+
293
+ let n = 1_000;
294
+ group.throughput(Throughput::Elements(n as u64));
295
+ group.bench_function("two_invocations_mem", |b| {
296
+ b.to_async(&rt)
297
+ .iter(|| bench_persistence_per_invocation(SqliteBackend::Memory, n));
298
+ });
299
+ group.bench_function("two_invocations_vfs", |b| {
300
+ b.to_async(&rt)
301
+ .iter(|| bench_persistence_per_invocation(SqliteBackend::Vfs, n));
302
+ });
303
+ group.bench_function("memory_db_baseline", |b| {
304
+ b.to_async(&rt).iter(|| bench_in_memory_only(n));
305
+ });
306
+
307
+ group.finish();
308
+ }
309
+
310
+ fn bench_parallel(c: &mut Criterion) {
311
+ let rt = Runtime::new().unwrap();
312
+ let mut group = c.benchmark_group("sqlite_parallel");
313
+ group.sample_size(15);
314
+
315
+ let rows = 500;
316
+ for &sessions in SESSION_COUNTS {
317
+ group.throughput(Throughput::Elements((sessions * rows) as u64));
318
+ group.bench_with_input(BenchmarkId::new("mem", sessions), &sessions, |b, &s| {
319
+ b.to_async(&rt)
320
+ .iter(|| bench_parallel_sessions(s, rows, SqliteBackend::Memory));
321
+ });
322
+ group.bench_with_input(BenchmarkId::new("vfs", sessions), &sessions, |b, &s| {
323
+ b.to_async(&rt)
324
+ .iter(|| bench_parallel_sessions(s, rows, SqliteBackend::Vfs));
325
+ });
326
+ }
327
+
328
+ group.finish();
329
+ }
330
+
331
+ // ---------------------------------------------------------------------------
332
+ // Smoke-test harness — runs as part of `cargo test --features sqlite` so a
333
+ // regression in the benched code path breaks the build, not just a silent
334
+ // 0ns measurement.
335
+ // ---------------------------------------------------------------------------
336
+
337
+ #[test]
338
+ fn verify_insert_and_count() {
339
+ let rt = Runtime::new().unwrap();
340
+ rt.block_on(async {
341
+ let mut bash = make_bash(SqliteBackend::Memory, None);
342
+ let setup = seed_kv_sql(50).replace('"', "\\\"");
343
+ let r = bash
344
+ .exec(&format!(
345
+ "sqlite /tmp/v.sqlite \"{setup}; SELECT count(*) FROM kv\""
346
+ ))
347
+ .await
348
+ .unwrap();
349
+ assert_eq!(r.exit_code, 0, "stderr={}", r.stderr);
350
+ assert_eq!(r.stdout.trim(), "50");
351
+ });
352
+ }
353
+
354
+ #[test]
355
+ fn verify_aggregate_groups() {
356
+ let rt = Runtime::new().unwrap();
357
+ rt.block_on(async {
358
+ let mut bash = make_bash(SqliteBackend::Memory, None);
359
+ let setup = seed_kv_sql(100).replace('"', "\\\"");
360
+ let r = bash
361
+ .exec(&format!(
362
+ "sqlite -header /tmp/v.sqlite \"{setup}; SELECT count(DISTINCT v % 10) FROM kv\""
363
+ ))
364
+ .await
365
+ .unwrap();
366
+ assert_eq!(r.exit_code, 0, "stderr={}", r.stderr);
367
+ // 10 buckets max — the exact count depends on the v distribution.
368
+ let count: i64 = r.stdout.lines().last().unwrap().trim().parse().unwrap();
369
+ assert!(
370
+ (1..=10).contains(&count),
371
+ "unexpected bucket count: {count}"
372
+ );
373
+ });
374
+ }
375
+
376
+ #[test]
377
+ fn verify_index_lookup_matches_scan() {
378
+ let rt = Runtime::new().unwrap();
379
+ rt.block_on(async {
380
+ let mut bash = make_bash(SqliteBackend::Memory, None);
381
+ let setup = seed_kv_sql(200).replace('"', "\\\"");
382
+ let r = bash
383
+ .exec(&format!(
384
+ "sqlite /tmp/v.sqlite \"{setup}; CREATE INDEX i ON kv(k); SELECT v FROM kv WHERE k='key42'\""
385
+ ))
386
+ .await
387
+ .unwrap();
388
+ assert_eq!(r.exit_code, 0, "stderr={}", r.stderr);
389
+ // 42 * 7 % 113 = 294 % 113 = 68.
390
+ assert_eq!(r.stdout.trim(), "68");
391
+ });
392
+ }
393
+
394
+ #[test]
395
+ fn verify_persistence_across_invocations() {
396
+ let rt = Runtime::new().unwrap();
397
+ rt.block_on(async {
398
+ let fs: Arc<dyn FileSystem> = Arc::new(InMemoryFs::new());
399
+ let mut bash = make_bash(SqliteBackend::Memory, Some(Arc::clone(&fs)));
400
+ let setup = seed_kv_sql(25).replace('"', "\\\"");
401
+ let r1 = bash
402
+ .exec(&format!("sqlite /tmp/persist.sqlite \"{setup}\""))
403
+ .await
404
+ .unwrap();
405
+ assert_eq!(r1.exit_code, 0, "stderr={}", r1.stderr);
406
+ let r2 = bash
407
+ .exec("sqlite /tmp/persist.sqlite 'SELECT count(*) FROM kv'")
408
+ .await
409
+ .unwrap();
410
+ assert_eq!(r2.exit_code, 0, "stderr={}", r2.stderr);
411
+ assert_eq!(r2.stdout.trim(), "25");
412
+ });
413
+ }
414
+
415
+ criterion_group!(
416
+ benches,
417
+ bench_crud,
418
+ bench_indexing,
419
+ bench_queries,
420
+ bench_output_modes,
421
+ bench_persistence,
422
+ bench_parallel,
423
+ );
424
+ criterion_main!(benches);