bashkit 0.7.2__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. {bashkit-0.7.2 → bashkit-0.8.0}/Cargo.lock +30 -22
  2. {bashkit-0.7.2 → bashkit-0.8.0}/Cargo.toml +1 -1
  3. {bashkit-0.7.2 → bashkit-0.8.0}/PKG-INFO +1 -1
  4. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/Cargo.toml +1 -1
  5. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/README.md +4 -4
  6. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/hooks.md +2 -2
  7. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/python.md +19 -15
  8. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/threat-model.md +2 -2
  9. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/python.rs +121 -10
  10. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/rg/mod.rs +59 -24
  11. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/interpreter/mod.rs +130 -2
  12. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/tool.rs +2 -2
  13. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/python_integration_tests.rs +113 -0
  14. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/python_security_tests.rs +2 -2
  15. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/threat_model_tests.rs +39 -2
  16. {bashkit-0.7.2 → bashkit-0.8.0}/README.md +0 -0
  17. {bashkit-0.7.2 → bashkit-0.8.0}/bashkit/__init__.py +0 -0
  18. {bashkit-0.7.2 → bashkit-0.8.0}/bashkit/_bashkit.pyi +0 -0
  19. {bashkit-0.7.2 → bashkit-0.8.0}/bashkit/deepagents.py +0 -0
  20. {bashkit-0.7.2 → bashkit-0.8.0}/bashkit/langchain.py +0 -0
  21. {bashkit-0.7.2 → bashkit-0.8.0}/bashkit/py.typed +0 -0
  22. {bashkit-0.7.2 → bashkit-0.8.0}/bashkit/pydantic_ai.py +0 -0
  23. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/benches/file_ops.rs +0 -0
  24. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/benches/hotpath.rs +0 -0
  25. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/benches/parallel_execution.rs +0 -0
  26. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/benches/results/README.md +0 -0
  27. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/benches/results/criterion-file_ops-linux-x86_64-1779759850.md +0 -0
  28. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/benches/results/criterion-hotpath-attrs+shopt-linux-x86_64-1779759850.md +0 -0
  29. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/benches/results/criterion-hotpath-perf-linux-x86_64-1779744742.md +0 -0
  30. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/benches/results/criterion-parallel-(none)-linux-x86_64-1773469129.md +0 -0
  31. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/benches/results/criterion-sqlite-vm-linux-x86_64-1777865268.md +0 -0
  32. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/benches/sqlite.rs +0 -0
  33. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/clap-builtins.md +0 -0
  34. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/compatibility.md +0 -0
  35. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/credential-injection.md +0 -0
  36. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/custom_builtins.md +0 -0
  37. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/jq.md +0 -0
  38. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/live_mounts.md +0 -0
  39. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/logging.md +0 -0
  40. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/sqlite.md +0 -0
  41. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/ssh.md +0 -0
  42. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/docs/typescript.md +0 -0
  43. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/agent_tool.rs +0 -0
  44. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/basic.rs +0 -0
  45. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/clap_builtin.rs +0 -0
  46. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/clap_builtin_subcommands.rs +0 -0
  47. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/custom_backend.rs +0 -0
  48. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/custom_builtins.rs +0 -0
  49. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/custom_filesystem_impl.rs +0 -0
  50. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/custom_fs.rs +0 -0
  51. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/git_workflow.rs +0 -0
  52. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/live_mounts.rs +0 -0
  53. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/python_external_functions.rs +0 -0
  54. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/python_scripts.rs +0 -0
  55. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/realfs_readonly.rs +0 -0
  56. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/realfs_readwrite.rs +0 -0
  57. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/resource_limits.rs +0 -0
  58. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/scripted_tool.rs +0 -0
  59. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/show_tool_output.rs +0 -0
  60. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/sqlite_basic.rs +0 -0
  61. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/sqlite_workflow.rs +0 -0
  62. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/ssh_supabase.rs +0 -0
  63. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/streaming_output.rs +0 -0
  64. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/text_files.rs +0 -0
  65. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/text_processing.rs +0 -0
  66. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/typescript_external_functions.rs +0 -0
  67. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/typescript_scripts.rs +0 -0
  68. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/examples/virtual_identity.rs +0 -0
  69. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/out file.txt +0 -0
  70. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/proptest-regressions/builtins/sqlite/tests.txt +0 -0
  71. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/alias.rs +0 -0
  72. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/archive.rs +0 -0
  73. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/arg_parser.rs +0 -0
  74. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/assert.rs +0 -0
  75. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/awk/interpreter.rs +0 -0
  76. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/awk/mod.rs +0 -0
  77. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/awk/parser.rs +0 -0
  78. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/awk/tests.rs +0 -0
  79. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/base64.rs +0 -0
  80. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/bc.rs +0 -0
  81. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/caller.rs +0 -0
  82. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/cat.rs +0 -0
  83. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/checksum.rs +0 -0
  84. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/clap_env.rs +0 -0
  85. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/clear.rs +0 -0
  86. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/column.rs +0 -0
  87. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/comm.rs +0 -0
  88. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/compgen.rs +0 -0
  89. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/csv.rs +0 -0
  90. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/curl.rs +0 -0
  91. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/cuttr.rs +0 -0
  92. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/date.rs +0 -0
  93. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/diff.rs +0 -0
  94. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/dirstack.rs +0 -0
  95. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/disk.rs +0 -0
  96. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/dotenv.rs +0 -0
  97. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/echo.rs +0 -0
  98. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/environ.rs +0 -0
  99. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/envsubst.rs +0 -0
  100. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/expand.rs +0 -0
  101. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/export.rs +0 -0
  102. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/expr.rs +0 -0
  103. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/fc.rs +0 -0
  104. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/fileops.rs +0 -0
  105. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/flow.rs +0 -0
  106. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/fold.rs +0 -0
  107. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/cat_args.rs +0 -0
  108. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/extendedbigdecimal.rs +0 -0
  109. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/format/argument.rs +0 -0
  110. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/format/escape.rs +0 -0
  111. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/format/human.rs +0 -0
  112. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/format/mod.rs +0 -0
  113. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/format/num_format.rs +0 -0
  114. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/format/spec.rs +0 -0
  115. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/format_support.rs +0 -0
  116. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/ls_args.rs +0 -0
  117. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/mktemp_args.rs +0 -0
  118. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/mod.rs +0 -0
  119. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/num_parser.rs +0 -0
  120. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/od_args.rs +0 -0
  121. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/readlink_args.rs +0 -0
  122. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/realpath_args.rs +0 -0
  123. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/shuf_args.rs +0 -0
  124. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/stat_args.rs +0 -0
  125. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/tac_args.rs +0 -0
  126. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/tee_args.rs +0 -0
  127. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/generated/truncate_args.rs +0 -0
  128. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/git/client.rs +0 -0
  129. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/git/cmd.rs +0 -0
  130. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/git/config.rs +0 -0
  131. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/git/mod.rs +0 -0
  132. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/glob_cmd.rs +0 -0
  133. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/grep.rs +0 -0
  134. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/headtail.rs +0 -0
  135. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/help.rs +0 -0
  136. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/helpers.rs +0 -0
  137. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/hextools.rs +0 -0
  138. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/http.rs +0 -0
  139. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/iconv.rs +0 -0
  140. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/inspect.rs +0 -0
  141. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/introspect.rs +0 -0
  142. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/join.rs +0 -0
  143. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/jq/args.rs +0 -0
  144. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/jq/compat.rs +0 -0
  145. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/jq/convert.rs +0 -0
  146. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/jq/errors.rs +0 -0
  147. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/jq/format.rs +0 -0
  148. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/jq/mod.rs +0 -0
  149. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/jq/regex_compat.rs +0 -0
  150. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/jq/tests.rs +0 -0
  151. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/json.rs +0 -0
  152. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/limits.rs +0 -0
  153. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/log.rs +0 -0
  154. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ls/find.rs +0 -0
  155. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ls/glob.rs +0 -0
  156. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ls/list.rs +0 -0
  157. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ls/mod.rs +0 -0
  158. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ls/rmdir.rs +0 -0
  159. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ls/tests.rs +0 -0
  160. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/mapfile.rs +0 -0
  161. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/mkfifo.rs +0 -0
  162. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/mod.rs +0 -0
  163. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/navigation.rs +0 -0
  164. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/nl.rs +0 -0
  165. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/numfmt.rs +0 -0
  166. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/parallel.rs +0 -0
  167. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/paste.rs +0 -0
  168. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/patch.rs +0 -0
  169. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/path.rs +0 -0
  170. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/pipeline.rs +0 -0
  171. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/printf.rs +0 -0
  172. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/read.rs +0 -0
  173. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/retry.rs +0 -0
  174. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/search_common.rs +0 -0
  175. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/sed.rs +0 -0
  176. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/semver.rs +0 -0
  177. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/seq.rs +0 -0
  178. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/shuf.rs +0 -0
  179. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/sleep.rs +0 -0
  180. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/sortuniq.rs +0 -0
  181. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/source.rs +0 -0
  182. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/split.rs +0 -0
  183. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/sqlite/dot_commands.rs +0 -0
  184. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/sqlite/engine.rs +0 -0
  185. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/sqlite/formatter.rs +0 -0
  186. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/sqlite/mod.rs +0 -0
  187. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/sqlite/parser.rs +0 -0
  188. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/sqlite/tests.rs +0 -0
  189. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/sqlite/vfs_io.rs +0 -0
  190. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ssh/allowlist.rs +0 -0
  191. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ssh/client.rs +0 -0
  192. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ssh/cmd.rs +0 -0
  193. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ssh/config.rs +0 -0
  194. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ssh/handler.rs +0 -0
  195. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ssh/mod.rs +0 -0
  196. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/ssh/russh_handler.rs +0 -0
  197. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/strings.rs +0 -0
  198. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/system.rs +0 -0
  199. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/template.rs +0 -0
  200. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/test.rs +0 -0
  201. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/textrev.rs +0 -0
  202. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/timeout.rs +0 -0
  203. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/tomlq.rs +0 -0
  204. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/trap.rs +0 -0
  205. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/tree.rs +0 -0
  206. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/truncate.rs +0 -0
  207. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/typescript.rs +0 -0
  208. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/vars.rs +0 -0
  209. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/verify.rs +0 -0
  210. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/wait.rs +0 -0
  211. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/wc.rs +0 -0
  212. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/yaml.rs +0 -0
  213. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/yes.rs +0 -0
  214. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/builtins/zip_cmd.rs +0 -0
  215. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/credential.rs +0 -0
  216. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/error.rs +0 -0
  217. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/backend.rs +0 -0
  218. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/limits.rs +0 -0
  219. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/memory.rs +0 -0
  220. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/mod.rs +0 -0
  221. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/mountable.rs +0 -0
  222. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/overlay.rs +0 -0
  223. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/posix.rs +0 -0
  224. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/readonly.rs +0 -0
  225. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/realfs.rs +0 -0
  226. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/search.rs +0 -0
  227. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/fs/traits.rs +0 -0
  228. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/hooks.rs +0 -0
  229. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/interop/fs.rs +0 -0
  230. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/interop/mod.rs +0 -0
  231. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/interpreter/glob.rs +0 -0
  232. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/interpreter/jobs.rs +0 -0
  233. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/interpreter/state.rs +0 -0
  234. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/lib.rs +0 -0
  235. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/limits.rs +0 -0
  236. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/logging_impl.rs +0 -0
  237. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/network/allowlist.rs +0 -0
  238. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/network/bot_auth.rs +0 -0
  239. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/network/client.rs +0 -0
  240. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/network/mod.rs +0 -0
  241. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/parser/ast.rs +0 -0
  242. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/parser/budget.rs +0 -0
  243. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/parser/lexer.rs +0 -0
  244. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/parser/mod.rs +0 -0
  245. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/parser/span.rs +0 -0
  246. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/parser/tokens.rs +0 -0
  247. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/scripted_tool/execute.rs +0 -0
  248. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/scripted_tool/extension.rs +0 -0
  249. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/scripted_tool/mod.rs +0 -0
  250. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/scripted_tool/toolset.rs +0 -0
  251. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/snapshot.rs +0 -0
  252. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/testing.rs +0 -0
  253. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/tool_def.rs +0 -0
  254. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/src/trace.rs +0 -0
  255. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/agent_skills_publication_tests.rs +0 -0
  256. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/allexport_tests.rs +0 -0
  257. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/awk_fuzz_scaffold_tests.rs +0 -0
  258. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/awk_newline_tests.rs +0 -0
  259. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/awk_pattern_tests.rs +0 -0
  260. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/awk_printf_expr_test.rs +0 -0
  261. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/awk_range_pattern_tests.rs +0 -0
  262. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/background_exec_tests.rs +0 -0
  263. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/bash_source_tests.rs +0 -0
  264. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/blackbox_security_tests.rs +0 -0
  265. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/builtin_error_security_tests.rs +0 -0
  266. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/builtin_registry_tests.rs +0 -0
  267. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/byte_range_panic_tests.rs +0 -0
  268. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/cancellation_tests.rs +0 -0
  269. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/cmdsub_quote_test.rs +0 -0
  270. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/coproc_tests.rs +0 -0
  271. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/coreutils_differential_tests.rs +0 -0
  272. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/credential_injection_tests.rs +0 -0
  273. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/custom_builtins_tests.rs +0 -0
  274. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/custom_fs_tests.rs +0 -0
  275. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/dev_null_tests.rs +0 -0
  276. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/final_env_tests.rs +0 -0
  277. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/find_multi_path_tests.rs +0 -0
  278. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/git_advanced_tests.rs +0 -0
  279. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/git_inspection_tests.rs +0 -0
  280. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/git_integration_tests.rs +0 -0
  281. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/git_remote_security_tests.rs +0 -0
  282. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/git_security_tests.rs +0 -0
  283. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/harness_example_tests.rs +0 -0
  284. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/history_tests.rs +0 -0
  285. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_1175_test.rs +0 -0
  286. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_1776_test.rs +0 -0
  287. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_1777_test.rs +0 -0
  288. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_274_test.rs +0 -0
  289. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_275_279_282_test.rs +0 -0
  290. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_276_test.rs +0 -0
  291. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_277_test.rs +0 -0
  292. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_289_test.rs +0 -0
  293. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_290_test.rs +0 -0
  294. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_291_test.rs +0 -0
  295. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_853_test.rs +0 -0
  296. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_872_test.rs +0 -0
  297. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_873_test.rs +0 -0
  298. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/issue_875_test.rs +0 -0
  299. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/jq_fuzz_scaffold_tests.rs +0 -0
  300. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/live_mount_tests.rs +0 -0
  301. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/main.rs +0 -0
  302. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/mkfifo_tests.rs +0 -0
  303. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/nested_subscript_tests.rs +0 -0
  304. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/network_security_tests.rs +0 -0
  305. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/output_truncation_tests.rs +0 -0
  306. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/proptest_differential.rs +0 -0
  307. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/regex_limit_tests.rs +0 -0
  308. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/release_profile_tests.rs +0 -0
  309. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/script_execution_tests.rs +0 -0
  310. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/security_audit_pocs.rs +0 -0
  311. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/set_e_and_or_tests.rs +0 -0
  312. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/shuf_resource_tests.rs +0 -0
  313. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/skills_tests.rs +0 -0
  314. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/snapshot_tests.rs +0 -0
  315. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/source_function_tests.rs +0 -0
  316. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/spec_runner.rs +0 -0
  317. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/spec_tests.rs +0 -0
  318. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/sqlite_compat_tests.rs +0 -0
  319. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/sqlite_differential_tests.rs +0 -0
  320. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/sqlite_fuzz_tests.rs +0 -0
  321. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/sqlite_integration_tests.rs +0 -0
  322. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/sqlite_security_tests.rs +0 -0
  323. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/stack_overflow_regression_tests.rs +0 -0
  324. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/subst_depth_limit_tests.rs +0 -0
  325. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/symlink_overlay_security_tests.rs +0 -0
  326. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/tty_tests.rs +0 -0
  327. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/typescript_integration_tests.rs +0 -0
  328. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/typescript_security_tests.rs +0 -0
  329. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/unicode_security_tests.rs +0 -0
  330. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/unset_function_tests.rs +0 -0
  331. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/urandom_tests.rs +0 -0
  332. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/integration/workflow_security_tests.rs +0 -0
  333. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/logging_security_tests.rs +0 -0
  334. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/proptest_security.rs +0 -0
  335. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/realfs_tests.rs +0 -0
  336. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/security_failpoint_tests.rs +0 -0
  337. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/skills_fixtures/azure_discover_rank.sh +0 -0
  338. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/skills_fixtures/azure_generate_url.sh +0 -0
  339. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/skills_fixtures/azure_query_capacity.sh +0 -0
  340. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/skills_fixtures/helm_validate_chart.sh +0 -0
  341. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/skills_fixtures/jwt_test_setup.sh +0 -0
  342. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/skills_fixtures/stitch_download_asset.sh +0 -0
  343. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/skills_fixtures/stitch_fetch.sh +0 -0
  344. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/skills_fixtures/stitch_verify_setup.sh +0 -0
  345. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/skills_fixtures/superpowers_find_polluter.sh +0 -0
  346. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/skills_fixtures/vercel_deploy.sh +0 -0
  347. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/awk/awk.test.sh +0 -0
  348. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/awk/delete-array.test.sh +0 -0
  349. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/awk/dev-stderr.test.sh +0 -0
  350. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/awk/eval-bugs.test.sh +0 -0
  351. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/awk/filename.test.sh +0 -0
  352. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/awk/getline-file.test.sh +0 -0
  353. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/alias.test.sh +0 -0
  354. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/append_redirect.test.sh +0 -0
  355. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/arith-dynamic.test.sh +0 -0
  356. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/arithmetic-base-expansion.test.sh +0 -0
  357. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/arithmetic.test.sh +0 -0
  358. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/array-slicing.test.sh +0 -0
  359. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/array-splat.test.sh +0 -0
  360. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/arrays.test.sh +0 -0
  361. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh +0 -0
  362. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/awk-printf-width.test.sh +0 -0
  363. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/background.test.sh +0 -0
  364. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/bash-c-exports.test.sh +0 -0
  365. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/bash-command.test.sh +0 -0
  366. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/bash-flags.test.sh +0 -0
  367. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/bash-source-var.test.sh +0 -0
  368. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/bash-stdin-pipe.test.sh +0 -0
  369. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/bc.test.sh +0 -0
  370. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/blackbox-edge-cases.test.sh +0 -0
  371. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/blackbox-exploration.test.sh +0 -0
  372. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/brace-expansion.test.sh +0 -0
  373. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/brace_expansion_lookahead.test.sh +0 -0
  374. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/cat.test.sh +0 -0
  375. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/checksum.test.sh +0 -0
  376. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/chown-kill.test.sh +0 -0
  377. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/cmd-suggestions.test.sh +0 -0
  378. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/cmdsub_depth_unquoted.test.sh +0 -0
  379. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/column.test.sh +0 -0
  380. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/comm.test.sh +0 -0
  381. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/command-not-found.test.sh +0 -0
  382. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/command-subst.test.sh +0 -0
  383. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/command.test.sh +0 -0
  384. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/command_v.test.sh +0 -0
  385. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/compgen-path.test.sh +0 -0
  386. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/conditional-short-circuit.test.sh +0 -0
  387. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/conditional.test.sh +0 -0
  388. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/control-flow.test.sh +0 -0
  389. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/cuttr.test.sh +0 -0
  390. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/date.test.sh +0 -0
  391. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/declare.test.sh +0 -0
  392. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/df.test.sh +0 -0
  393. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/diff.test.sh +0 -0
  394. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/dirstack.test.sh +0 -0
  395. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/du.test.sh +0 -0
  396. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/echo.test.sh +0 -0
  397. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/empty-bodies.test.sh +0 -0
  398. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/env.test.sh +0 -0
  399. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/errexit.test.sh +0 -0
  400. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/eval-bugs.test.sh +0 -0
  401. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/exec-command.test.sh +0 -0
  402. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/exec-fd-redirect.test.sh +0 -0
  403. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/exec-fd-variable.test.sh +0 -0
  404. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/exit-status.test.sh +0 -0
  405. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/expr.test.sh +0 -0
  406. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/extglob.test.sh +0 -0
  407. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/file.test.sh +0 -0
  408. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/fileops.test.sh +0 -0
  409. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/find.test.sh +0 -0
  410. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/functions.test.sh +0 -0
  411. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/getopts.test.sh +0 -0
  412. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/glob-options.test.sh +0 -0
  413. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/glob_match_cap.test.sh +0 -0
  414. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/globs.test.sh +0 -0
  415. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/gzip.test.sh +0 -0
  416. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/headtail.test.sh +0 -0
  417. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/help-flag.test.sh +0 -0
  418. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/heredoc-edge.test.sh +0 -0
  419. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/heredoc.test.sh +0 -0
  420. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/herestring.test.sh +0 -0
  421. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/hextools.test.sh +0 -0
  422. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/history.test.sh +0 -0
  423. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/indirect-expansion.test.sh +0 -0
  424. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/less.test.sh +0 -0
  425. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/ln.test.sh +0 -0
  426. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/ls.test.sh +0 -0
  427. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/memory_budget_desync.test.sh +0 -0
  428. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/mktemp.test.sh +0 -0
  429. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +0 -0
  430. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/nameref.test.sh +0 -0
  431. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/negative-tests.test.sh +0 -0
  432. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/nl.test.sh +0 -0
  433. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/nounset.test.sh +0 -0
  434. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/numfmt.test.sh +0 -0
  435. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/od.test.sh +0 -0
  436. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/parse-errors.test.sh +0 -0
  437. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/paste-flags.test.sh +0 -0
  438. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/paste.test.sh +0 -0
  439. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/path.test.sh +0 -0
  440. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/pipes-redirects.test.sh +0 -0
  441. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/printenv.test.sh +0 -0
  442. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/printf.test.sh +0 -0
  443. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/procsub.test.sh +0 -0
  444. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/quote.test.sh +0 -0
  445. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/read-builtin.test.sh +0 -0
  446. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/readlink.test.sh +0 -0
  447. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/recursive-cmdsub.test.sh +0 -0
  448. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/regex-limit.test.sh +0 -0
  449. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/replace_pattern_limit.test.sh +0 -0
  450. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/script-exec.test.sh +0 -0
  451. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/seq.test.sh +0 -0
  452. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/set-allexport.test.sh +0 -0
  453. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/shell-grammar.test.sh +0 -0
  454. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/shuf.test.sh +0 -0
  455. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/sleep.test.sh +0 -0
  456. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/sortuniq.test.sh +0 -0
  457. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/source.test.sh +0 -0
  458. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/stat.test.sh +0 -0
  459. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/string-ops.test.sh +0 -0
  460. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/strings.test.sh +0 -0
  461. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/subprocess-isolation.test.sh +0 -0
  462. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/subshell.test.sh +0 -0
  463. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/tar.test.sh +0 -0
  464. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/tar_create.test.sh +0 -0
  465. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/tee.test.sh +0 -0
  466. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/temp-binding.test.sh +0 -0
  467. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/test-operators.test.sh +0 -0
  468. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/test-tty.test.sh +0 -0
  469. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/textrev.test.sh +0 -0
  470. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/time.test.sh +0 -0
  471. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/timeout.test.sh +0 -0
  472. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/tree.test.sh +0 -0
  473. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/truncate.test.sh +0 -0
  474. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/type.test.sh +0 -0
  475. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/unicode.test.sh +0 -0
  476. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/unset-exported-var.test.sh +0 -0
  477. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/var-op-test.test.sh +0 -0
  478. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/variables.test.sh +0 -0
  479. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/wait.test.sh +0 -0
  480. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/watch.test.sh +0 -0
  481. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/wc.test.sh +0 -0
  482. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/word-split.test.sh +0 -0
  483. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/bash/xargs.test.sh +0 -0
  484. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/grep/eval-bugs.test.sh +0 -0
  485. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/grep/grep.test.sh +0 -0
  486. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/grep/rg.test.sh +0 -0
  487. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/jq/jq.test.sh +0 -0
  488. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/python/env_leak.test.sh +0 -0
  489. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/python/python.test.sh +0 -0
  490. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/sed/eval-bugs.test.sh +0 -0
  491. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/sed/sed.test.sh +0 -0
  492. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/spec_cases/typescript/typescript.test.sh +0 -0
  493. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/ssh_builtin_tests.rs +0 -0
  494. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit/tests/ssh_supabase_tests.rs +0 -0
  495. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/Cargo.toml +0 -0
  496. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/README.md +0 -0
  497. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/examples/bash_basics.py +0 -0
  498. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/examples/custom_filesystem_interop.py +0 -0
  499. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/examples/data_pipeline.py +0 -0
  500. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/examples/fastapi_async_tool.py +0 -0
  501. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/examples/jupyter_async_test.ipynb +0 -0
  502. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/examples/k8s_orchestrator.py +0 -0
  503. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/examples/langgraph_async_tool.py +0 -0
  504. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/examples/llm_tool.py +0 -0
  505. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/src/lib.rs +0 -0
  506. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/_bashkit_categories.py +0 -0
  507. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/_security_advanced.py +0 -0
  508. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/_security_core.py +0 -0
  509. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_ai_adapters.py +0 -0
  510. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_async_callbacks.py +0 -0
  511. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_basic.py +0 -0
  512. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_builtins.py +0 -0
  513. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_control_flow.py +0 -0
  514. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_error_handling.py +0 -0
  515. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_fastapi_integration.py +0 -0
  516. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_filesystem_interop.py +0 -0
  517. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_integration.py +0 -0
  518. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_jupyter_compat.py +0 -0
  519. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_langgraph_integration.py +0 -0
  520. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_network_config.py +0 -0
  521. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_network_credentials.py +0 -0
  522. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_python_security.py +0 -0
  523. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_registered_tools.py +0 -0
  524. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_scripts.py +0 -0
  525. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_security.py +0 -0
  526. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_shell_injection.py +0 -0
  527. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_sqlite.py +0 -0
  528. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_streaming_output.py +0 -0
  529. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_strings_and_quoting.py +0 -0
  530. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_tool_metadata.py +0 -0
  531. {bashkit-0.7.2 → bashkit-0.8.0}/crates/bashkit-python/tests/test_vfs.py +0 -0
  532. {bashkit-0.7.2 → bashkit-0.8.0}/pyproject.toml +0 -0
@@ -345,7 +345,7 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
345
345
 
346
346
  [[package]]
347
347
  name = "bashkit"
348
- version = "0.7.2"
348
+ version = "0.8.0"
349
349
  dependencies = [
350
350
  "anyhow",
351
351
  "async-trait",
@@ -398,7 +398,7 @@ dependencies = [
398
398
 
399
399
  [[package]]
400
400
  name = "bashkit-bench"
401
- version = "0.7.2"
401
+ version = "0.8.0"
402
402
  dependencies = [
403
403
  "anyhow",
404
404
  "bashkit",
@@ -412,7 +412,7 @@ dependencies = [
412
412
 
413
413
  [[package]]
414
414
  name = "bashkit-cli"
415
- version = "0.7.2"
415
+ version = "0.8.0"
416
416
  dependencies = [
417
417
  "anyhow",
418
418
  "bashkit",
@@ -426,7 +426,7 @@ dependencies = [
426
426
 
427
427
  [[package]]
428
428
  name = "bashkit-coreutils-port"
429
- version = "0.7.2"
429
+ version = "0.8.0"
430
430
  dependencies = [
431
431
  "anyhow",
432
432
  "prettyplease",
@@ -440,7 +440,7 @@ dependencies = [
440
440
 
441
441
  [[package]]
442
442
  name = "bashkit-eval"
443
- version = "0.7.2"
443
+ version = "0.8.0"
444
444
  dependencies = [
445
445
  "anyhow",
446
446
  "async-trait",
@@ -457,7 +457,7 @@ dependencies = [
457
457
 
458
458
  [[package]]
459
459
  name = "bashkit-js"
460
- version = "0.7.2"
460
+ version = "0.8.0"
461
461
  dependencies = [
462
462
  "bashkit",
463
463
  "napi",
@@ -469,7 +469,7 @@ dependencies = [
469
469
 
470
470
  [[package]]
471
471
  name = "bashkit-python"
472
- version = "0.7.2"
472
+ version = "0.8.0"
473
473
  dependencies = [
474
474
  "bashkit",
475
475
  "num-bigint",
@@ -1745,9 +1745,9 @@ dependencies = [
1745
1745
 
1746
1746
  [[package]]
1747
1747
  name = "get-size-derive2"
1748
- version = "0.7.4"
1748
+ version = "0.9.0"
1749
1749
  source = "registry+https://github.com/rust-lang/crates.io-index"
1750
- checksum = "f2b6d1e2f75c16bfbcd0f95d84f99858a6e2f885c2287d1f5c3a96e8444a34b4"
1750
+ checksum = "c9f8ab1b98a1284961d722ce994d9a0f3018ab1917618d4113824a72b9f71bc9"
1751
1751
  dependencies = [
1752
1752
  "attribute-derive",
1753
1753
  "quote",
@@ -1756,15 +1756,16 @@ dependencies = [
1756
1756
 
1757
1757
  [[package]]
1758
1758
  name = "get-size2"
1759
- version = "0.7.4"
1759
+ version = "0.9.0"
1760
1760
  source = "registry+https://github.com/rust-lang/crates.io-index"
1761
- checksum = "49cf31a6d70300cf81461098f7797571362387ef4bf85d32ac47eaa59b3a5a1a"
1761
+ checksum = "b0cd0777a1057362cab35a779e0d79dacecb8d73e2c733eaafeb7ea917b08f03"
1762
1762
  dependencies = [
1763
1763
  "compact_str",
1764
1764
  "get-size-derive2",
1765
- "hashbrown 0.16.1",
1765
+ "hashbrown 0.17.1",
1766
1766
  "ordermap",
1767
1767
  "smallvec",
1768
+ "thin-vec",
1768
1769
  ]
1769
1770
 
1770
1771
  [[package]]
@@ -2442,9 +2443,9 @@ dependencies = [
2442
2443
 
2443
2444
  [[package]]
2444
2445
  name = "jiter"
2445
- version = "0.13.0"
2446
+ version = "0.15.0"
2446
2447
  source = "registry+https://github.com/rust-lang/crates.io-index"
2447
- checksum = "020ba671987d7444d251d3ee5340be1bf4606cd6c0b53e6f4066b5a1ee376b22"
2448
+ checksum = "7866f284df68dbc242796251ed9768bde2b58ebc4d7d32cc07cc7fd993e3ed6c"
2448
2449
  dependencies = [
2449
2450
  "ahash",
2450
2451
  "bitvec",
@@ -2811,10 +2812,9 @@ dependencies = [
2811
2812
  [[package]]
2812
2813
  name = "monty"
2813
2814
  version = "0.0.17"
2814
- source = "git+https://github.com/pydantic/monty?rev=49faa4c#49faa4c8ae94490eae286e76259adcc35f64f0a5"
2815
+ source = "git+https://github.com/pydantic/monty?rev=9b5f478#9b5f478288e8c1c0198ec4af60049738f93652c1"
2815
2816
  dependencies = [
2816
2817
  "ahash",
2817
- "bytemuck",
2818
2818
  "chrono",
2819
2819
  "fancy-regex 0.17.0",
2820
2820
  "hashbrown 0.16.1",
@@ -4200,7 +4200,7 @@ dependencies = [
4200
4200
  [[package]]
4201
4201
  name = "ruff_python_ast"
4202
4202
  version = "0.0.0"
4203
- source = "git+https://github.com/astral-sh/ruff.git?rev=6ded4bed1651e30b34dd04cdaa50c763036abb0d#6ded4bed1651e30b34dd04cdaa50c763036abb0d"
4203
+ source = "git+https://github.com/samuelcolvin/ruff.git?rev=6aaa91ac2b269df1414954ccd5134f0e6f5c6d30#6aaa91ac2b269df1414954ccd5134f0e6f5c6d30"
4204
4204
  dependencies = [
4205
4205
  "aho-corasick",
4206
4206
  "bitflags",
@@ -4212,13 +4212,14 @@ dependencies = [
4212
4212
  "ruff_source_file",
4213
4213
  "ruff_text_size",
4214
4214
  "rustc-hash",
4215
+ "thin-vec",
4215
4216
  "thiserror 2.0.18",
4216
4217
  ]
4217
4218
 
4218
4219
  [[package]]
4219
4220
  name = "ruff_python_parser"
4220
4221
  version = "0.0.0"
4221
- source = "git+https://github.com/astral-sh/ruff.git?rev=6ded4bed1651e30b34dd04cdaa50c763036abb0d#6ded4bed1651e30b34dd04cdaa50c763036abb0d"
4222
+ source = "git+https://github.com/samuelcolvin/ruff.git?rev=6aaa91ac2b269df1414954ccd5134f0e6f5c6d30#6aaa91ac2b269df1414954ccd5134f0e6f5c6d30"
4222
4223
  dependencies = [
4223
4224
  "bitflags",
4224
4225
  "bstr",
@@ -4230,6 +4231,7 @@ dependencies = [
4230
4231
  "ruff_text_size",
4231
4232
  "rustc-hash",
4232
4233
  "static_assertions",
4234
+ "thin-vec",
4233
4235
  "unicode-ident",
4234
4236
  "unicode-normalization",
4235
4237
  "unicode_names2",
@@ -4238,7 +4240,7 @@ dependencies = [
4238
4240
  [[package]]
4239
4241
  name = "ruff_python_stdlib"
4240
4242
  version = "0.0.0"
4241
- source = "git+https://github.com/astral-sh/ruff.git?rev=6ded4bed1651e30b34dd04cdaa50c763036abb0d#6ded4bed1651e30b34dd04cdaa50c763036abb0d"
4243
+ source = "git+https://github.com/samuelcolvin/ruff.git?rev=6aaa91ac2b269df1414954ccd5134f0e6f5c6d30#6aaa91ac2b269df1414954ccd5134f0e6f5c6d30"
4242
4244
  dependencies = [
4243
4245
  "bitflags",
4244
4246
  "unicode-ident",
@@ -4247,7 +4249,7 @@ dependencies = [
4247
4249
  [[package]]
4248
4250
  name = "ruff_python_trivia"
4249
4251
  version = "0.0.0"
4250
- source = "git+https://github.com/astral-sh/ruff.git?rev=6ded4bed1651e30b34dd04cdaa50c763036abb0d#6ded4bed1651e30b34dd04cdaa50c763036abb0d"
4252
+ source = "git+https://github.com/samuelcolvin/ruff.git?rev=6aaa91ac2b269df1414954ccd5134f0e6f5c6d30#6aaa91ac2b269df1414954ccd5134f0e6f5c6d30"
4251
4253
  dependencies = [
4252
4254
  "itertools 0.14.0",
4253
4255
  "ruff_source_file",
@@ -4258,7 +4260,7 @@ dependencies = [
4258
4260
  [[package]]
4259
4261
  name = "ruff_source_file"
4260
4262
  version = "0.0.0"
4261
- source = "git+https://github.com/astral-sh/ruff.git?rev=6ded4bed1651e30b34dd04cdaa50c763036abb0d#6ded4bed1651e30b34dd04cdaa50c763036abb0d"
4263
+ source = "git+https://github.com/samuelcolvin/ruff.git?rev=6aaa91ac2b269df1414954ccd5134f0e6f5c6d30#6aaa91ac2b269df1414954ccd5134f0e6f5c6d30"
4262
4264
  dependencies = [
4263
4265
  "memchr",
4264
4266
  "ruff_text_size",
@@ -4267,7 +4269,7 @@ dependencies = [
4267
4269
  [[package]]
4268
4270
  name = "ruff_text_size"
4269
4271
  version = "0.0.0"
4270
- source = "git+https://github.com/astral-sh/ruff.git?rev=6ded4bed1651e30b34dd04cdaa50c763036abb0d#6ded4bed1651e30b34dd04cdaa50c763036abb0d"
4272
+ source = "git+https://github.com/samuelcolvin/ruff.git?rev=6aaa91ac2b269df1414954ccd5134f0e6f5c6d30#6aaa91ac2b269df1414954ccd5134f0e6f5c6d30"
4271
4273
  dependencies = [
4272
4274
  "get-size2",
4273
4275
  ]
@@ -5226,6 +5228,12 @@ dependencies = [
5226
5228
  "unicode-width 0.2.2",
5227
5229
  ]
5228
5230
 
5231
+ [[package]]
5232
+ name = "thin-vec"
5233
+ version = "0.2.18"
5234
+ source = "registry+https://github.com/rust-lang/crates.io-index"
5235
+ checksum = "b0f7e269b48f0a7dd0146680fa24b50cc67fc0373f086a5b2f99bd084639b482"
5236
+
5229
5237
  [[package]]
5230
5238
  name = "thiserror"
5231
5239
  version = "1.0.69"
@@ -7,7 +7,7 @@ resolver = "2"
7
7
  members = ["crates/*"]
8
8
 
9
9
  [workspace.package]
10
- version = "0.7.2"
10
+ version = "0.8.0"
11
11
  edition = "2024"
12
12
  license = "MIT"
13
13
  authors = ["Everruns"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bashkit
3
- Version: 0.7.2
3
+ Version: 0.8.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -98,7 +98,7 @@ unit-prefix = "0.5"
98
98
  os_display = "0.1.3"
99
99
 
100
100
  # Embedded Python interpreter (optional)
101
- monty = { git = "https://github.com/pydantic/monty", rev = "49faa4c", optional = true }
101
+ monty = { git = "https://github.com/pydantic/monty", rev = "9b5f478", optional = true }
102
102
 
103
103
  # Embedded TypeScript interpreter (optional)
104
104
  zapcode-core = { version = "1.5", optional = true }
@@ -341,17 +341,17 @@ bash.exec("python3 -c \"print(2 ** 10)\"").await?;
341
341
  // Script files from VFS
342
342
  bash.exec("python3 /tmp/script.py").await?;
343
343
 
344
- // VFS bridging: pathlib.Path operations work with the virtual filesystem
344
+ // VFS bridging: open() and pathlib.Path work with the virtual filesystem
345
345
  bash.exec(r#"python3 -c "
346
- from pathlib import Path
347
- Path('/tmp/data.txt').write_text('hello from python')
346
+ with open('/tmp/data.txt', 'w') as f:
347
+ f.write('hello from python')
348
348
  ""#).await?;
349
349
  bash.exec("cat /tmp/data.txt").await?; // "hello from python"
350
350
  ```
351
351
 
352
352
  Stdlib modules: `math`, `pathlib`, `os` (getenv/environ), `sys`, `typing`.
353
353
  Security note: `re` is intentionally disabled due to regex backtracking DoS risk.
354
- Limitations: no `open()` (use `pathlib.Path`), no network, no classes, no third-party imports.
354
+ Limitations: file I/O is VFS-scoped, no network, no classes, no third-party imports.
355
355
  See [crates/bashkit/docs/python.md](crates/bashkit/docs/python.md) for the full guide.
356
356
 
357
357
  ## Experimental: TypeScript Support
@@ -243,7 +243,7 @@ boundary stays in bashkit — hooks cannot bypass the allowlist.
243
243
 
244
244
  ### `before_http` — Filter or Modify Requests
245
245
 
246
- ```rust
246
+ ```rust,ignore
247
247
  use bashkit::{Bash, NetworkAllowlist, hooks::{HookAction, HttpRequestEvent}};
248
248
 
249
249
  # fn main() {
@@ -266,7 +266,7 @@ let bash = Bash::builder()
266
266
 
267
267
  ### `after_http` — Observe Responses
268
268
 
269
- ```rust
269
+ ```rust,ignore
270
270
  use bashkit::{Bash, NetworkAllowlist, hooks::{HookAction, HttpResponseEvent}};
271
271
  use std::sync::{Arc, Mutex};
272
272
 
@@ -73,16 +73,15 @@ echo "print('piped')" | python3
73
73
 
74
74
  ## Virtual Filesystem (VFS) Bridging
75
75
 
76
- Python `pathlib.Path` operations are bridged to Bashkit's virtual filesystem.
77
- Files created by bash are readable from Python and vice versa.
76
+ Python `open()` and `pathlib.Path` operations are bridged to Bashkit's virtual
77
+ filesystem. Files created by bash are readable from Python and vice versa.
78
78
 
79
79
  ### Bash → Python
80
80
 
81
81
  ```bash
82
82
  echo "important data" > /tmp/shared.txt
83
83
  python3 -c "
84
- from pathlib import Path
85
- content = Path('/tmp/shared.txt').read_text()
84
+ content = open('/tmp/shared.txt').read()
86
85
  print(f'Got: {content.strip()}')
87
86
  "
88
87
  ```
@@ -91,16 +90,20 @@ print(f'Got: {content.strip()}')
91
90
 
92
91
  ```bash
93
92
  python3 -c "
94
- from pathlib import Path
95
- _ = Path('/tmp/result.txt').write_text('computed by python\n')
93
+ with open('/tmp/result.txt', 'w') as f:
94
+ _ = f.write('computed by python\n')
96
95
  "
97
96
  cat /tmp/result.txt
98
97
  ```
99
98
 
100
- ### Supported Path Operations
99
+ ### Supported File Operations
101
100
 
102
101
  | Operation | Example |
103
102
  |-----------|---------|
103
+ | Open/read | `open('f.txt').read()` |
104
+ | Open/write | `open('f.txt', 'w').write('data')` |
105
+ | Open/append | `open('f.txt', 'a').write('more')` |
106
+ | Path open | `Path('f.txt').open('r')` |
104
107
  | Read text | `Path('f.txt').read_text()` |
105
108
  | Read bytes | `Path('f.txt').read_bytes()` |
106
109
  | Write text | `Path('f.txt').write_text('data')` |
@@ -117,7 +120,7 @@ cat /tmp/result.txt
117
120
  ### Architecture
118
121
 
119
122
  ```text
120
- Python code → Monty VM → OsCall(ReadText, path) → Bashkit VFS → resume
123
+ Python code → Monty VM → OsCall(Open/ReadText, path) → Bashkit VFS → resume
121
124
  ```
122
125
 
123
126
  Monty pauses at filesystem operations, Bashkit bridges them to the VFS, then
@@ -169,19 +172,20 @@ let help = tool.help(); // Includes a Markdown Notes section with Python hints
169
172
  ```
170
173
 
171
174
  The builtin's `llm_hint()` is automatically included in the tool's documentation,
172
- so LLMs know not to generate code using `open()`, HTTP requests, or classes.
175
+ so LLMs know file I/O is VFS-scoped and HTTP requests/classes are unavailable.
173
176
 
174
177
  ## Limitations
175
178
 
176
- **No `open()` builtin.** Monty does not implement Python's `open()`. Use `pathlib.Path` instead:
179
+ **VFS-only file I/O.** `open()` and `pathlib.Path` read/write Bashkit's virtual
180
+ filesystem, not the host filesystem:
177
181
 
178
182
  ```python
179
- # Won't work:
180
- # f = open('data.txt')
181
-
182
- # Use instead:
183
183
  from pathlib import Path
184
- content = Path('data.txt').read_text()
184
+
185
+ with open('/tmp/data.txt', 'w') as f:
186
+ f.write('hello')
187
+
188
+ content = Path('/tmp/data.txt').read_text()
185
189
  ```
186
190
 
187
191
  **No HTTP/network.** No `socket`, `urllib`, `requests`, or `http.client` modules.
@@ -554,7 +554,7 @@ attacks:
554
554
  ### Python / Monty Security (TM-PY-*)
555
555
 
556
556
  The `python`/`python3` builtins embed the Monty Python interpreter with VFS bridging.
557
- Python `pathlib.Path` operations are bridged to Bashkit's virtual filesystem.
557
+ Python `pathlib.Path` and `open()` operations are bridged to Bashkit's virtual filesystem.
558
558
 
559
559
  | Threat | Attack Example | Mitigation | Status |
560
560
  |--------|---------------|------------|--------|
@@ -562,7 +562,7 @@ Python `pathlib.Path` operations are bridged to Bashkit's virtual filesystem.
562
562
  | Memory exhaustion (TM-PY-002) | Large allocation | Monty max_memory (64MB) + max_allocations (1M) | MITIGATED |
563
563
  | Stack overflow (TM-PY-003) | Deep recursion | Monty max_recursion (200) | MITIGATED |
564
564
  | Shell escape (TM-PY-004) | `os.system()` | Monty has no os.system/subprocess | MITIGATED |
565
- | Real FS access (TM-PY-005) | `open()` | Monty has no open() builtin | MITIGATED |
565
+ | Real FS access (TM-PY-005) | `open()` | VFS bridge opens only Bashkit VFS files | MITIGATED |
566
566
  | Error info leak (TM-PY-006) | Errors go to stdout | Errors go to stderr, not stdout | MITIGATED |
567
567
  | Real FS read (TM-PY-015) | `Path.read_text()` | VFS bridge reads only from Bashkit VFS | MITIGATED |
568
568
  | Real FS write (TM-PY-016) | `Path.write_text()` | VFS bridge writes only to Bashkit VFS | MITIGATED |
@@ -9,17 +9,21 @@
9
9
  //! # Overview
10
10
  //!
11
11
  //! Virtual Python execution with resource limits and VFS access.
12
- //! Python `pathlib.Path` operations are bridged to Bashkit's virtual filesystem
13
- //! via Monty's OsCall pause/resume mechanism. No real filesystem or network access.
12
+ //! Python `pathlib.Path` operations and `open()` file handles are bridged to
13
+ //! Bashkit's virtual filesystem via Monty's OsCall pause/resume mechanism.
14
+ //! No real filesystem or network access.
15
+ //!
16
+ //! Decision: `open()` performs only VFS open-time effects and returns Monty's
17
+ //! virtual file handle. Bashkit never holds host/native Python file handles.
14
18
  //!
15
19
  //! Supports: `python -c "code"`, `python script.py`, stdin piping.
16
20
 
17
21
  use async_trait::async_trait;
18
22
  use chrono::{Datelike, Timelike};
19
23
  use monty::{
20
- ExcType, ExtFunctionResult, LimitedTracker, MontyDate, MontyDateTime, MontyException,
21
- MontyObject, MontyRun, NameLookupResult, OsFunction, PrintWriter, ResourceLimits, RunProgress,
22
- dir_stat, file_stat, symlink_stat,
24
+ ExcType, ExtFunctionResult, FileMode, LimitedTracker, MontyDate, MontyDateTime, MontyException,
25
+ MontyFileHandle, MontyObject, MontyRun, NameLookupResult, OsFunction, PrintWriter,
26
+ ResourceLimits, RunProgress, dir_stat, file_stat, symlink_stat,
23
27
  };
24
28
  use std::collections::HashMap;
25
29
  use std::future::Future;
@@ -181,8 +185,9 @@ impl std::fmt::Debug for PythonExternalFns {
181
185
  /// The python/python3 builtin command.
182
186
  ///
183
187
  /// Executes Python code using the embedded Monty interpreter (pydantic/monty).
184
- /// Python `pathlib.Path` operations are bridged to Bashkit's VFS — files
185
- /// created by bash (`cat > file`) are readable from Python, and vice versa.
188
+ /// Python `pathlib.Path` and `open()` operations are bridged to Bashkit's VFS
189
+ /// — files created by bash (`cat > file`) are readable from Python, and vice
190
+ /// versa.
186
191
  ///
187
192
  /// # Usage
188
193
  ///
@@ -192,7 +197,7 @@ impl std::fmt::Debug for PythonExternalFns {
192
197
  /// echo "print('hello')" | python3
193
198
  /// python3 -c "2 + 2" # expression result printed
194
199
  /// python3 --version
195
- /// python3 -c "from pathlib import Path; print(Path('/tmp/f.txt').read_text())"
200
+ /// python3 -c "print(open('/tmp/f.txt').read())"
196
201
  /// ```
197
202
  pub struct Python {
198
203
  /// Resource limits for the Monty interpreter.
@@ -306,7 +311,7 @@ impl Builtin for Python {
306
311
  Some(
307
312
  "python/python3: Embedded Python (Monty). \
308
313
  Stdlib: math, pathlib, os.getenv, sys, typing. \
309
- File I/O via pathlib.Path only (no open()). \
314
+ File I/O via pathlib.Path and open() against the VFS. \
310
315
  No HTTP/network. No classes. No third-party imports.",
311
316
  )
312
317
  }
@@ -631,6 +636,20 @@ async fn handle_os_call(
631
636
  };
632
637
 
633
638
  match function {
639
+ OsFunction::Open => {
640
+ let mode = match parse_open_mode(args) {
641
+ Ok(mode) => mode,
642
+ Err(err) => return err,
643
+ };
644
+ match open_vfs_file(&path, mode, fs).await {
645
+ Ok(()) => ExtFunctionResult::Return(MontyObject::FileHandle(MontyFileHandle {
646
+ path: path.to_string_lossy().to_string(),
647
+ mode,
648
+ position: 0,
649
+ })),
650
+ Err(e) => map_vfs_error(e, &path),
651
+ }
652
+ }
634
653
  OsFunction::Exists => {
635
654
  let exists = fs.exists(&path).await.unwrap_or(false);
636
655
  ExtFunctionResult::Return(MontyObject::Bool(exists))
@@ -674,7 +693,10 @@ async fn handle_os_call(
674
693
  ));
675
694
  }
676
695
  };
677
- let len = content.len();
696
+ let len = match args.get(1) {
697
+ Some(MontyObject::String(s)) => s.chars().count(),
698
+ _ => 0,
699
+ };
678
700
  match fs.write_file(&path, &content).await {
679
701
  Ok(()) => ExtFunctionResult::Return(MontyObject::Int(len as i64)),
680
702
  Err(e) => map_vfs_error(e, &path),
@@ -696,6 +718,41 @@ async fn handle_os_call(
696
718
  Err(e) => map_vfs_error(e, &path),
697
719
  }
698
720
  }
721
+ OsFunction::AppendText => {
722
+ let content = match args.get(1) {
723
+ Some(MontyObject::String(s)) => s.as_bytes().to_vec(),
724
+ _ => {
725
+ return ExtFunctionResult::Error(MontyException::new(
726
+ ExcType::TypeError,
727
+ Some("append_text() requires a string argument".into()),
728
+ ));
729
+ }
730
+ };
731
+ let len = match args.get(1) {
732
+ Some(MontyObject::String(s)) => s.chars().count(),
733
+ _ => 0,
734
+ };
735
+ match append_vfs_file(&path, &content, fs).await {
736
+ Ok(()) => ExtFunctionResult::Return(MontyObject::Int(len as i64)),
737
+ Err(e) => map_vfs_error(e, &path),
738
+ }
739
+ }
740
+ OsFunction::AppendBytes => {
741
+ let content = match args.get(1) {
742
+ Some(MontyObject::Bytes(b)) => b.clone(),
743
+ _ => {
744
+ return ExtFunctionResult::Error(MontyException::new(
745
+ ExcType::TypeError,
746
+ Some("append_bytes() requires a bytes argument".into()),
747
+ ));
748
+ }
749
+ };
750
+ let len = content.len();
751
+ match append_vfs_file(&path, &content, fs).await {
752
+ Ok(()) => ExtFunctionResult::Return(MontyObject::Int(len as i64)),
753
+ Err(e) => map_vfs_error(e, &path),
754
+ }
755
+ }
699
756
  OsFunction::Mkdir => {
700
757
  let parents = get_bool_kwarg(kwargs, "parents").unwrap_or(false);
701
758
  let exist_ok = get_bool_kwarg(kwargs, "exist_ok").unwrap_or(false);
@@ -783,10 +840,64 @@ async fn handle_os_call(
783
840
  fn extract_path(args: &[MontyObject], cwd: &Path) -> Option<PathBuf> {
784
841
  match args.first()? {
785
842
  MontyObject::Path(s) | MontyObject::String(s) => Some(resolve_python_path(s, cwd)),
843
+ MontyObject::FileHandle(handle) => Some(resolve_python_path(&handle.path, cwd)),
786
844
  _ => None,
787
845
  }
788
846
  }
789
847
 
848
+ fn parse_open_mode(args: &[MontyObject]) -> std::result::Result<FileMode, ExtFunctionResult> {
849
+ let Some(MontyObject::String(mode)) = args.get(1) else {
850
+ return Err(ExtFunctionResult::Error(MontyException::new(
851
+ ExcType::TypeError,
852
+ Some("open() missing mode argument".into()),
853
+ )));
854
+ };
855
+
856
+ mode.parse::<FileMode>().map_err(|msg| {
857
+ ExtFunctionResult::Error(MontyException::new(
858
+ ExcType::ValueError,
859
+ Some(msg.into_owned()),
860
+ ))
861
+ })
862
+ }
863
+
864
+ async fn open_vfs_file(path: &Path, mode: FileMode, fs: &Arc<dyn FileSystem>) -> Result<()> {
865
+ match mode {
866
+ FileMode::Read(_) | FileMode::ReadUpdate(_) => {
867
+ let meta = fs.stat(path).await?;
868
+ if meta.file_type.is_dir() {
869
+ return Err(std::io::Error::other("is a directory").into());
870
+ }
871
+ }
872
+ FileMode::Write(_) | FileMode::WriteUpdate(_) => {
873
+ fs.write_file(path, b"").await?;
874
+ }
875
+ FileMode::Append(_) | FileMode::AppendUpdate(_) => {
876
+ if fs.exists(path).await.unwrap_or(false) {
877
+ let meta = fs.stat(path).await?;
878
+ if meta.file_type.is_dir() {
879
+ return Err(std::io::Error::other("is a directory").into());
880
+ }
881
+ } else {
882
+ fs.write_file(path, b"").await?;
883
+ }
884
+ }
885
+ }
886
+ Ok(())
887
+ }
888
+
889
+ async fn append_vfs_file(path: &Path, content: &[u8], fs: &Arc<dyn FileSystem>) -> Result<()> {
890
+ let mut existing = match fs.read_file(path).await {
891
+ Ok(bytes) => bytes,
892
+ Err(e) if e.to_string().contains("not found") || e.to_string().contains("No such file") => {
893
+ Vec::new()
894
+ }
895
+ Err(e) => return Err(e),
896
+ };
897
+ existing.extend_from_slice(content);
898
+ fs.write_file(path, &existing).await
899
+ }
900
+
790
901
  /// Resolve a Python path string against cwd if relative.
791
902
  fn resolve_python_path(path_str: &str, cwd: &Path) -> PathBuf {
792
903
  let p = Path::new(path_str);