bashkit 0.1.12__tar.gz → 0.1.13__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 (329) hide show
  1. {bashkit-0.1.12 → bashkit-0.1.13}/Cargo.lock +33 -11
  2. {bashkit-0.1.12 → bashkit-0.1.13}/Cargo.toml +1 -1
  3. {bashkit-0.1.12 → bashkit-0.1.13}/PKG-INFO +1 -1
  4. {bashkit-0.1.12 → bashkit-0.1.13}/bashkit/__init__.py +4 -0
  5. {bashkit-0.1.12 → bashkit-0.1.13}/bashkit/_bashkit.pyi +15 -0
  6. bashkit-0.1.13/crates/bashkit/docs/live_mounts.md +193 -0
  7. bashkit-0.1.13/crates/bashkit/examples/live_mounts.rs +138 -0
  8. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/ls.rs +27 -22
  9. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/fs/mountable.rs +6 -0
  10. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/lib.rs +111 -2
  11. bashkit-0.1.13/crates/bashkit/tests/find_multi_path_tests.rs +149 -0
  12. bashkit-0.1.13/crates/bashkit/tests/live_mount_tests.rs +156 -0
  13. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/find.test.sh +43 -0
  14. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/src/lib.rs +134 -0
  15. {bashkit-0.1.12 → bashkit-0.1.13}/README.md +0 -0
  16. {bashkit-0.1.12 → bashkit-0.1.13}/bashkit/deepagents.py +0 -0
  17. {bashkit-0.1.12 → bashkit-0.1.13}/bashkit/langchain.py +0 -0
  18. {bashkit-0.1.12 → bashkit-0.1.13}/bashkit/py.typed +0 -0
  19. {bashkit-0.1.12 → bashkit-0.1.13}/bashkit/pydantic_ai.py +0 -0
  20. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/Cargo.toml +0 -0
  21. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/README.md +0 -0
  22. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/benches/parallel_execution.rs +0 -0
  23. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/docs/compatibility.md +0 -0
  24. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/docs/custom_builtins.md +0 -0
  25. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/docs/logging.md +0 -0
  26. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/docs/python.md +0 -0
  27. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/docs/threat-model.md +0 -0
  28. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/agent_tool.rs +0 -0
  29. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/basic.rs +0 -0
  30. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/custom_backend.rs +0 -0
  31. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/custom_builtins.rs +0 -0
  32. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/custom_filesystem_impl.rs +0 -0
  33. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/custom_fs.rs +0 -0
  34. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/git_workflow.rs +0 -0
  35. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/python_external_functions.rs +0 -0
  36. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/python_scripts.rs +0 -0
  37. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/realfs_readonly.rs +0 -0
  38. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/realfs_readwrite.rs +0 -0
  39. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/resource_limits.rs +0 -0
  40. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/scripted_tool.rs +0 -0
  41. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/show_tool_output.rs +0 -0
  42. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/streaming_output.rs +0 -0
  43. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/text_files.rs +0 -0
  44. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/text_processing.rs +0 -0
  45. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/examples/virtual_identity.rs +0 -0
  46. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/alias.rs +0 -0
  47. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/archive.rs +0 -0
  48. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/arg_parser.rs +0 -0
  49. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/assert.rs +0 -0
  50. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/awk.rs +0 -0
  51. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/base64.rs +0 -0
  52. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/bc.rs +0 -0
  53. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/caller.rs +0 -0
  54. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/cat.rs +0 -0
  55. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/checksum.rs +0 -0
  56. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/clear.rs +0 -0
  57. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/column.rs +0 -0
  58. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/comm.rs +0 -0
  59. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/compgen.rs +0 -0
  60. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/csv.rs +0 -0
  61. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/curl.rs +0 -0
  62. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/cuttr.rs +0 -0
  63. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/date.rs +0 -0
  64. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/diff.rs +0 -0
  65. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/dirstack.rs +0 -0
  66. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/disk.rs +0 -0
  67. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/dotenv.rs +0 -0
  68. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/echo.rs +0 -0
  69. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/environ.rs +0 -0
  70. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/envsubst.rs +0 -0
  71. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/expand.rs +0 -0
  72. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/export.rs +0 -0
  73. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/expr.rs +0 -0
  74. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/fc.rs +0 -0
  75. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/fileops.rs +0 -0
  76. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/flow.rs +0 -0
  77. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/fold.rs +0 -0
  78. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/git.rs +0 -0
  79. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/glob_cmd.rs +0 -0
  80. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/grep.rs +0 -0
  81. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/headtail.rs +0 -0
  82. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/help.rs +0 -0
  83. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/hextools.rs +0 -0
  84. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/http.rs +0 -0
  85. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/iconv.rs +0 -0
  86. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/inspect.rs +0 -0
  87. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/introspect.rs +0 -0
  88. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/join.rs +0 -0
  89. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/jq.rs +0 -0
  90. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/json.rs +0 -0
  91. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/log.rs +0 -0
  92. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/mapfile.rs +0 -0
  93. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/mkfifo.rs +0 -0
  94. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/mod.rs +0 -0
  95. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/navigation.rs +0 -0
  96. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/nl.rs +0 -0
  97. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/parallel.rs +0 -0
  98. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/paste.rs +0 -0
  99. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/patch.rs +0 -0
  100. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/path.rs +0 -0
  101. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/pipeline.rs +0 -0
  102. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/printf.rs +0 -0
  103. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/python.rs +0 -0
  104. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/read.rs +0 -0
  105. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/retry.rs +0 -0
  106. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/rg.rs +0 -0
  107. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/search_common.rs +0 -0
  108. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/sed.rs +0 -0
  109. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/semver.rs +0 -0
  110. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/seq.rs +0 -0
  111. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/sleep.rs +0 -0
  112. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/sortuniq.rs +0 -0
  113. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/source.rs +0 -0
  114. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/split.rs +0 -0
  115. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/strings.rs +0 -0
  116. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/system.rs +0 -0
  117. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/template.rs +0 -0
  118. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/test.rs +0 -0
  119. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/textrev.rs +0 -0
  120. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/timeout.rs +0 -0
  121. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/tomlq.rs +0 -0
  122. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/trap.rs +0 -0
  123. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/tree.rs +0 -0
  124. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/vars.rs +0 -0
  125. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/verify.rs +0 -0
  126. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/wait.rs +0 -0
  127. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/wc.rs +0 -0
  128. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/yaml.rs +0 -0
  129. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/yes.rs +0 -0
  130. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/builtins/zip_cmd.rs +0 -0
  131. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/error.rs +0 -0
  132. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/fs/backend.rs +0 -0
  133. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/fs/limits.rs +0 -0
  134. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/fs/memory.rs +0 -0
  135. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/fs/mod.rs +0 -0
  136. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/fs/overlay.rs +0 -0
  137. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/fs/posix.rs +0 -0
  138. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/fs/realfs.rs +0 -0
  139. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/fs/search.rs +0 -0
  140. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/fs/traits.rs +0 -0
  141. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/git/client.rs +0 -0
  142. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/git/config.rs +0 -0
  143. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/git/mod.rs +0 -0
  144. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/interpreter/glob.rs +0 -0
  145. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/interpreter/jobs.rs +0 -0
  146. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/interpreter/mod.rs +0 -0
  147. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/interpreter/state.rs +0 -0
  148. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/limits.rs +0 -0
  149. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/logging_impl.rs +0 -0
  150. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/network/allowlist.rs +0 -0
  151. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/network/client.rs +0 -0
  152. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/network/mod.rs +0 -0
  153. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/parser/ast.rs +0 -0
  154. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/parser/budget.rs +0 -0
  155. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/parser/lexer.rs +0 -0
  156. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/parser/mod.rs +0 -0
  157. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/parser/span.rs +0 -0
  158. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/parser/tokens.rs +0 -0
  159. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/scripted_tool/execute.rs +0 -0
  160. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/scripted_tool/mod.rs +0 -0
  161. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/scripted_tool/toolset.rs +0 -0
  162. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/tool.rs +0 -0
  163. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/src/trace.rs +0 -0
  164. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/background_exec_tests.rs +0 -0
  165. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/blackbox_security_tests.rs +0 -0
  166. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/builtin_error_security_tests.rs +0 -0
  167. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/cancellation_tests.rs +0 -0
  168. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/coproc_tests.rs +0 -0
  169. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/custom_builtins_tests.rs +0 -0
  170. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/custom_fs_tests.rs +0 -0
  171. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/dev_null_tests.rs +0 -0
  172. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/final_env_tests.rs +0 -0
  173. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/git_advanced_tests.rs +0 -0
  174. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/git_inspection_tests.rs +0 -0
  175. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/git_integration_tests.rs +0 -0
  176. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/git_remote_security_tests.rs +0 -0
  177. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/git_security_tests.rs +0 -0
  178. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/history_tests.rs +0 -0
  179. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/issue_274_test.rs +0 -0
  180. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/issue_275_279_282_test.rs +0 -0
  181. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/issue_276_test.rs +0 -0
  182. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/issue_277_test.rs +0 -0
  183. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/issue_289_test.rs +0 -0
  184. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/issue_290_test.rs +0 -0
  185. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/issue_291_test.rs +0 -0
  186. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/logging_security_tests.rs +0 -0
  187. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/mkfifo_tests.rs +0 -0
  188. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/nested_subscript_tests.rs +0 -0
  189. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/network_security_tests.rs +0 -0
  190. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/output_truncation_tests.rs +0 -0
  191. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/overlay_path_validation_tests.rs +0 -0
  192. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/proptest_differential.rs +0 -0
  193. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/proptest_security.rs +0 -0
  194. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/python_integration_tests.rs +0 -0
  195. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/python_security_tests.rs +0 -0
  196. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/realfs_tests.rs +0 -0
  197. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/script_execution_tests.rs +0 -0
  198. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/security_audit_pocs.rs +0 -0
  199. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/security_failpoint_tests.rs +0 -0
  200. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_fixtures/azure_discover_rank.sh +0 -0
  201. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_fixtures/azure_generate_url.sh +0 -0
  202. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_fixtures/azure_query_capacity.sh +0 -0
  203. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_fixtures/helm_validate_chart.sh +0 -0
  204. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_fixtures/jwt_test_setup.sh +0 -0
  205. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_fixtures/stitch_download_asset.sh +0 -0
  206. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_fixtures/stitch_fetch.sh +0 -0
  207. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_fixtures/stitch_verify_setup.sh +0 -0
  208. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_fixtures/superpowers_find_polluter.sh +0 -0
  209. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_fixtures/vercel_deploy.sh +0 -0
  210. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/skills_tests.rs +0 -0
  211. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/snapshot_tests.rs +0 -0
  212. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/source_function_tests.rs +0 -0
  213. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/awk/awk.test.sh +0 -0
  214. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/awk/eval-bugs.test.sh +0 -0
  215. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/alias.test.sh +0 -0
  216. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/arith-dynamic.test.sh +0 -0
  217. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/arithmetic.test.sh +0 -0
  218. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/array-slicing.test.sh +0 -0
  219. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/arrays.test.sh +0 -0
  220. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh +0 -0
  221. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/background.test.sh +0 -0
  222. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/bash-command.test.sh +0 -0
  223. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/bash-flags.test.sh +0 -0
  224. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/bc.test.sh +0 -0
  225. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/blackbox-edge-cases.test.sh +0 -0
  226. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/blackbox-exploration.test.sh +0 -0
  227. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/brace-expansion.test.sh +0 -0
  228. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/checksum.test.sh +0 -0
  229. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/chown-kill.test.sh +0 -0
  230. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/cmd-suggestions.test.sh +0 -0
  231. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/column.test.sh +0 -0
  232. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/comm.test.sh +0 -0
  233. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/command-not-found.test.sh +0 -0
  234. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/command-subst.test.sh +0 -0
  235. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/command.test.sh +0 -0
  236. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/conditional.test.sh +0 -0
  237. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/control-flow.test.sh +0 -0
  238. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/cuttr.test.sh +0 -0
  239. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/date.test.sh +0 -0
  240. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/declare.test.sh +0 -0
  241. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/df.test.sh +0 -0
  242. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/diff.test.sh +0 -0
  243. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/dirstack.test.sh +0 -0
  244. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/du.test.sh +0 -0
  245. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/echo.test.sh +0 -0
  246. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/empty-bodies.test.sh +0 -0
  247. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/env.test.sh +0 -0
  248. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/errexit.test.sh +0 -0
  249. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/eval-bugs.test.sh +0 -0
  250. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/exit-status.test.sh +0 -0
  251. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/expr.test.sh +0 -0
  252. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/extglob.test.sh +0 -0
  253. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/file.test.sh +0 -0
  254. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/fileops.test.sh +0 -0
  255. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/functions.test.sh +0 -0
  256. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/getopts.test.sh +0 -0
  257. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/glob-options.test.sh +0 -0
  258. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/globs.test.sh +0 -0
  259. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/gzip.test.sh +0 -0
  260. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/headtail.test.sh +0 -0
  261. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/heredoc-edge.test.sh +0 -0
  262. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/heredoc.test.sh +0 -0
  263. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/herestring.test.sh +0 -0
  264. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/hextools.test.sh +0 -0
  265. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/history.test.sh +0 -0
  266. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/less.test.sh +0 -0
  267. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/ln.test.sh +0 -0
  268. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/nameref.test.sh +0 -0
  269. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/negative-tests.test.sh +0 -0
  270. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/nl.test.sh +0 -0
  271. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/nounset.test.sh +0 -0
  272. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/parse-errors.test.sh +0 -0
  273. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/paste.test.sh +0 -0
  274. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/path.test.sh +0 -0
  275. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/pipes-redirects.test.sh +0 -0
  276. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/printenv.test.sh +0 -0
  277. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/printf.test.sh +0 -0
  278. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/procsub.test.sh +0 -0
  279. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/quote.test.sh +0 -0
  280. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/read-builtin.test.sh +0 -0
  281. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/script-exec.test.sh +0 -0
  282. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/seq.test.sh +0 -0
  283. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/shell-grammar.test.sh +0 -0
  284. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/sleep.test.sh +0 -0
  285. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/sortuniq.test.sh +0 -0
  286. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/source.test.sh +0 -0
  287. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/stat.test.sh +0 -0
  288. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/string-ops.test.sh +0 -0
  289. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/strings.test.sh +0 -0
  290. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/subshell.test.sh +0 -0
  291. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/tar.test.sh +0 -0
  292. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/tee.test.sh +0 -0
  293. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/temp-binding.test.sh +0 -0
  294. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/test-operators.test.sh +0 -0
  295. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/textrev.test.sh +0 -0
  296. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/time.test.sh +0 -0
  297. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/timeout.test.sh +0 -0
  298. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/type.test.sh +0 -0
  299. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/unicode.test.sh +0 -0
  300. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/var-op-test.test.sh +0 -0
  301. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/variables.test.sh +0 -0
  302. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/wait.test.sh +0 -0
  303. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/watch.test.sh +0 -0
  304. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/wc.test.sh +0 -0
  305. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/word-split.test.sh +0 -0
  306. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/bash/xargs.test.sh +0 -0
  307. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/grep/eval-bugs.test.sh +0 -0
  308. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/grep/grep.test.sh +0 -0
  309. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/jq/jq.test.sh +0 -0
  310. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/python/python.test.sh +0 -0
  311. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/sed/eval-bugs.test.sh +0 -0
  312. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_cases/sed/sed.test.sh +0 -0
  313. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_runner.rs +0 -0
  314. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/spec_tests.rs +0 -0
  315. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/threat_model_tests.rs +0 -0
  316. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/unicode_security_tests.rs +0 -0
  317. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit/tests/unset_function_tests.rs +0 -0
  318. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/Cargo.toml +0 -0
  319. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/README.md +0 -0
  320. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/examples/bash_basics.py +0 -0
  321. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/examples/k8s_orchestrator.py +0 -0
  322. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/tests/test_bashkit.py +0 -0
  323. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/tests/test_frameworks.py +0 -0
  324. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/tests/test_integration.py +0 -0
  325. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/tests/test_python_security.py +0 -0
  326. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/tests/test_security.py +0 -0
  327. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/tests/test_security_advanced.py +0 -0
  328. {bashkit-0.1.12 → bashkit-0.1.13}/crates/bashkit-python/tests/test_shell_injection.py +0 -0
  329. {bashkit-0.1.12 → bashkit-0.1.13}/pyproject.toml +0 -0
@@ -218,7 +218,7 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
218
218
 
219
219
  [[package]]
220
220
  name = "bashkit"
221
- version = "0.1.12"
221
+ version = "0.1.13"
222
222
  dependencies = [
223
223
  "anyhow",
224
224
  "async-trait",
@@ -256,7 +256,7 @@ dependencies = [
256
256
 
257
257
  [[package]]
258
258
  name = "bashkit-bench"
259
- version = "0.1.12"
259
+ version = "0.1.13"
260
260
  dependencies = [
261
261
  "anyhow",
262
262
  "bashkit",
@@ -272,7 +272,7 @@ dependencies = [
272
272
 
273
273
  [[package]]
274
274
  name = "bashkit-cli"
275
- version = "0.1.12"
275
+ version = "0.1.13"
276
276
  dependencies = [
277
277
  "anyhow",
278
278
  "bashkit",
@@ -285,7 +285,7 @@ dependencies = [
285
285
 
286
286
  [[package]]
287
287
  name = "bashkit-eval"
288
- version = "0.1.12"
288
+ version = "0.1.13"
289
289
  dependencies = [
290
290
  "anyhow",
291
291
  "async-trait",
@@ -301,7 +301,7 @@ dependencies = [
301
301
 
302
302
  [[package]]
303
303
  name = "bashkit-js"
304
- version = "0.1.12"
304
+ version = "0.1.13"
305
305
  dependencies = [
306
306
  "bashkit",
307
307
  "napi",
@@ -314,7 +314,7 @@ dependencies = [
314
314
 
315
315
  [[package]]
316
316
  name = "bashkit-python"
317
- version = "0.1.12"
317
+ version = "0.1.13"
318
318
  dependencies = [
319
319
  "bashkit",
320
320
  "num-bigint",
@@ -1447,9 +1447,9 @@ checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
1447
1447
 
1448
1448
  [[package]]
1449
1449
  name = "iri-string"
1450
- version = "0.7.10"
1450
+ version = "0.7.11"
1451
1451
  source = "registry+https://github.com/rust-lang/crates.io-index"
1452
- checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a"
1452
+ checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb"
1453
1453
  dependencies = [
1454
1454
  "memchr",
1455
1455
  "serde",
@@ -1547,7 +1547,7 @@ dependencies = [
1547
1547
  "cesu8",
1548
1548
  "cfg-if",
1549
1549
  "combine",
1550
- "jni-sys",
1550
+ "jni-sys 0.3.1",
1551
1551
  "log",
1552
1552
  "thiserror 1.0.69",
1553
1553
  "walkdir",
@@ -1556,9 +1556,31 @@ dependencies = [
1556
1556
 
1557
1557
  [[package]]
1558
1558
  name = "jni-sys"
1559
- version = "0.3.0"
1559
+ version = "0.3.1"
1560
1560
  source = "registry+https://github.com/rust-lang/crates.io-index"
1561
- checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
1561
+ checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
1562
+ dependencies = [
1563
+ "jni-sys 0.4.1",
1564
+ ]
1565
+
1566
+ [[package]]
1567
+ name = "jni-sys"
1568
+ version = "0.4.1"
1569
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1570
+ checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"
1571
+ dependencies = [
1572
+ "jni-sys-macros",
1573
+ ]
1574
+
1575
+ [[package]]
1576
+ name = "jni-sys-macros"
1577
+ version = "0.4.1"
1578
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1579
+ checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
1580
+ dependencies = [
1581
+ "quote",
1582
+ "syn",
1583
+ ]
1562
1584
 
1563
1585
  [[package]]
1564
1586
  name = "jobserver"
@@ -7,7 +7,7 @@ resolver = "2"
7
7
  members = ["crates/*"]
8
8
 
9
9
  [workspace.package]
10
- version = "0.1.12"
10
+ version = "0.1.13"
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.1.12
3
+ Version: 0.1.13
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -26,17 +26,21 @@ Framework integrations:
26
26
 
27
27
  from bashkit._bashkit import (
28
28
  Bash,
29
+ BashError,
29
30
  BashTool,
30
31
  ExecResult,
31
32
  ScriptedTool,
32
33
  create_langchain_tool_spec,
34
+ get_version,
33
35
  )
34
36
 
35
37
  __version__ = "0.1.2"
36
38
  __all__ = [
37
39
  "Bash",
40
+ "BashError",
38
41
  "BashTool",
39
42
  "ExecResult",
40
43
  "ScriptedTool",
41
44
  "create_langchain_tool_spec",
45
+ "get_version",
42
46
  ]
@@ -47,6 +47,8 @@ class Bash:
47
47
  ) -> None: ...
48
48
  async def execute(self, commands: str) -> ExecResult: ...
49
49
  def execute_sync(self, commands: str) -> ExecResult: ...
50
+ async def execute_or_throw(self, commands: str) -> ExecResult: ...
51
+ def execute_sync_or_throw(self, commands: str) -> ExecResult: ...
50
52
  def cancel(self) -> None: ...
51
53
  def reset(self) -> None: ...
52
54
 
@@ -88,6 +90,8 @@ class BashTool:
88
90
  ) -> None: ...
89
91
  async def execute(self, commands: str) -> ExecResult: ...
90
92
  def execute_sync(self, commands: str) -> ExecResult: ...
93
+ async def execute_or_throw(self, commands: str) -> ExecResult: ...
94
+ def execute_sync_or_throw(self, commands: str) -> ExecResult: ...
91
95
  def cancel(self) -> None: ...
92
96
  def description(self) -> str: ...
93
97
  def help(self) -> str: ...
@@ -140,6 +144,13 @@ class ScriptedTool:
140
144
  def input_schema(self) -> str: ...
141
145
  def output_schema(self) -> str: ...
142
146
 
147
+ class BashError(Exception):
148
+ """Exception raised when a bash command exits with non-zero status."""
149
+
150
+ exit_code: int
151
+ stderr: str
152
+ stdout: str
153
+
143
154
  def create_langchain_tool_spec() -> dict[str, Any]:
144
155
  """Create a LangChain-compatible tool specification.
145
156
 
@@ -147,3 +158,7 @@ def create_langchain_tool_spec() -> dict[str, Any]:
147
158
  Dict with name, description, and args_schema
148
159
  """
149
160
  ...
161
+
162
+ def get_version() -> str:
163
+ """Get the bashkit version string."""
164
+ ...
@@ -0,0 +1,193 @@
1
+ # Live Mount/Unmount Guide
2
+
3
+ Bashkit supports attaching and detaching filesystems on a **running** interpreter
4
+ without rebuilding it. Shell state — environment variables, working directory,
5
+ history, aliases — is fully preserved across mount operations.
6
+
7
+ ## Motivation
8
+
9
+ Before live mounts, the only way to add a filesystem after `build()` was to
10
+ accumulate mount configs and call `reset()`, which rebuilds the entire
11
+ interpreter and loses all in-flight state. Live mounts solve this by exposing
12
+ the internal [`MountableFs`] layer that wraps every `Bash` instance.
13
+
14
+ Common use cases:
15
+
16
+ - **Agent workflows**: attach a host directory mid-session when a tool needs it
17
+ - **Plugin systems**: mount/unmount plugin filesystems without restarting
18
+ - **Hot-swap deployments**: replace a mounted app filesystem with a new version
19
+ - **Testing**: inject mock data at specific paths during a test
20
+
21
+ ## Quick Start
22
+
23
+ ```rust
24
+ use bashkit::{Bash, FileSystem, InMemoryFs};
25
+ use std::path::Path;
26
+ use std::sync::Arc;
27
+
28
+ # #[tokio::main]
29
+ # async fn main() -> bashkit::Result<()> {
30
+ let mut bash = Bash::new();
31
+
32
+ // Create and populate a filesystem
33
+ let data_fs = Arc::new(InMemoryFs::new());
34
+ data_fs.write_file(Path::new("/users.json"), br#"["alice"]"#).await?;
35
+
36
+ // Mount it live — no rebuild needed
37
+ bash.mount("/mnt/data", data_fs)?;
38
+
39
+ let result = bash.exec("cat /mnt/data/users.json").await?;
40
+ assert!(result.stdout.contains("alice"));
41
+
42
+ // Unmount when done
43
+ bash.unmount("/mnt/data")?;
44
+ # Ok(())
45
+ # }
46
+ ```
47
+
48
+ ## API
49
+
50
+ ### `Bash::mount(vfs_path, fs)`
51
+
52
+ Mounts `fs` at `vfs_path`. The mount takes effect immediately — subsequent
53
+ `exec()` calls see files from the mounted filesystem. If a mount already exists
54
+ at `vfs_path`, it is replaced (hot-swap).
55
+
56
+ ```rust
57
+ # use bashkit::{Bash, FileSystem, InMemoryFs};
58
+ # use std::sync::Arc;
59
+ # use std::path::Path;
60
+ # #[tokio::main]
61
+ # async fn main() -> bashkit::Result<()> {
62
+ let bash = Bash::new();
63
+ let fs = Arc::new(InMemoryFs::new());
64
+ bash.mount("/mnt/data", fs)?;
65
+ # Ok(())
66
+ # }
67
+ ```
68
+
69
+ **Errors:** Returns `Err` if `vfs_path` is not absolute (after normalization).
70
+
71
+ ### `Bash::unmount(vfs_path)`
72
+
73
+ Removes the mount at `vfs_path`. Paths that previously resolved to the mounted
74
+ filesystem fall back to the root filesystem or the next shorter mount prefix.
75
+
76
+ ```rust
77
+ # use bashkit::{Bash, FileSystem, InMemoryFs};
78
+ # use std::sync::Arc;
79
+ # #[tokio::main]
80
+ # async fn main() -> bashkit::Result<()> {
81
+ # let bash = Bash::new();
82
+ # let fs = Arc::new(InMemoryFs::new());
83
+ # bash.mount("/mnt/data", fs)?;
84
+ bash.unmount("/mnt/data")?;
85
+ # Ok(())
86
+ # }
87
+ ```
88
+
89
+ **Errors:** Returns `Err` if nothing is mounted at `vfs_path`.
90
+
91
+ ## How It Works
92
+
93
+ Every `Bash` instance wraps its filesystem stack in a [`MountableFs`] as the
94
+ outermost layer. This layer uses longest-prefix matching to route path
95
+ operations to the correct mounted filesystem:
96
+
97
+ ```text
98
+ ┌──────────────────────────────┐
99
+ │ MountableFs (live mounts) │ ← Bash::mount() / unmount()
100
+ ├──────────────────────────────┤
101
+ │ OverlayFs (text mounts) │ ← BashBuilder::mount_text()
102
+ ├──────────────────────────────┤
103
+ │ MountableFs (real mounts) │ ← BashBuilder::mount_real_*_at()
104
+ ├──────────────────────────────┤
105
+ │ Base filesystem │ ← InMemoryFs or custom
106
+ └──────────────────────────────┘
107
+ ```
108
+
109
+ Because the interpreter holds an `Arc<dyn FileSystem>` pointing to the
110
+ outermost `MountableFs`, any mount/unmount operation is visible to the
111
+ interpreter immediately — no rebuild or state transfer required.
112
+
113
+ ## Builder Mounts vs Live Mounts
114
+
115
+ | | Builder mounts | Live mounts |
116
+ |---|---|---|
117
+ | **When** | Before `build()` | After `build()` |
118
+ | **Method** | `BashBuilder::mount_text()`, `mount_real_*()` | `Bash::mount()` |
119
+ | **State** | N/A (no interpreter yet) | Fully preserved |
120
+ | **Use case** | Initial configuration | Dynamic attachment |
121
+
122
+ Both approaches can be combined: configure initial mounts with the builder, then
123
+ add/remove mounts at runtime.
124
+
125
+ ## Examples
126
+
127
+ ### Multiple Mounts
128
+
129
+ ```rust
130
+ use bashkit::{Bash, FileSystem, InMemoryFs};
131
+ use std::path::Path;
132
+ use std::sync::Arc;
133
+
134
+ # #[tokio::main]
135
+ # async fn main() -> bashkit::Result<()> {
136
+ let mut bash = Bash::new();
137
+
138
+ let logs = Arc::new(InMemoryFs::new());
139
+ logs.write_file(Path::new("/app.log"), b"started\n").await?;
140
+
141
+ let config = Arc::new(InMemoryFs::new());
142
+ config.write_file(Path::new("/app.toml"), b"port = 8080\n").await?;
143
+
144
+ bash.mount("/var/log", logs)?;
145
+ bash.mount("/etc/app", config)?;
146
+
147
+ let result = bash.exec("cat /var/log/app.log").await?;
148
+ assert_eq!(result.stdout, "started\n");
149
+
150
+ let result = bash.exec("cat /etc/app/app.toml").await?;
151
+ assert_eq!(result.stdout, "port = 8080\n");
152
+ # Ok(())
153
+ # }
154
+ ```
155
+
156
+ ### Hot-Swap
157
+
158
+ Re-mounting at the same path replaces the filesystem atomically:
159
+
160
+ ```rust
161
+ use bashkit::{Bash, FileSystem, InMemoryFs};
162
+ use std::path::Path;
163
+ use std::sync::Arc;
164
+
165
+ # #[tokio::main]
166
+ # async fn main() -> bashkit::Result<()> {
167
+ let mut bash = Bash::new();
168
+
169
+ let v1 = Arc::new(InMemoryFs::new());
170
+ v1.write_file(Path::new("/version"), b"1.0").await?;
171
+ bash.mount("/app", v1)?;
172
+
173
+ let result = bash.exec("cat /app/version").await?;
174
+ assert_eq!(result.stdout, "1.0");
175
+
176
+ // Hot-swap to v2
177
+ let v2 = Arc::new(InMemoryFs::new());
178
+ v2.write_file(Path::new("/version"), b"2.0").await?;
179
+ bash.mount("/app", v2)?;
180
+
181
+ let result = bash.exec("cat /app/version").await?;
182
+ assert_eq!(result.stdout, "2.0");
183
+ # Ok(())
184
+ # }
185
+ ```
186
+
187
+ ## See Also
188
+
189
+ - [`MountableFs`] — the underlying mount infrastructure
190
+ - [`BashBuilder::mount_text`] — pre-build text file mounts
191
+ - [`BashBuilder::fs`] — custom filesystem injection
192
+ - [`Bash::fs`] — direct filesystem access
193
+ - [VFS specification](https://github.com/everruns/bashkit/blob/main/specs/003-vfs.md)
@@ -0,0 +1,138 @@
1
+ //! Live mount/unmount example
2
+ //!
3
+ //! Demonstrates attaching and detaching filesystems on a running Bash
4
+ //! instance without rebuilding the interpreter or losing shell state.
5
+ //!
6
+ //! Run with: cargo run --example live_mounts
7
+
8
+ use bashkit::{Bash, FileSystem, InMemoryFs};
9
+ use std::path::Path;
10
+ use std::sync::Arc;
11
+
12
+ #[tokio::main]
13
+ async fn main() -> anyhow::Result<()> {
14
+ println!("=== Live Mount/Unmount Example ===\n");
15
+
16
+ basic_live_mount().await?;
17
+ println!();
18
+ state_preservation().await?;
19
+ println!();
20
+ hot_swap_mount().await?;
21
+
22
+ Ok(())
23
+ }
24
+
25
+ /// Mount a filesystem on a running interpreter.
26
+ async fn basic_live_mount() -> anyhow::Result<()> {
27
+ println!("--- Basic Live Mount ---");
28
+
29
+ let mut bash = Bash::new();
30
+
31
+ // Create a data filesystem and populate it
32
+ let data_fs = Arc::new(InMemoryFs::new());
33
+ data_fs
34
+ .write_file(
35
+ Path::new("/users.json"),
36
+ br#"[{"name": "alice"}, {"name": "bob"}]"#,
37
+ )
38
+ .await?;
39
+ data_fs
40
+ .write_file(Path::new("/readme.txt"), b"Welcome to the data store")
41
+ .await?;
42
+
43
+ // Mount it live — no builder, no rebuild
44
+ bash.mount("/mnt/data", data_fs)?;
45
+
46
+ let result = bash.exec("cat /mnt/data/readme.txt").await?;
47
+ println!("Data store: {}", result.stdout);
48
+
49
+ let result = bash.exec("ls /mnt/data").await?;
50
+ println!("Files: {}", result.stdout);
51
+
52
+ // Unmount when done
53
+ bash.unmount("/mnt/data")?;
54
+ println!("Unmounted /mnt/data");
55
+
56
+ let result = bash.exec("ls /mnt/data 2>&1; echo \"exit=$?\"").await?;
57
+ println!("After unmount: {}", result.stdout.trim());
58
+
59
+ Ok(())
60
+ }
61
+
62
+ /// Shell state (env vars, cwd) is preserved across mount operations.
63
+ async fn state_preservation() -> anyhow::Result<()> {
64
+ println!("--- State Preservation ---");
65
+
66
+ let mut bash = Bash::builder().env("APP_ENV", "production").build();
67
+
68
+ // Set up shell state
69
+ bash.exec("export SESSION_ID=abc123").await?;
70
+ bash.exec("cd /tmp").await?;
71
+ bash.exec("counter=0").await?;
72
+
73
+ println!("Before mount:");
74
+ let result = bash
75
+ .exec("echo env=$APP_ENV session=$SESSION_ID cwd=$(pwd)")
76
+ .await?;
77
+ print!(" {}", result.stdout);
78
+
79
+ // Mount a plugin filesystem
80
+ let plugin_fs = Arc::new(InMemoryFs::new());
81
+ plugin_fs
82
+ .write_file(Path::new("/init.sh"), b"echo 'Plugin loaded'")
83
+ .await?;
84
+ bash.mount("/plugins/auth", plugin_fs)?;
85
+
86
+ println!("After mount:");
87
+ let result = bash
88
+ .exec("echo env=$APP_ENV session=$SESSION_ID cwd=$(pwd)")
89
+ .await?;
90
+ print!(" {}", result.stdout);
91
+
92
+ // Use the mount
93
+ let result = bash.exec("source /plugins/auth/init.sh").await?;
94
+ println!(" Plugin: {}", result.stdout.trim());
95
+
96
+ // Unmount — state still preserved
97
+ bash.unmount("/plugins/auth")?;
98
+
99
+ println!("After unmount:");
100
+ let result = bash
101
+ .exec("echo env=$APP_ENV session=$SESSION_ID cwd=$(pwd)")
102
+ .await?;
103
+ print!(" {}", result.stdout);
104
+
105
+ Ok(())
106
+ }
107
+
108
+ /// Hot-swap a mounted filesystem to simulate a rolling update.
109
+ async fn hot_swap_mount() -> anyhow::Result<()> {
110
+ println!("--- Hot-Swap Mount ---");
111
+
112
+ let mut bash = Bash::new();
113
+
114
+ // Version 1
115
+ let v1 = Arc::new(InMemoryFs::new());
116
+ v1.write_file(Path::new("/version"), b"1.0.0").await?;
117
+ v1.write_file(Path::new("/greeting"), b"Hello from v1")
118
+ .await?;
119
+
120
+ bash.mount("/app", v1)?;
121
+ let result = bash.exec("cat /app/version").await?;
122
+ println!("App version: {}", result.stdout.trim());
123
+
124
+ // Hot-swap to version 2 — just re-mount at the same path
125
+ let v2 = Arc::new(InMemoryFs::new());
126
+ v2.write_file(Path::new("/version"), b"2.0.0").await?;
127
+ v2.write_file(Path::new("/greeting"), b"Hello from v2")
128
+ .await?;
129
+
130
+ bash.mount("/app", v2)?;
131
+ let result = bash.exec("cat /app/version").await?;
132
+ println!("App version: {}", result.stdout.trim());
133
+
134
+ let result = bash.exec("cat /app/greeting").await?;
135
+ println!("Greeting: {}", result.stdout.trim());
136
+
137
+ Ok(())
138
+ }
@@ -9,7 +9,7 @@ use std::path::Path;
9
9
  use super::{Builtin, Context, ExecutionPlan, SubCommand, resolve_path};
10
10
  use crate::error::Result;
11
11
  use crate::fs::FileType;
12
- use crate::interpreter::ExecResult;
12
+ use crate::interpreter::{ControlFlow, ExecResult};
13
13
 
14
14
  /// Options for ls command
15
15
  struct LsOptions {
@@ -472,10 +472,13 @@ async fn collect_find_paths(
472
472
  for path_str in search_paths {
473
473
  let path = resolve_path(ctx.cwd, path_str);
474
474
  if !ctx.fs.exists(&path).await.unwrap_or(false) {
475
- // Skip non-existent paths in collection phase
476
475
  continue;
477
476
  }
478
- find_recursive(ctx, &path, path_str, &temp_opts, 0, &mut output).await?;
477
+ // Intentionally swallowing errors (`let _ =`) rather than propagating (`?`):
478
+ // this feeds execution_plan(), which is only an optimization hint. Propagating
479
+ // would bubble up as Err and abort the entire command. Real error handling
480
+ // (stderr messages, exit codes) lives in execute(), which is always called.
481
+ let _ = find_recursive(ctx, &path, path_str, &temp_opts, 0, &mut output).await;
479
482
  }
480
483
  // Parse the output back into paths (each line is a path)
481
484
  for line in output.lines() {
@@ -547,24 +550,34 @@ impl Builtin for Find {
547
550
  Err(e) => return Ok(e),
548
551
  };
549
552
 
550
- // Check paths exist
553
+ let mut output = String::new();
554
+ let mut errors = String::new();
555
+ let mut had_error = false;
556
+
551
557
  for path_str in &search_paths {
552
558
  let path = resolve_path(ctx.cwd, path_str);
553
559
  if !ctx.fs.exists(&path).await.unwrap_or(false) {
554
- return Ok(ExecResult::err(
555
- format!("find: '{}': No such file or directory\n", path_str),
556
- 1,
560
+ errors.push_str(&format!(
561
+ "find: '{}': No such file or directory\n",
562
+ path_str
557
563
  ));
564
+ had_error = true;
565
+ continue;
558
566
  }
559
- }
560
567
 
561
- let mut output = String::new();
562
- for path_str in &search_paths {
563
- let path = resolve_path(ctx.cwd, path_str);
564
- find_recursive(&ctx, &path, path_str, &opts, 0, &mut output).await?;
568
+ if let Err(e) = find_recursive(&ctx, &path, path_str, &opts, 0, &mut output).await {
569
+ errors.push_str(&format!("find: '{}': {}\n", path_str, e));
570
+ had_error = true;
571
+ }
565
572
  }
566
573
 
567
- Ok(ExecResult::ok(output))
574
+ Ok(ExecResult {
575
+ stdout: output,
576
+ stderr: errors,
577
+ exit_code: if had_error { 1 } else { 0 },
578
+ control_flow: ControlFlow::None,
579
+ ..Default::default()
580
+ })
568
581
  }
569
582
 
570
583
  async fn execution_plan(&self, ctx: &Context<'_>) -> Result<Option<ExecutionPlan>> {
@@ -578,15 +591,7 @@ impl Builtin for Find {
578
591
  return Ok(None);
579
592
  }
580
593
 
581
- // Check paths exist
582
- for path_str in &search_paths {
583
- let path = resolve_path(ctx.cwd, path_str);
584
- if !ctx.fs.exists(&path).await.unwrap_or(false) {
585
- return Ok(None); // Let execute() handle errors
586
- }
587
- }
588
-
589
- // Collect matched paths
594
+ // Collect matched paths (collect_find_paths skips missing paths)
590
595
  let matched_paths = collect_find_paths(ctx, &search_paths, &opts).await?;
591
596
  if matched_paths.is_empty() {
592
597
  return Ok(None);
@@ -490,6 +490,12 @@ impl FileSystemExt for MountableFs {
490
490
  // Return root filesystem limits as the overall limits
491
491
  self.root.limits()
492
492
  }
493
+
494
+ async fn mkfifo(&self, path: &Path, mode: u32) -> Result<()> {
495
+ self.validate_path(path)?;
496
+ let (fs, resolved) = self.resolve(path);
497
+ fs.mkfifo(&resolved, mode).await
498
+ }
493
499
  }
494
500
 
495
501
  #[cfg(test)]