bashkit 0.17.0__tar.gz → 0.17.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (620) hide show
  1. {bashkit-0.17.0 → bashkit-0.17.1}/Cargo.lock +9 -9
  2. {bashkit-0.17.0 → bashkit-0.17.1}/Cargo.toml +1 -1
  3. {bashkit-0.17.0 → bashkit-0.17.1}/PKG-INFO +1 -1
  4. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/Cargo.toml +4 -0
  5. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/README.md +1 -1
  6. bashkit-0.17.1/crates/bashkit/benches/builtin_args.rs +178 -0
  7. bashkit-0.17.1/crates/bashkit/benches/results/criterion-builtin_args-baseline-linux-x86_64-1787421390.md +93 -0
  8. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/logging.md +1 -1
  9. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/sqlite.md +1 -1
  10. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/cat.rs +6 -7
  11. bashkit-0.17.1/crates/bashkit/src/builtins/clap_cache.rs +131 -0
  12. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/fileops.rs +6 -4
  13. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/hextools.rs +6 -4
  14. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/inspect.rs +6 -4
  15. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/list.rs +7 -7
  16. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/mod.rs +1 -0
  17. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/path.rs +17 -7
  18. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/pipeline.rs +6 -4
  19. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/shuf.rs +6 -4
  20. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/textrev.rs +6 -4
  21. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/truncate.rs +9 -4
  22. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/lib.rs +2 -2
  23. {bashkit-0.17.0 → bashkit-0.17.1}/README.md +0 -0
  24. {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/__init__.py +0 -0
  25. {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/_bashkit.pyi +0 -0
  26. {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/deepagents.py +0 -0
  27. {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/langchain.py +0 -0
  28. {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/py.typed +0 -0
  29. {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/pydantic_ai.py +0 -0
  30. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/awk_regex.rs +0 -0
  31. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/file_ops.rs +0 -0
  32. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/hotpath.rs +0 -0
  33. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/parallel_execution.rs +0 -0
  34. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/README.md +0 -0
  35. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-awk-regex-mykhailos-mini-darwin-arm64-1785952907.md +0 -0
  36. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-file_ops-linux-x86_64-1779759850.md +0 -0
  37. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-hotpath-attrs+shopt-linux-x86_64-1779759850.md +0 -0
  38. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-hotpath-perf-linux-x86_64-1779744742.md +0 -0
  39. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-parallel-(none)-linux-x86_64-1773469129.md +0 -0
  40. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-parallel-vm-linux-x86_64-1782162173.md +0 -0
  41. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-parallel-vm-linux-x86_64-1782168239.md +0 -0
  42. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-snapshot-history-baseline-linux-x86_64-1785444523.md +0 -0
  43. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-sqlite-Mykhailos-Mini.lan-darwin-arm64-1785957173.md +0 -0
  44. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-sqlite-vm-linux-x86_64-1777865268.md +0 -0
  45. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-sqlite-vm-linux-x86_64-1786872580.md +0 -0
  46. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/snapshot_history.rs +0 -0
  47. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/sqlite.rs +0 -0
  48. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/clap-builtins.md +0 -0
  49. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/compatibility.md +0 -0
  50. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/credential-injection.md +0 -0
  51. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/custom_builtins.md +0 -0
  52. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/hooks.md +0 -0
  53. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/jq.md +0 -0
  54. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/live_mounts.md +0 -0
  55. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/namespace_filesystems.md +0 -0
  56. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/python.md +0 -0
  57. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/script-analysis.md +0 -0
  58. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/ssh.md +0 -0
  59. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/threat-model.md +0 -0
  60. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/typescript.md +0 -0
  61. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/yq.md +0 -0
  62. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/agent_tool.rs +0 -0
  63. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/basic.rs +0 -0
  64. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/clap_builtin.rs +0 -0
  65. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/clap_builtin_subcommands.rs +0 -0
  66. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/custom_backend.rs +0 -0
  67. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/custom_builtins.rs +0 -0
  68. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/custom_filesystem_impl.rs +0 -0
  69. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/custom_fs.rs +0 -0
  70. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/dump_builtins.rs +0 -0
  71. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/generate_snapshot_fixtures.rs +0 -0
  72. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/git_workflow.rs +0 -0
  73. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/large_binary_probe.rs +0 -0
  74. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/live_mounts.rs +0 -0
  75. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/namespace_rebase.rs +0 -0
  76. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/namespace_sandbox.rs +0 -0
  77. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/python_external_functions.rs +0 -0
  78. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/python_scripts.rs +0 -0
  79. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/realfs_readonly.rs +0 -0
  80. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/realfs_readwrite.rs +0 -0
  81. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/resource_limits.rs +0 -0
  82. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/scripted_tool.rs +0 -0
  83. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/show_tool_output.rs +0 -0
  84. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/sqlite_basic.rs +0 -0
  85. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/sqlite_workflow.rs +0 -0
  86. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/ssh_supabase.rs +0 -0
  87. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/streaming_output.rs +0 -0
  88. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/text_files.rs +0 -0
  89. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/text_processing.rs +0 -0
  90. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/typescript_external_functions.rs +0 -0
  91. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/typescript_scripts.rs +0 -0
  92. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/virtual_identity.rs +0 -0
  93. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/out file.txt +0 -0
  94. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/proptest-regressions/builtins/sqlite/tests.txt +0 -0
  95. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/analysis.rs +0 -0
  96. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/alias.rs +0 -0
  97. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/archive.rs +0 -0
  98. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/arg_parser.rs +0 -0
  99. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/assert.rs +0 -0
  100. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/awk/interpreter.rs +0 -0
  101. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/awk/mod.rs +0 -0
  102. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/awk/parser.rs +0 -0
  103. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/awk/tests.rs +0 -0
  104. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/base64.rs +0 -0
  105. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/bc.rs +0 -0
  106. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/caller.rs +0 -0
  107. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/checksum.rs +0 -0
  108. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/clap_env.rs +0 -0
  109. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/clear.rs +0 -0
  110. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/column.rs +0 -0
  111. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/comm.rs +0 -0
  112. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/compgen.rs +0 -0
  113. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/csv.rs +0 -0
  114. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/curl.rs +0 -0
  115. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/cuttr.rs +0 -0
  116. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/date.rs +0 -0
  117. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/diff.rs +0 -0
  118. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/dirstack.rs +0 -0
  119. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/disk.rs +0 -0
  120. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/dotenv.rs +0 -0
  121. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/echo.rs +0 -0
  122. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/environ.rs +0 -0
  123. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/envsubst.rs +0 -0
  124. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/expand.rs +0 -0
  125. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/export.rs +0 -0
  126. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/expr.rs +0 -0
  127. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/fc.rs +0 -0
  128. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/flow.rs +0 -0
  129. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/fold.rs +0 -0
  130. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/cat_args.rs +0 -0
  131. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/extendedbigdecimal.rs +0 -0
  132. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/argument.rs +0 -0
  133. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/escape.rs +0 -0
  134. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/human.rs +0 -0
  135. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/mod.rs +0 -0
  136. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/num_format.rs +0 -0
  137. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/spec.rs +0 -0
  138. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format_support.rs +0 -0
  139. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/ls_args.rs +0 -0
  140. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/mktemp_args.rs +0 -0
  141. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/mod.rs +0 -0
  142. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/num_parser.rs +0 -0
  143. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/od_args.rs +0 -0
  144. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/readlink_args.rs +0 -0
  145. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/realpath_args.rs +0 -0
  146. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/shuf_args.rs +0 -0
  147. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/stat_args.rs +0 -0
  148. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/tac_args.rs +0 -0
  149. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/tee_args.rs +0 -0
  150. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/truncate_args.rs +0 -0
  151. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/git/client.rs +0 -0
  152. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/git/cmd.rs +0 -0
  153. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/git/config.rs +0 -0
  154. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/git/mod.rs +0 -0
  155. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/glob_cmd.rs +0 -0
  156. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/grep.rs +0 -0
  157. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/headtail.rs +0 -0
  158. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/help.rs +0 -0
  159. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/helpers.rs +0 -0
  160. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/http.rs +0 -0
  161. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/iconv.rs +0 -0
  162. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/introspect.rs +0 -0
  163. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/join.rs +0 -0
  164. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/args.rs +0 -0
  165. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/compat.rs +0 -0
  166. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/convert.rs +0 -0
  167. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/errors.rs +0 -0
  168. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/format.rs +0 -0
  169. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/input.rs +0 -0
  170. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/mod.rs +0 -0
  171. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/regex_compat.rs +0 -0
  172. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/tests.rs +0 -0
  173. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/json.rs +0 -0
  174. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/limits.rs +0 -0
  175. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/log.rs +0 -0
  176. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/find.rs +0 -0
  177. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/glob.rs +0 -0
  178. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/mod.rs +0 -0
  179. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/rmdir.rs +0 -0
  180. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/tests.rs +0 -0
  181. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/mapfile.rs +0 -0
  182. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/mkfifo.rs +0 -0
  183. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/navigation.rs +0 -0
  184. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/nl.rs +0 -0
  185. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/numfmt.rs +0 -0
  186. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/parallel.rs +0 -0
  187. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/paste.rs +0 -0
  188. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/patch.rs +0 -0
  189. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/printf.rs +0 -0
  190. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/python.rs +0 -0
  191. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/read.rs +0 -0
  192. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/retry.rs +0 -0
  193. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/rg/mod.rs +0 -0
  194. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/runtime_limits.rs +0 -0
  195. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/search_common.rs +0 -0
  196. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sed.rs +0 -0
  197. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/semver.rs +0 -0
  198. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/seq.rs +0 -0
  199. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sleep.rs +0 -0
  200. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sortuniq.rs +0 -0
  201. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/source.rs +0 -0
  202. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/split.rs +0 -0
  203. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/dot_commands.rs +0 -0
  204. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/engine.rs +0 -0
  205. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/formatter.rs +0 -0
  206. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/mod.rs +0 -0
  207. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/parser.rs +0 -0
  208. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/tests.rs +0 -0
  209. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/vfs_io.rs +0 -0
  210. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/allowlist.rs +0 -0
  211. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/client.rs +0 -0
  212. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/cmd.rs +0 -0
  213. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/config.rs +0 -0
  214. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/handler.rs +0 -0
  215. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/mod.rs +0 -0
  216. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/russh_handler.rs +0 -0
  217. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/strings.rs +0 -0
  218. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/system.rs +0 -0
  219. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/template.rs +0 -0
  220. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/test.rs +0 -0
  221. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/timeout.rs +0 -0
  222. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/tomlq.rs +0 -0
  223. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/trap.rs +0 -0
  224. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/tree.rs +0 -0
  225. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/typescript.rs +0 -0
  226. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/vars.rs +0 -0
  227. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/verify.rs +0 -0
  228. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/wait.rs +0 -0
  229. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/wc.rs +0 -0
  230. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/yes.rs +0 -0
  231. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/yq.rs +0 -0
  232. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/zip_cmd.rs +0 -0
  233. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/credential.rs +0 -0
  234. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/error.rs +0 -0
  235. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/execution_capability.rs +0 -0
  236. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/backend.rs +0 -0
  237. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/limits.rs +0 -0
  238. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/memory.rs +0 -0
  239. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/mod.rs +0 -0
  240. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/mountable.rs +0 -0
  241. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/namespace.rs +0 -0
  242. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/overlay.rs +0 -0
  243. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/posix.rs +0 -0
  244. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/readonly.rs +0 -0
  245. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/realfs.rs +0 -0
  246. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/search.rs +0 -0
  247. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/traits.rs +0 -0
  248. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/hooks.rs +0 -0
  249. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/host_call.rs +0 -0
  250. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interop/fs.rs +0 -0
  251. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interop/mod.rs +0 -0
  252. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/arithmetic.rs +0 -0
  253. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/brace_expansion.rs +0 -0
  254. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/expansion.rs +0 -0
  255. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/glob.rs +0 -0
  256. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/jobs.rs +0 -0
  257. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/mod.rs +0 -0
  258. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/redirection.rs +0 -0
  259. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/state.rs +0 -0
  260. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/time_command.rs +0 -0
  261. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/limits.rs +0 -0
  262. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/logging_impl.rs +0 -0
  263. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/network/allowlist.rs +0 -0
  264. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/network/bot_auth.rs +0 -0
  265. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/network/client.rs +0 -0
  266. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/network/mod.rs +0 -0
  267. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/network/transport.rs +0 -0
  268. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/ast.rs +0 -0
  269. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/budget.rs +0 -0
  270. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/lexer.rs +0 -0
  271. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/mod.rs +0 -0
  272. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/span.rs +0 -0
  273. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/tokens.rs +0 -0
  274. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/profile.rs +0 -0
  275. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/scripted_tool/execute.rs +0 -0
  276. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/scripted_tool/extension.rs +0 -0
  277. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/scripted_tool/mod.rs +0 -0
  278. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/scripted_tool/toolset.rs +0 -0
  279. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/capabilities.rs +0 -0
  280. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/chunker.rs +0 -0
  281. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/container.rs +0 -0
  282. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/graph.rs +0 -0
  283. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/mod.rs +0 -0
  284. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/objects.rs +0 -0
  285. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/stream.rs +0 -0
  286. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/testing.rs +0 -0
  287. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/time_compat/host_clock.rs +0 -0
  288. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/time_compat/mod.rs +0 -0
  289. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/tool.rs +0 -0
  290. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/tool_def.rs +0 -0
  291. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/tool_registry.rs +0 -0
  292. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/trace.rs +0 -0
  293. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/fixtures/competitor-regressions/just-bash-2026-08-05.json +0 -0
  294. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/fixtures/snapshots/v1.snapshot +0 -0
  295. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/fixtures/snapshots/v2.snapshot +0 -0
  296. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/agent_skills_publication_tests.rs +0 -0
  297. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/allexport_tests.rs +0 -0
  298. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/archive_bzip2_tests.rs +0 -0
  299. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/awk_fuzz_scaffold_tests.rs +0 -0
  300. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/awk_newline_tests.rs +0 -0
  301. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/awk_pattern_tests.rs +0 -0
  302. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/awk_printf_expr_test.rs +0 -0
  303. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/awk_range_pattern_tests.rs +0 -0
  304. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/background_exec_tests.rs +0 -0
  305. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/base64_binary_tests.rs +0 -0
  306. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/bash_source_tests.rs +0 -0
  307. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/blackbox_security_tests.rs +0 -0
  308. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/builtin_error_security_tests.rs +0 -0
  309. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/builtin_registry_tests.rs +0 -0
  310. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/byte_range_panic_tests.rs +0 -0
  311. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/byte_stream_tests.rs +0 -0
  312. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/cancellation_tests.rs +0 -0
  313. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/cmdsub_quote_test.rs +0 -0
  314. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/command_resolver_tests.rs +0 -0
  315. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/competitor_regression_tests.rs +0 -0
  316. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/compgen_tests.rs +0 -0
  317. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/coproc_tests.rs +0 -0
  318. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/coreutils_differential_tests.rs +0 -0
  319. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/credential_injection_tests.rs +0 -0
  320. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/curl_data_compat_tests.rs +0 -0
  321. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/custom_builtins_tests.rs +0 -0
  322. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/custom_fs_tests.rs +0 -0
  323. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/date_timezone_differential_tests.rs +0 -0
  324. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/date_timezone_no_tzdata_tests.rs +0 -0
  325. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/date_timezone_tests.rs +0 -0
  326. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/dev_null_tests.rs +0 -0
  327. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/exec_options_tests.rs +0 -0
  328. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/execution_budget_tests.rs +0 -0
  329. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/execution_capability_tests.rs +0 -0
  330. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/execution_profile_tests.rs +0 -0
  331. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/filesystem_security_conformance_tests.rs +0 -0
  332. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/final_env_tests.rs +0 -0
  333. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/find_multi_path_tests.rs +0 -0
  334. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/for_in_reserved_word_tests.rs +0 -0
  335. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/git_advanced_tests.rs +0 -0
  336. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/git_inspection_tests.rs +0 -0
  337. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/git_integration_tests.rs +0 -0
  338. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/git_remote_security_tests.rs +0 -0
  339. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/git_security_tests.rs +0 -0
  340. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/glob_fuzz_scaffold_tests.rs +0 -0
  341. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/glob_intermediate_component_tests.rs +0 -0
  342. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/harness_example_tests.rs +0 -0
  343. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/history_tests.rs +0 -0
  344. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/host_call_execution_tests.rs +0 -0
  345. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/host_mounts_tests.rs +0 -0
  346. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_1175_test.rs +0 -0
  347. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_1776_test.rs +0 -0
  348. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_1777_test.rs +0 -0
  349. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_274_test.rs +0 -0
  350. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_275_279_282_test.rs +0 -0
  351. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_276_test.rs +0 -0
  352. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_277_test.rs +0 -0
  353. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_289_test.rs +0 -0
  354. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_290_test.rs +0 -0
  355. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_291_test.rs +0 -0
  356. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_853_test.rs +0 -0
  357. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_872_test.rs +0 -0
  358. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_873_test.rs +0 -0
  359. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_875_test.rs +0 -0
  360. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/jq_fuzz_scaffold_tests.rs +0 -0
  361. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/limitations_doc_tests.rs +0 -0
  362. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/limitations_evidence_tests.rs +0 -0
  363. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/live_mount_tests.rs +0 -0
  364. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/main.rs +0 -0
  365. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/mkfifo_tests.rs +0 -0
  366. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/namespace_fs_tests.rs +0 -0
  367. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/nested_subscript_tests.rs +0 -0
  368. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/network_security_tests.rs +0 -0
  369. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/output_truncation_tests.rs +0 -0
  370. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/parallel_sessions_tests.rs +0 -0
  371. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/proptest_differential.rs +0 -0
  372. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/python_integration_tests.rs +0 -0
  373. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/python_security_tests.rs +0 -0
  374. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/regex_limit_tests.rs +0 -0
  375. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/release_profile_tests.rs +0 -0
  376. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/request_lifecycle_contract_tests.rs +0 -0
  377. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/runtime_env_tests.rs +0 -0
  378. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/script_analysis.rs +0 -0
  379. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/script_execution_tests.rs +0 -0
  380. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/security_audit_pocs.rs +0 -0
  381. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/set_e_and_or_tests.rs +0 -0
  382. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/shuf_resource_tests.rs +0 -0
  383. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/skills_tests.rs +0 -0
  384. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/snapshot_fixture_tests.rs +0 -0
  385. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/snapshot_history_tests.rs +0 -0
  386. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/snapshot_tests.rs +0 -0
  387. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/source_function_tests.rs +0 -0
  388. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/spec_runner.rs +0 -0
  389. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/spec_tests.rs +0 -0
  390. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/sqlite_compat_tests.rs +0 -0
  391. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/sqlite_differential_tests.rs +0 -0
  392. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/sqlite_fuzz_tests.rs +0 -0
  393. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/sqlite_integration_tests.rs +0 -0
  394. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/sqlite_security_tests.rs +0 -0
  395. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/stack_overflow_regression_tests.rs +0 -0
  396. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/subst_depth_limit_tests.rs +0 -0
  397. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/symlink_overlay_security_tests.rs +0 -0
  398. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/thirdparty_adoption_tests.rs +0 -0
  399. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/threat_model_doc_tests.rs +0 -0
  400. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/threat_model_tests.rs +0 -0
  401. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/time_command_tests.rs +0 -0
  402. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/time_compat_scan_tests.rs +0 -0
  403. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/tool_registry_tests.rs +0 -0
  404. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/tty_tests.rs +0 -0
  405. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/typescript_integration_tests.rs +0 -0
  406. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/typescript_security_tests.rs +0 -0
  407. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/unicode_security_tests.rs +0 -0
  408. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/unset_function_tests.rs +0 -0
  409. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/urandom_tests.rs +0 -0
  410. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/workflow_security_tests.rs +0 -0
  411. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/yq_integration_tests.rs +0 -0
  412. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/logging_security_tests.rs +0 -0
  413. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/proptest_security.rs +0 -0
  414. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/realfs_tests.rs +0 -0
  415. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/security_failpoint_tests.rs +0 -0
  416. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/azure_discover_rank.sh +0 -0
  417. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/azure_generate_url.sh +0 -0
  418. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/azure_query_capacity.sh +0 -0
  419. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/helm_validate_chart.sh +0 -0
  420. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/jwt_test_setup.sh +0 -0
  421. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/stitch_download_asset.sh +0 -0
  422. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/stitch_fetch.sh +0 -0
  423. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/stitch_verify_setup.sh +0 -0
  424. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/superpowers_find_polluter.sh +0 -0
  425. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/vercel_deploy.sh +0 -0
  426. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/awk.test.sh +0 -0
  427. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/delete-array.test.sh +0 -0
  428. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/dev-stderr.test.sh +0 -0
  429. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/eval-bugs.test.sh +0 -0
  430. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/filename.test.sh +0 -0
  431. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/getline-file.test.sh +0 -0
  432. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/alias.test.sh +0 -0
  433. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/append_redirect.test.sh +0 -0
  434. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/arith-dynamic.test.sh +0 -0
  435. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/arithmetic-base-expansion.test.sh +0 -0
  436. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/arithmetic.test.sh +0 -0
  437. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/array-slicing.test.sh +0 -0
  438. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/array-splat.test.sh +0 -0
  439. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/arrays.test.sh +0 -0
  440. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh +0 -0
  441. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/awk-printf-width.test.sh +0 -0
  442. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/background.test.sh +0 -0
  443. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bash-c-exports.test.sh +0 -0
  444. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bash-command.test.sh +0 -0
  445. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bash-flags.test.sh +0 -0
  446. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bash-source-var.test.sh +0 -0
  447. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bash-stdin-pipe.test.sh +0 -0
  448. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bc.test.sh +0 -0
  449. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/blackbox-edge-cases.test.sh +0 -0
  450. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/blackbox-exploration.test.sh +0 -0
  451. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/brace-expansion.test.sh +0 -0
  452. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/brace_expansion_lookahead.test.sh +0 -0
  453. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/cat.test.sh +0 -0
  454. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/checksum.test.sh +0 -0
  455. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/chown-kill.test.sh +0 -0
  456. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/cmd-suggestions.test.sh +0 -0
  457. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/cmdsub_depth_unquoted.test.sh +0 -0
  458. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/column.test.sh +0 -0
  459. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/comm.test.sh +0 -0
  460. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/command-not-found.test.sh +0 -0
  461. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/command-subst.test.sh +0 -0
  462. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/command.test.sh +0 -0
  463. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/command_v.test.sh +0 -0
  464. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/compgen-path.test.sh +0 -0
  465. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/conditional-short-circuit.test.sh +0 -0
  466. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/conditional.test.sh +0 -0
  467. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/control-flow.test.sh +0 -0
  468. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/cuttr.test.sh +0 -0
  469. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/date.test.sh +0 -0
  470. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/declare.test.sh +0 -0
  471. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/df.test.sh +0 -0
  472. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/diff.test.sh +0 -0
  473. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/dirstack.test.sh +0 -0
  474. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/du.test.sh +0 -0
  475. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/echo.test.sh +0 -0
  476. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/empty-bodies.test.sh +0 -0
  477. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/env.test.sh +0 -0
  478. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/errexit.test.sh +0 -0
  479. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/eval-bugs.test.sh +0 -0
  480. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/exec-command.test.sh +0 -0
  481. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/exec-fd-redirect.test.sh +0 -0
  482. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/exec-fd-variable.test.sh +0 -0
  483. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/exit-status.test.sh +0 -0
  484. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/expr.test.sh +0 -0
  485. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/extglob.test.sh +0 -0
  486. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/file.test.sh +0 -0
  487. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/fileops.test.sh +0 -0
  488. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/find.test.sh +0 -0
  489. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/functions.test.sh +0 -0
  490. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/getopts.test.sh +0 -0
  491. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/glob-options.test.sh +0 -0
  492. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/glob_match_cap.test.sh +0 -0
  493. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/globs.test.sh +0 -0
  494. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/gzip.test.sh +0 -0
  495. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/headtail.test.sh +0 -0
  496. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/help-flag.test.sh +0 -0
  497. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/heredoc-edge.test.sh +0 -0
  498. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/heredoc.test.sh +0 -0
  499. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/herestring.test.sh +0 -0
  500. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/hextools.test.sh +0 -0
  501. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/history.test.sh +0 -0
  502. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/indirect-expansion.test.sh +0 -0
  503. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/less.test.sh +0 -0
  504. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/ln.test.sh +0 -0
  505. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/ls.test.sh +0 -0
  506. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/memory_budget_desync.test.sh +0 -0
  507. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/mktemp.test.sh +0 -0
  508. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +0 -0
  509. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/nameref.test.sh +0 -0
  510. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/negative-tests.test.sh +0 -0
  511. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/nl.test.sh +0 -0
  512. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/nounset.test.sh +0 -0
  513. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/numfmt.test.sh +0 -0
  514. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/od.test.sh +0 -0
  515. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/parse-errors.test.sh +0 -0
  516. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/paste-flags.test.sh +0 -0
  517. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/paste.test.sh +0 -0
  518. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/path.test.sh +0 -0
  519. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/pipes-redirects.test.sh +0 -0
  520. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/printenv.test.sh +0 -0
  521. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/printf.test.sh +0 -0
  522. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/procsub.test.sh +0 -0
  523. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/quote.test.sh +0 -0
  524. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/read-builtin.test.sh +0 -0
  525. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/readlink.test.sh +0 -0
  526. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/recursive-cmdsub.test.sh +0 -0
  527. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/regex-limit.test.sh +0 -0
  528. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/replace_pattern_limit.test.sh +0 -0
  529. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/script-exec.test.sh +0 -0
  530. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/seq.test.sh +0 -0
  531. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/set-allexport.test.sh +0 -0
  532. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/shell-grammar.test.sh +0 -0
  533. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/shuf.test.sh +0 -0
  534. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/sleep.test.sh +0 -0
  535. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/sortuniq.test.sh +0 -0
  536. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/source.test.sh +0 -0
  537. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/stat.test.sh +0 -0
  538. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/string-ops.test.sh +0 -0
  539. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/strings.test.sh +0 -0
  540. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/subprocess-isolation.test.sh +0 -0
  541. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/subshell.test.sh +0 -0
  542. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/tar.test.sh +0 -0
  543. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/tar_create.test.sh +0 -0
  544. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/tee.test.sh +0 -0
  545. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/temp-binding.test.sh +0 -0
  546. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/test-operators.test.sh +0 -0
  547. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/test-tty.test.sh +0 -0
  548. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/textrev.test.sh +0 -0
  549. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/time.test.sh +0 -0
  550. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/timeout.test.sh +0 -0
  551. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/tree.test.sh +0 -0
  552. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/truncate.test.sh +0 -0
  553. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/type.test.sh +0 -0
  554. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/unicode.test.sh +0 -0
  555. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/unset-exported-var.test.sh +0 -0
  556. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/var-op-test.test.sh +0 -0
  557. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/variables.test.sh +0 -0
  558. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/wait.test.sh +0 -0
  559. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/watch.test.sh +0 -0
  560. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/wc.test.sh +0 -0
  561. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/word-split.test.sh +0 -0
  562. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/xargs.test.sh +0 -0
  563. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/grep/eval-bugs.test.sh +0 -0
  564. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/grep/grep.test.sh +0 -0
  565. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/grep/rg.test.sh +0 -0
  566. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/jq/jq.test.sh +0 -0
  567. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/python/env_leak.test.sh +0 -0
  568. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/python/python.test.sh +0 -0
  569. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/sed/eval-bugs.test.sh +0 -0
  570. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/sed/sed.test.sh +0 -0
  571. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/typescript/typescript.test.sh +0 -0
  572. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/yq/yq.test.sh +0 -0
  573. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/ssh_builtin_tests.rs +0 -0
  574. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/ssh_supabase_tests.rs +0 -0
  575. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/support/filesystem_security_conformance.rs +0 -0
  576. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/Cargo.toml +0 -0
  577. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/README.md +0 -0
  578. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/bash_basics.py +0 -0
  579. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/custom_filesystem_interop.py +0 -0
  580. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/data_pipeline.py +0 -0
  581. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/fastapi_async_tool.py +0 -0
  582. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/jupyter_async_test.ipynb +0 -0
  583. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/k8s_orchestrator.py +0 -0
  584. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/langgraph_async_tool.py +0 -0
  585. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/llm_tool.py +0 -0
  586. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/session_history.py +0 -0
  587. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/src/lib.rs +0 -0
  588. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/_bashkit_categories.py +0 -0
  589. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/_security_advanced.py +0 -0
  590. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/_security_core.py +0 -0
  591. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_ai_adapters.py +0 -0
  592. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_analyze.py +0 -0
  593. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_async_callbacks.py +0 -0
  594. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_basic.py +0 -0
  595. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_builtins.py +0 -0
  596. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_control_flow.py +0 -0
  597. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_custom_builtin_fs.py +0 -0
  598. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_error_handling.py +0 -0
  599. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_execution_profiles.py +0 -0
  600. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_fastapi_integration.py +0 -0
  601. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_filesystem_interop.py +0 -0
  602. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_integration.py +0 -0
  603. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_jupyter_compat.py +0 -0
  604. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_langgraph_integration.py +0 -0
  605. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_network_config.py +0 -0
  606. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_network_credentials.py +0 -0
  607. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_python_security.py +0 -0
  608. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_registered_tools.py +0 -0
  609. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_runtime_extension.py +0 -0
  610. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_scripts.py +0 -0
  611. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_security.py +0 -0
  612. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_shell_injection.py +0 -0
  613. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_snapshot_history.py +0 -0
  614. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_sqlite.py +0 -0
  615. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_streaming_output.py +0 -0
  616. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_strings_and_quoting.py +0 -0
  617. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_teardown_determinism.py +0 -0
  618. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_tool_metadata.py +0 -0
  619. {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_vfs.py +0 -0
  620. {bashkit-0.17.0 → bashkit-0.17.1}/pyproject.toml +0 -0
@@ -342,7 +342,7 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
342
342
 
343
343
  [[package]]
344
344
  name = "bashkit"
345
- version = "0.17.0"
345
+ version = "0.17.1"
346
346
  dependencies = [
347
347
  "anyhow",
348
348
  "async-trait",
@@ -402,7 +402,7 @@ dependencies = [
402
402
 
403
403
  [[package]]
404
404
  name = "bashkit-bench"
405
- version = "0.17.0"
405
+ version = "0.17.1"
406
406
  dependencies = [
407
407
  "anyhow",
408
408
  "bashkit",
@@ -417,7 +417,7 @@ dependencies = [
417
417
 
418
418
  [[package]]
419
419
  name = "bashkit-capi"
420
- version = "0.17.0"
420
+ version = "0.17.1"
421
421
  dependencies = [
422
422
  "bashkit",
423
423
  "serde",
@@ -427,7 +427,7 @@ dependencies = [
427
427
 
428
428
  [[package]]
429
429
  name = "bashkit-cli"
430
- version = "0.17.0"
430
+ version = "0.17.1"
431
431
  dependencies = [
432
432
  "anyhow",
433
433
  "bashkit",
@@ -441,7 +441,7 @@ dependencies = [
441
441
 
442
442
  [[package]]
443
443
  name = "bashkit-coreutils-port"
444
- version = "0.17.0"
444
+ version = "0.17.1"
445
445
  dependencies = [
446
446
  "anyhow",
447
447
  "prettyplease",
@@ -455,7 +455,7 @@ dependencies = [
455
455
 
456
456
  [[package]]
457
457
  name = "bashkit-eval"
458
- version = "0.17.0"
458
+ version = "0.17.1"
459
459
  dependencies = [
460
460
  "anyhow",
461
461
  "async-trait",
@@ -472,7 +472,7 @@ dependencies = [
472
472
 
473
473
  [[package]]
474
474
  name = "bashkit-js"
475
- version = "0.17.0"
475
+ version = "0.17.1"
476
476
  dependencies = [
477
477
  "bashkit",
478
478
  "napi",
@@ -484,7 +484,7 @@ dependencies = [
484
484
 
485
485
  [[package]]
486
486
  name = "bashkit-python"
487
- version = "0.17.0"
487
+ version = "0.17.1"
488
488
  dependencies = [
489
489
  "bashkit",
490
490
  "num-bigint",
@@ -496,7 +496,7 @@ dependencies = [
496
496
 
497
497
  [[package]]
498
498
  name = "bashkit-wasm"
499
- version = "0.17.0"
499
+ version = "0.17.1"
500
500
  dependencies = [
501
501
  "bashkit",
502
502
  "console_error_panic_hook",
@@ -7,7 +7,7 @@ resolver = "2"
7
7
  members = ["crates/*"]
8
8
 
9
9
  [workspace.package]
10
- version = "0.17.0"
10
+ version = "0.17.1"
11
11
  edition = "2024"
12
12
  license = "MIT"
13
13
  authors = ["Mykhailo Chalyi <mike@chaliy.name>", "Everruns"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bashkit
3
- Version: 0.17.0
3
+ Version: 0.17.1
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -264,6 +264,10 @@ harness = false
264
264
  name = "hotpath"
265
265
  harness = false
266
266
 
267
+ [[bench]]
268
+ name = "builtin_args"
269
+ harness = false
270
+
267
271
  [[bench]]
268
272
  name = "file_ops"
269
273
  harness = false
@@ -431,7 +431,7 @@ Enable the `sqlite` feature to embed [Turso](https://github.com/tursodatabase/tu
431
431
 
432
432
  ```toml
433
433
  [dependencies]
434
- bashkit = { version = "0.17.0", features = ["sqlite"] }
434
+ bashkit = { version = "0.17.1", features = ["sqlite"] }
435
435
  ```
436
436
 
437
437
  ```rust
@@ -0,0 +1,178 @@
1
+ //! Per-invocation argument-parsing cost for builtins.
2
+ //!
3
+ //! Motivation: every ported coreutils builtin rebuilds its whole `clap::Command`
4
+ //! on each invocation (`cat_command()` in `builtins/generated/cat_args.rs` is
5
+ //! called from `builtins/cat.rs` per exec, and the same holds for `ls`, `od`,
6
+ //! `stat`, …). Real scripts call these in loops, so the arg tree is constructed
7
+ //! N times for N invocations. This bench exists to answer one question: is that
8
+ //! construction cost visible next to the interpreter and the builtin body, or
9
+ //! is it noise?
10
+ //!
11
+ //! Decision: measured end-to-end through the public `Bash::exec` API, not
12
+ //! against `cat_command()` directly. `mod builtins` is private in `lib.rs`, and
13
+ //! widening the public surface for a bench is worse than reading the cost as a
14
+ //! difference between comparable scripts. The numbers are therefore read as
15
+ //! deltas, not absolutes:
16
+ //!
17
+ //! - `clap_vs_handrolled`: `cat` / `ls` (clap-parsed) against `echo` /
18
+ //! `printf` (hand-parsed) and `:` (no args at all). The `:` row is the
19
+ //! loop-and-dispatch floor; everything above it is arg handling plus body.
20
+ //! - `arg_surface_size`: `cat` (12 args) against `ls` (~60 args) on inputs
21
+ //! sized so the bodies do near-identical work. clap's per-parse cost scales
22
+ //! with the number of declared args while the body does not, so this delta
23
+ //! tracks arg-surface cost.
24
+ //! - `flag_count`: same builtin, more flags on the command line. Costs ~0.45
25
+ //! µs per extra flag — note this measures only the *matching* of additional
26
+ //! argv entries, NOT the fixed per-parse cost, which dominates (see below).
27
+ //!
28
+ //! Each bench runs `INVOCATIONS` calls inside one script and declares
29
+ //! `Throughput::Elements(INVOCATIONS)`, so criterion reports per-invocation
30
+ //! time directly and the one-time `Bash::new()` cost amortizes away.
31
+ //!
32
+ //! What this measured, and what came of it: clap costs ~10 µs per `cat`
33
+ //! invocation and ~73% of an `ls` invocation. The expensive part is *parsing*,
34
+ //! not constructing the `Command` (construction is ~1.1 µs of `cat`'s 7.3 µs
35
+ //! round trip) — but most of that parse cost is clap's one-time `_build_self`,
36
+ //! which `builtins::clap_cache` now hoists into a cached pre-built `Command`.
37
+ //! Worth −15% on `ls` end-to-end, −2% on `cat`. Keep this bench as the guard:
38
+ //! a regression here means the cache stopped being hit.
39
+ //!
40
+ //! Run with: `cargo bench --bench builtin_args`
41
+ //! Save baseline: `cargo bench --bench builtin_args -- --save-baseline before`
42
+ //! Compare: `cargo bench --bench builtin_args -- --baseline before`
43
+ //!
44
+ //! First-run results belong in `crates/bashkit/benches/results/` as
45
+ //! `criterion-builtin_args-<moniker>-<timestamp>.md` (see AGENTS.md → Benches).
46
+
47
+ use bashkit::{Bash, FileSystem, InMemoryFs};
48
+ use criterion::{Criterion, Throughput, criterion_group, criterion_main};
49
+ use std::path::Path;
50
+ use std::sync::Arc;
51
+ use tokio::runtime::Runtime;
52
+
53
+ /// Invocations per iteration. Large enough that `Bash::new()` and parse of the
54
+ /// surrounding loop amortize out, small enough that a 100-sample criterion run
55
+ /// stays under a minute per bench.
56
+ const INVOCATIONS: u64 = 500;
57
+
58
+ /// Seed a VFS with one tiny file in a single-entry directory.
59
+ ///
60
+ /// Both are deliberately minimal: a 4-byte file so `cat`'s body is one small
61
+ /// read, and a directory holding exactly that file so `ls`'s body is one small
62
+ /// readdir. Keeping the bodies trivial is what makes the `cat` vs `ls` delta
63
+ /// readable as arg-surface cost rather than as I/O.
64
+ fn seed(rt: &Runtime) -> Arc<InMemoryFs> {
65
+ let fs = Arc::new(InMemoryFs::new());
66
+ rt.block_on(async {
67
+ let fs_dyn: Arc<dyn FileSystem> = fs.clone();
68
+ fs_dyn.mkdir(Path::new("/d"), true).await.expect("mkdir /d");
69
+ fs_dyn
70
+ .write_file(Path::new("/d/f"), b"abc\n")
71
+ .await
72
+ .expect("write /d/f");
73
+ });
74
+ fs
75
+ }
76
+
77
+ /// Wrap `body` in a loop of `INVOCATIONS` iterations.
78
+ ///
79
+ /// `for ((...))` rather than `for x in $(seq ...)`: the C-style loop keeps the
80
+ /// measured work to the builtin under test, with no command substitution and no
81
+ /// `seq` invocation in the middle of the thing we are timing.
82
+ fn loop_script(body: &str) -> String {
83
+ format!("for ((i=0; i<{INVOCATIONS}; i++)); do {body}; done")
84
+ }
85
+
86
+ fn run(rt: &Runtime, fs: &Arc<InMemoryFs>, script: &str) {
87
+ rt.block_on(async {
88
+ let mut bash = Bash::builder().fs(fs.clone()).build();
89
+ let result = bash.exec(script).await.expect("exec failed");
90
+ std::hint::black_box(result);
91
+ });
92
+ }
93
+
94
+ /// Register one `INVOCATIONS`-sized loop bench in `g`.
95
+ fn bench_loop(
96
+ g: &mut criterion::BenchmarkGroup<'_, criterion::measurement::WallTime>,
97
+ rt: &Runtime,
98
+ fs: &Arc<InMemoryFs>,
99
+ name: &str,
100
+ body: &str,
101
+ ) {
102
+ let script = loop_script(body);
103
+ g.bench_function(name, |b| b.iter(|| run(rt, fs, &script)));
104
+ }
105
+
106
+ /// clap-parsed builtins against hand-parsed ones and against the empty floor.
107
+ fn bench_clap_vs_handrolled(c: &mut Criterion) {
108
+ let rt = Runtime::new().unwrap();
109
+ let fs = seed(&rt);
110
+ let mut g = c.benchmark_group("builtin_args/clap_vs_handrolled");
111
+ g.throughput(Throughput::Elements(INVOCATIONS));
112
+
113
+ // Floor: loop + dispatch only, no arguments, no body.
114
+ bench_loop(&mut g, &rt, &fs, "colon_noop", ":");
115
+ // Hand-parsed builtins, one argument each.
116
+ bench_loop(&mut g, &rt, &fs, "echo_handrolled", "echo x > /dev/null");
117
+ bench_loop(
118
+ &mut g,
119
+ &rt,
120
+ &fs,
121
+ "printf_handrolled",
122
+ "printf x > /dev/null",
123
+ );
124
+ // clap-parsed builtins, one argument each.
125
+ bench_loop(&mut g, &rt, &fs, "cat_clap", "cat /d/f > /dev/null");
126
+ bench_loop(&mut g, &rt, &fs, "ls_clap", "ls /d > /dev/null");
127
+
128
+ g.finish();
129
+ }
130
+
131
+ /// Small vs large clap arg surface, bodies held near-constant.
132
+ ///
133
+ /// `cat` declares ~12 args, `ls` ~60. If `Command` construction dominates, this
134
+ /// gap tracks the arg count; if it does not, the two rows land close together
135
+ /// and caching the built `Command` is not worth doing.
136
+ fn bench_arg_surface_size(c: &mut Criterion) {
137
+ let rt = Runtime::new().unwrap();
138
+ let fs = seed(&rt);
139
+ let mut g = c.benchmark_group("builtin_args/arg_surface_size");
140
+ g.throughput(Throughput::Elements(INVOCATIONS));
141
+
142
+ bench_loop(&mut g, &rt, &fs, "cat_12_args", "cat /d/f > /dev/null");
143
+ bench_loop(&mut g, &rt, &fs, "ls_60_args", "ls /d > /dev/null");
144
+
145
+ g.finish();
146
+ }
147
+
148
+ /// Same builtin, growing flag count on the command line.
149
+ ///
150
+ /// Construction cost is identical across these rows, so any spread is match /
151
+ /// value-parse cost. Splitting the two matters for the fix: caching a built
152
+ /// `Command` helps only the construction half.
153
+ fn bench_flag_count(c: &mut Criterion) {
154
+ let rt = Runtime::new().unwrap();
155
+ let fs = seed(&rt);
156
+ let mut g = c.benchmark_group("builtin_args/flag_count");
157
+ g.throughput(Throughput::Elements(INVOCATIONS));
158
+
159
+ bench_loop(&mut g, &rt, &fs, "cat_0_flags", "cat /d/f > /dev/null");
160
+ bench_loop(&mut g, &rt, &fs, "cat_1_flag", "cat -n /d/f > /dev/null");
161
+ bench_loop(
162
+ &mut g,
163
+ &rt,
164
+ &fs,
165
+ "cat_3_flags",
166
+ "cat -n -E -T /d/f > /dev/null",
167
+ );
168
+
169
+ g.finish();
170
+ }
171
+
172
+ criterion_group!(
173
+ benches,
174
+ bench_clap_vs_handrolled,
175
+ bench_arg_surface_size,
176
+ bench_flag_count
177
+ );
178
+ criterion_main!(benches);
@@ -0,0 +1,93 @@
1
+ # builtin_args — first run (baseline)
2
+
3
+ `cargo bench --bench builtin_args -- --warm-up-time 1 --measurement-time 3`
4
+
5
+ Host: 4× Intel Xeon @ 2.10 GHz, linux-x86_64, cloud runner (noisy; treat
6
+ absolutes as indicative, deltas as the signal).
7
+ Bashkit: v0.17.0, `4b634fd`.
8
+
9
+ Question this run answers: ported coreutils builtins rebuild their whole
10
+ `clap::Command` on every invocation. Is that visible?
11
+
12
+ ## Raw
13
+
14
+ 500 invocations per iteration; per-invocation column is `time ÷ 500`.
15
+
16
+ | bench | time / 500 inv | per invocation | vs `:` floor |
17
+ |---|---|---|---|
18
+ | `clap_vs_handrolled/colon_noop` | 1.658 ms | 3.32 µs | — |
19
+ | `clap_vs_handrolled/echo_handrolled` | 2.002 ms | 4.00 µs | +0.69 µs |
20
+ | `clap_vs_handrolled/printf_handrolled` | 2.049 ms | 4.10 µs | +0.78 µs |
21
+ | `clap_vs_handrolled/cat_clap` | 7.006 ms | 14.01 µs | +10.70 µs |
22
+ | `clap_vs_handrolled/ls_clap` | 30.408 ms | 60.82 µs | +57.50 µs |
23
+ | `arg_surface_size/cat_12_args` | 7.017 ms | 14.03 µs | +10.71 µs |
24
+ | `arg_surface_size/ls_60_args` | 29.497 ms | 58.99 µs | +55.68 µs |
25
+ | `flag_count/cat_0_flags` | 7.263 ms | 14.53 µs | — |
26
+ | `flag_count/cat_1_flag` | 7.484 ms | 14.97 µs | +0.44 µs / flag |
27
+ | `flag_count/cat_3_flags` | 7.952 ms | 15.90 µs | +0.46 µs / flag |
28
+
29
+ ## Reading
30
+
31
+ 1. **clap is the dominant per-invocation cost.** `cat` on a 4-byte file costs
32
+ 14.0 µs against 4.0 µs for `echo` — a builtin whose body does comparable
33
+ work minus the file read. Roughly 10 µs per invocation is arg handling. For
34
+ `ls` the clap share is ~73% of a 60.8 µs invocation.
35
+ 2. **Cost scales with arg-surface size.** `ls` (~60 args) costs 59–61 µs
36
+ against `cat`'s 14 µs. `ls`'s body does more than `cat`'s (readdir, stat,
37
+ column layout), so this row is not a clean isolation, but it is the largest
38
+ number on the board.
39
+ 3. **The `flag_count` rows do NOT isolate construction cost.** Adding flags to
40
+ the argv costs ~0.45 µs each, which initially read as "construction
41
+ dominates, matching is cheap". A follow-up standalone clap harness showed
42
+ that inference is wrong — see below.
43
+
44
+ ## Correction: where the time actually goes
45
+
46
+ Measured directly against `cat_command()` outside bashkit (200k iterations):
47
+
48
+ | step | `cat` |
49
+ |---|---|
50
+ | construct `Command` only | 1.09 µs |
51
+ | `Command::clone()` only | 0.83 µs |
52
+ | construct + `try_get_matches_from` | 7.69 µs |
53
+ | parse alone (clone + parse − clone) | 6.27 µs |
54
+
55
+ **Parsing dominates, not construction** — 6.3 µs of the 7.7 µs round trip.
56
+ Caching to skip construction alone is worth ~1 µs of `cat`'s 14 µs, and
57
+ `Command::clone()` is not even cheaper than rebuilding (0.83 vs 1.09 µs, inside
58
+ noise end-to-end; a naive `LazyLock` + clone prototype measured as a 2.7%
59
+ *regression*).
60
+
61
+ The cacheable part is inside the parse: clap finalizes a `Command`
62
+ (`_build_self` — resolves groups, propagates settings, indexes args) on first
63
+ parse and skips it when the `Built` flag is set. Calling `Command::build()`
64
+ once and cloning the finalized value carries that flag:
65
+
66
+ | | `cat` (12 args) | `ls` (~60 args) |
67
+ |---|---|---|
68
+ | fresh build + parse | 7.34 µs | 44.65 µs |
69
+ | cached *unbuilt* + parse | 7.02 µs (−4.3%) | 37.80 µs (−15.3%) |
70
+ | cached *built* + parse | 6.50 µs (−11.4%) | 35.53 µs (−20.4%) |
71
+
72
+ ## Outcome
73
+
74
+ Implemented as `builtins::clap_cache::cached_command!` across all 11 ported
75
+ builtins. End-to-end re-run on this host (`--save-baseline cached`):
76
+
77
+ | bench | before | after | change |
78
+ |---|---|---|---|
79
+ | `clap_vs_handrolled/cat_clap` | 7.006 ms | 6.862 ms | −2.1% |
80
+ | `clap_vs_handrolled/ls_clap` | 30.408 ms | 25.852 ms | **−15.0%** |
81
+ | `arg_surface_size/cat_12_args` | 7.017 ms | 6.717 ms | −4.3% |
82
+ | `arg_surface_size/ls_60_args` | 29.497 ms | 26.728 ms | −9.4% |
83
+ | `flag_count/cat_0_flags` | 7.263 ms | 6.553 ms | −9.8% |
84
+
85
+ `ls` drops from 60.8 to 51.7 µs per invocation. The win tracks arg-surface
86
+ size, so the large ports gain most and `cat` gains little.
87
+
88
+ ## Context
89
+
90
+ Run in response to the usage-rs question (jdx/usage). Conclusion on adoption was
91
+ no — our clap definitions are codegen output from uutils' `uu_app()`, not
92
+ hand-maintained CLI boilerplate — but the perf claim behind it pointed at a real
93
+ cost, which this bench now quantifies and guards.
@@ -14,7 +14,7 @@ Add the `logging` feature to your `Cargo.toml`:
14
14
 
15
15
  ```toml
16
16
  [dependencies]
17
- bashkit = { version = "0.17.0", features = ["logging"] }
17
+ bashkit = { version = "0.17.1", features = ["logging"] }
18
18
  tracing-subscriber = "0.3" # or your preferred subscriber
19
19
  ```
20
20
 
@@ -13,7 +13,7 @@ the `sqlite` feature. The engine is [Turso](https://github.com/tursodatabase/tur
13
13
 
14
14
  ```toml
15
15
  # Cargo.toml
16
- bashkit = { version = "0.17.0", features = ["sqlite"] }
16
+ bashkit = { version = "0.17.1", features = ["sqlite"] }
17
17
  ```
18
18
 
19
19
  ```rust,ignore
@@ -5,17 +5,21 @@
5
5
  //! `crates/bashkit-coreutils-port/`. Behaviour is implemented locally
6
6
  //! against the bashkit VFS.
7
7
 
8
+ use super::clap_cache::cached_command;
8
9
  use async_trait::async_trait;
9
10
  use std::ffi::OsString;
10
11
  use std::path::Path;
11
12
 
12
- use super::generated::cat_args::cat_command;
13
13
  use super::{Builtin, Context};
14
14
  use crate::error::Result;
15
15
  use crate::interpreter::ExecResult;
16
16
 
17
17
  pub struct Cat;
18
18
 
19
+ // Cached `cat` arg surface: pre-built once, cloned per invocation.
20
+ // See `builtins::clap_cache` for why it is built, not just constructed.
21
+ cached_command!(cat_cmd, super::generated::cat_args::cat_command());
22
+
19
23
  #[async_trait]
20
24
  impl Builtin for Cat {
21
25
  async fn execute(&self, ctx: Context<'_>) -> Result<ExecResult> {
@@ -24,12 +28,7 @@ impl Builtin for Cat {
24
28
  .chain(ctx.args.iter().map(OsString::from))
25
29
  .collect();
26
30
 
27
- // GNU coreutils' help layout opens with the usage line; clap's
28
- // default template leads with the `about`. uutils handles this via
29
- // uucore's `localized_help_template`, which we drop during codegen
30
- // because it pulls in Fluent. Re-apply a GNU-equivalent template.
31
- let cmd = cat_command().help_template("Usage: {usage}\n{about}\n\n{all-args}\n");
32
- let matches = match cmd.try_get_matches_from(argv) {
31
+ let matches = match cat_cmd().try_get_matches_from(argv) {
33
32
  Ok(m) => m,
34
33
  Err(e) => {
35
34
  let kind = e.kind();
@@ -0,0 +1,131 @@
1
+ //! Cached `clap::Command` construction for the coreutils-ported builtins.
2
+ //!
3
+ //! # Decision: cache a *built* `Command`, clone per invocation
4
+ //!
5
+ //! Every ported builtin used to call `<util>_command()` (generated from
6
+ //! uutils' `uu_app()`) on each invocation, so a script running `cat` in a
7
+ //! loop reconstructed the whole arg tree N times. Measured on a 4-core Xeon
8
+ //! (`cargo bench --bench builtin_args`, plus a standalone clap micro-harness),
9
+ //! per invocation:
10
+ //!
11
+ //! | | `cat` (12 args) | `ls` (~60 args) |
12
+ //! |---|---|---|
13
+ //! | construct `Command` only | 1.1 µs | — |
14
+ //! | construct + `try_get_matches_from` | 7.3 µs | 44.7 µs |
15
+ //! | clone cached *unbuilt* + parse | 7.0 µs | 37.8 µs |
16
+ //! | clone cached *built* + parse | 6.5 µs | 35.5 µs |
17
+ //!
18
+ //! Two things follow, and both shaped this module:
19
+ //!
20
+ //! 1. **Construction is not the expensive half — parsing is.** Building `cat`'s
21
+ //! tree costs 1.1 µs of the 7.3 µs round trip. Caching to avoid construction
22
+ //! alone is worth ~4%, which is why this is not a plain `LazyLock<Command>`
23
+ //! holding the output of `<util>_command()`.
24
+ //! 2. **Most of the parse cost is `_build_self`, and it is cacheable.** clap
25
+ //! finalizes a `Command` (resolves groups, propagates settings, indexes
26
+ //! args) on first parse, and skips that work when the `Built` flag is
27
+ //! already set. Calling [`clap::Command::build`] once and cloning the
28
+ //! finalized value carries the flag along, so each invocation pays only
29
+ //! matching: −11% for `cat`, −20% for `ls`.
30
+ //!
31
+ //! The win scales with arg-surface size, so the large ports (`ls`, `stat`,
32
+ //! `od`) benefit most. `Command::clone` is *not* cheaper than
33
+ //! `<util>_command()` on its own (0.83 µs vs 1.1 µs, and the difference is
34
+ //! inside noise end-to-end) — the skipped `_build_self` is the entire point.
35
+ //!
36
+ //! `help_template` must be applied before `build()`, which is why the macro
37
+ //! owns both steps rather than leaving the template to callers.
38
+
39
+ /// GNU coreutils' help layout opens with the usage line; clap's default
40
+ /// template leads with the `about`. uutils handles this via uucore's
41
+ /// `localized_help_template`, which codegen drops because it pulls in Fluent
42
+ /// (see `knowledge/runtimes/coreutils-args-port.md`). Re-applied here so every
43
+ /// ported builtin renders GNU-equivalent help from one definition.
44
+ pub const GNU_HELP_TEMPLATE: &str = "Usage: {usage}\n{about}\n\n{all-args}\n";
45
+
46
+ /// Define a cached accessor for a generated `clap::Command`.
47
+ ///
48
+ /// Expands to `fn $name() -> clap::Command` returning a clone of a
49
+ /// process-lifetime `Command` that has already had [`GNU_HELP_TEMPLATE`]
50
+ /// applied and [`clap::Command::build`] called on it.
51
+ ///
52
+ /// ```ignore
53
+ /// cached_command!(cat_cmd, super::generated::cat_args::cat_command());
54
+ /// let matches = cat_cmd().try_get_matches_from(argv)?;
55
+ /// ```
56
+ macro_rules! cached_command {
57
+ ($(#[$attr:meta])* $name:ident, $builder:expr) => {
58
+ $(#[$attr])*
59
+ fn $name() -> clap::Command {
60
+ static CACHE: std::sync::LazyLock<clap::Command> = std::sync::LazyLock::new(|| {
61
+ let mut cmd = $builder.help_template($crate::builtins::clap_cache::GNU_HELP_TEMPLATE);
62
+ // Finalize once. Clones inherit the `Built` flag, so
63
+ // `try_get_matches_from` skips `_build_self` per invocation.
64
+ cmd.build();
65
+ cmd
66
+ });
67
+ CACHE.clone()
68
+ }
69
+ };
70
+ }
71
+
72
+ pub(crate) use cached_command;
73
+
74
+ #[cfg(test)]
75
+ mod tests {
76
+ use super::*;
77
+
78
+ cached_command!(cat_cmd, crate::builtins::generated::cat_args::cat_command());
79
+
80
+ /// A cached, pre-built command must parse identically to a freshly
81
+ /// constructed one. Guards the `build()`-then-`clone()` shortcut against
82
+ /// clap changing what `Built` implies.
83
+ #[test]
84
+ fn cached_command_parses_like_a_fresh_one() {
85
+ let argv = ["cat", "-n", "-E", "/d/f"];
86
+ let fresh = crate::builtins::generated::cat_args::cat_command()
87
+ .help_template(GNU_HELP_TEMPLATE)
88
+ .try_get_matches_from(argv)
89
+ .expect("fresh parse");
90
+ let cached = cat_cmd().try_get_matches_from(argv).expect("cached parse");
91
+
92
+ assert_eq!(fresh.get_flag("number"), cached.get_flag("number"));
93
+ assert_eq!(fresh.get_flag("show-ends"), cached.get_flag("show-ends"));
94
+ assert_eq!(fresh.get_flag("show-tabs"), cached.get_flag("show-tabs"));
95
+ let raw = |m: &clap::ArgMatches| {
96
+ m.get_raw("file")
97
+ .map(|v| v.map(|s| s.to_owned()).collect::<Vec<_>>())
98
+ };
99
+ assert_eq!(raw(&fresh), raw(&cached));
100
+ }
101
+
102
+ /// Repeated calls must not accumulate state — each clone parses from
103
+ /// scratch, and a parse error on one call must not poison the next.
104
+ #[test]
105
+ fn cached_command_is_reusable_across_calls() {
106
+ assert!(cat_cmd().try_get_matches_from(["cat", "--nope"]).is_err());
107
+ let ok = cat_cmd()
108
+ .try_get_matches_from(["cat", "-n", "/d/f"])
109
+ .expect("parse after an earlier error");
110
+ assert!(ok.get_flag("number"));
111
+ // Same argv twice yields the same result (no residue on the cache).
112
+ let again = cat_cmd()
113
+ .try_get_matches_from(["cat", "-n", "/d/f"])
114
+ .expect("second parse");
115
+ assert!(again.get_flag("number"));
116
+ }
117
+
118
+ /// Help rendering must survive the pre-`build()` template application —
119
+ /// the GNU layout leads with `Usage:`, clap's default does not.
120
+ #[test]
121
+ fn cached_command_renders_gnu_help_layout() {
122
+ let err = cat_cmd()
123
+ .try_get_matches_from(["cat", "--help"])
124
+ .expect_err("--help exits via Err");
125
+ let rendered = err.render().to_string();
126
+ assert!(
127
+ rendered.starts_with("Usage:"),
128
+ "help must open with the usage line, got: {rendered}"
129
+ );
130
+ }
131
+ }
@@ -4,6 +4,7 @@
4
4
  // THREAT[TM-INF-018]: timezone-naive `touch -t` stamps are UTC; host-local
5
5
  // conversion would leak process timezone through a later `date -r`.
6
6
 
7
+ use super::clap_cache::cached_command;
7
8
  use crate::time_compat::SystemTime;
8
9
  use async_trait::async_trait;
9
10
  use chrono::{DateTime, Datelike, NaiveDate, Utc};
@@ -1015,10 +1016,13 @@ fn mktemp_name(template: Option<&str>, suffix: &str) -> String {
1015
1016
  }
1016
1017
  }
1017
1018
 
1019
+ // Cached `mktemp` arg surface: pre-built once, cloned per invocation.
1020
+ // See `builtins::clap_cache` for why it is built, not just constructed.
1021
+ cached_command!(mktemp_cmd, super::generated::mktemp_args::mktemp_command());
1022
+
1018
1023
  #[async_trait]
1019
1024
  impl Builtin for Mktemp {
1020
1025
  async fn execute(&self, ctx: Context<'_>) -> Result<ExecResult> {
1021
- use super::generated::mktemp_args::mktemp_command;
1022
1026
  use std::ffi::OsString;
1023
1027
  use std::path::PathBuf;
1024
1028
 
@@ -1026,8 +1030,7 @@ impl Builtin for Mktemp {
1026
1030
  .chain(ctx.args.iter().map(OsString::from))
1027
1031
  .collect();
1028
1032
 
1029
- let cmd = mktemp_command().help_template("Usage: {usage}\n{about}\n\n{all-args}\n");
1030
- let matches = match cmd.try_get_matches_from(argv) {
1033
+ let matches = match mktemp_cmd().try_get_matches_from(argv) {
1031
1034
  Ok(m) => m,
1032
1035
  Err(e) => {
1033
1036
  let kind = e.kind();
@@ -1134,7 +1137,6 @@ impl Builtin for Mktemp {
1134
1137
  Ok(ExecResult::err(msg, 1))
1135
1138
  }
1136
1139
  }
1137
-
1138
1140
  #[cfg(test)]
1139
1141
  mod tests {
1140
1142
  use super::*;
@@ -1,5 +1,6 @@
1
1
  //! od, xxd, and hexdump builtins - byte-level inspection tools
2
2
 
3
+ use super::clap_cache::cached_command;
3
4
  use async_trait::async_trait;
4
5
 
5
6
  use super::{Builtin, Context};
@@ -221,18 +222,20 @@ fn od_dump(data: &[u8], opts: &OdOptions) -> String {
221
222
  output
222
223
  }
223
224
 
225
+ // Cached `od` arg surface: pre-built once, cloned per invocation.
226
+ // See `builtins::clap_cache` for why it is built, not just constructed.
227
+ cached_command!(od_cmd, super::generated::od_args::od_command());
228
+
224
229
  #[async_trait]
225
230
  impl Builtin for Od {
226
231
  async fn execute(&self, ctx: Context<'_>) -> Result<ExecResult> {
227
- use super::generated::od_args::od_command;
228
232
  use std::ffi::OsString;
229
233
 
230
234
  let argv: Vec<OsString> = std::iter::once(OsString::from("od"))
231
235
  .chain(ctx.args.iter().map(OsString::from))
232
236
  .collect();
233
237
 
234
- let cmd = od_command().help_template("Usage: {usage}\n{about}\n\n{all-args}\n");
235
- let matches = match cmd.try_get_matches_from(argv) {
238
+ let matches = match od_cmd().try_get_matches_from(argv) {
236
239
  Ok(m) => m,
237
240
  Err(e) => {
238
241
  let kind = e.kind();
@@ -662,7 +665,6 @@ async fn collect_input(
662
665
 
663
666
  Ok(data)
664
667
  }
665
-
666
668
  #[cfg(test)]
667
669
  mod tests {
668
670
  use super::*;