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.
- {bashkit-0.17.0 → bashkit-0.17.1}/Cargo.lock +9 -9
- {bashkit-0.17.0 → bashkit-0.17.1}/Cargo.toml +1 -1
- {bashkit-0.17.0 → bashkit-0.17.1}/PKG-INFO +1 -1
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/Cargo.toml +4 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/README.md +1 -1
- bashkit-0.17.1/crates/bashkit/benches/builtin_args.rs +178 -0
- bashkit-0.17.1/crates/bashkit/benches/results/criterion-builtin_args-baseline-linux-x86_64-1787421390.md +93 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/logging.md +1 -1
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/sqlite.md +1 -1
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/cat.rs +6 -7
- bashkit-0.17.1/crates/bashkit/src/builtins/clap_cache.rs +131 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/fileops.rs +6 -4
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/hextools.rs +6 -4
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/inspect.rs +6 -4
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/list.rs +7 -7
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/mod.rs +1 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/path.rs +17 -7
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/pipeline.rs +6 -4
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/shuf.rs +6 -4
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/textrev.rs +6 -4
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/truncate.rs +9 -4
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/lib.rs +2 -2
- {bashkit-0.17.0 → bashkit-0.17.1}/README.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/__init__.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/_bashkit.pyi +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/deepagents.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/langchain.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/py.typed +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/bashkit/pydantic_ai.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/awk_regex.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/file_ops.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/hotpath.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/parallel_execution.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/README.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-awk-regex-mykhailos-mini-darwin-arm64-1785952907.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-file_ops-linux-x86_64-1779759850.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-hotpath-attrs+shopt-linux-x86_64-1779759850.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-hotpath-perf-linux-x86_64-1779744742.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-parallel-(none)-linux-x86_64-1773469129.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-parallel-vm-linux-x86_64-1782162173.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-parallel-vm-linux-x86_64-1782168239.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-snapshot-history-baseline-linux-x86_64-1785444523.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-sqlite-Mykhailos-Mini.lan-darwin-arm64-1785957173.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-sqlite-vm-linux-x86_64-1777865268.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/results/criterion-sqlite-vm-linux-x86_64-1786872580.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/snapshot_history.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/benches/sqlite.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/clap-builtins.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/compatibility.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/credential-injection.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/custom_builtins.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/hooks.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/jq.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/live_mounts.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/namespace_filesystems.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/python.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/script-analysis.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/ssh.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/threat-model.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/typescript.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/docs/yq.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/agent_tool.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/basic.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/clap_builtin.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/clap_builtin_subcommands.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/custom_backend.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/custom_builtins.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/custom_filesystem_impl.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/custom_fs.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/dump_builtins.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/generate_snapshot_fixtures.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/git_workflow.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/large_binary_probe.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/live_mounts.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/namespace_rebase.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/namespace_sandbox.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/python_external_functions.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/python_scripts.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/realfs_readonly.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/realfs_readwrite.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/resource_limits.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/scripted_tool.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/show_tool_output.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/sqlite_basic.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/sqlite_workflow.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/ssh_supabase.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/streaming_output.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/text_files.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/text_processing.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/typescript_external_functions.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/typescript_scripts.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/examples/virtual_identity.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/out file.txt +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/proptest-regressions/builtins/sqlite/tests.txt +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/analysis.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/alias.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/archive.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/arg_parser.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/assert.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/awk/interpreter.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/awk/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/awk/parser.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/awk/tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/base64.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/bc.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/caller.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/checksum.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/clap_env.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/clear.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/column.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/comm.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/compgen.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/csv.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/curl.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/cuttr.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/date.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/diff.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/dirstack.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/disk.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/dotenv.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/echo.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/environ.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/envsubst.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/expand.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/export.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/expr.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/fc.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/flow.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/fold.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/cat_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/extendedbigdecimal.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/argument.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/escape.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/human.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/num_format.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format/spec.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/format_support.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/ls_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/mktemp_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/num_parser.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/od_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/readlink_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/realpath_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/shuf_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/stat_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/tac_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/tee_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/generated/truncate_args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/git/client.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/git/cmd.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/git/config.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/git/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/glob_cmd.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/grep.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/headtail.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/help.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/helpers.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/http.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/iconv.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/introspect.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/join.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/args.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/compat.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/convert.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/errors.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/format.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/input.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/regex_compat.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/jq/tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/json.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/limits.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/log.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/find.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/glob.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/rmdir.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ls/tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/mapfile.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/mkfifo.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/navigation.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/nl.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/numfmt.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/parallel.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/paste.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/patch.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/printf.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/python.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/read.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/retry.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/rg/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/runtime_limits.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/search_common.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sed.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/semver.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/seq.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sleep.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sortuniq.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/source.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/split.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/dot_commands.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/engine.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/formatter.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/parser.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/sqlite/vfs_io.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/allowlist.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/client.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/cmd.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/config.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/handler.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/ssh/russh_handler.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/strings.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/system.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/template.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/timeout.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/tomlq.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/trap.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/tree.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/typescript.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/vars.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/verify.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/wait.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/wc.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/yes.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/yq.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/builtins/zip_cmd.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/credential.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/error.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/execution_capability.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/backend.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/limits.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/memory.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/mountable.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/namespace.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/overlay.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/posix.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/readonly.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/realfs.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/search.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/fs/traits.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/hooks.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/host_call.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interop/fs.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interop/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/arithmetic.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/brace_expansion.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/expansion.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/glob.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/jobs.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/redirection.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/state.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/interpreter/time_command.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/limits.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/logging_impl.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/network/allowlist.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/network/bot_auth.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/network/client.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/network/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/network/transport.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/ast.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/budget.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/lexer.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/span.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/parser/tokens.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/profile.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/scripted_tool/execute.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/scripted_tool/extension.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/scripted_tool/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/scripted_tool/toolset.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/capabilities.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/chunker.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/container.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/graph.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/snapshot/objects.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/stream.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/testing.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/time_compat/host_clock.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/time_compat/mod.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/tool.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/tool_def.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/tool_registry.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/src/trace.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/fixtures/competitor-regressions/just-bash-2026-08-05.json +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/fixtures/snapshots/v1.snapshot +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/fixtures/snapshots/v2.snapshot +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/agent_skills_publication_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/allexport_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/archive_bzip2_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/awk_fuzz_scaffold_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/awk_newline_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/awk_pattern_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/awk_printf_expr_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/awk_range_pattern_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/background_exec_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/base64_binary_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/bash_source_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/blackbox_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/builtin_error_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/builtin_registry_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/byte_range_panic_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/byte_stream_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/cancellation_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/cmdsub_quote_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/command_resolver_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/competitor_regression_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/compgen_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/coproc_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/coreutils_differential_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/credential_injection_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/curl_data_compat_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/custom_builtins_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/custom_fs_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/date_timezone_differential_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/date_timezone_no_tzdata_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/date_timezone_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/dev_null_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/exec_options_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/execution_budget_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/execution_capability_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/execution_profile_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/filesystem_security_conformance_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/final_env_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/find_multi_path_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/for_in_reserved_word_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/git_advanced_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/git_inspection_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/git_integration_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/git_remote_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/git_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/glob_fuzz_scaffold_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/glob_intermediate_component_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/harness_example_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/history_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/host_call_execution_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/host_mounts_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_1175_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_1776_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_1777_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_274_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_275_279_282_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_276_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_277_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_289_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_290_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_291_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_853_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_872_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_873_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/issue_875_test.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/jq_fuzz_scaffold_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/limitations_doc_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/limitations_evidence_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/live_mount_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/main.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/mkfifo_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/namespace_fs_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/nested_subscript_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/network_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/output_truncation_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/parallel_sessions_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/proptest_differential.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/python_integration_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/python_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/regex_limit_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/release_profile_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/request_lifecycle_contract_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/runtime_env_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/script_analysis.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/script_execution_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/security_audit_pocs.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/set_e_and_or_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/shuf_resource_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/skills_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/snapshot_fixture_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/snapshot_history_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/snapshot_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/source_function_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/spec_runner.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/spec_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/sqlite_compat_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/sqlite_differential_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/sqlite_fuzz_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/sqlite_integration_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/sqlite_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/stack_overflow_regression_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/subst_depth_limit_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/symlink_overlay_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/thirdparty_adoption_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/threat_model_doc_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/threat_model_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/time_command_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/time_compat_scan_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/tool_registry_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/tty_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/typescript_integration_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/typescript_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/unicode_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/unset_function_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/urandom_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/workflow_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/integration/yq_integration_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/logging_security_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/proptest_security.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/realfs_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/security_failpoint_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/azure_discover_rank.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/azure_generate_url.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/azure_query_capacity.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/helm_validate_chart.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/jwt_test_setup.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/stitch_download_asset.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/stitch_fetch.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/stitch_verify_setup.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/superpowers_find_polluter.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/skills_fixtures/vercel_deploy.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/awk.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/delete-array.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/dev-stderr.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/eval-bugs.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/filename.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/awk/getline-file.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/alias.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/append_redirect.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/arith-dynamic.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/arithmetic-base-expansion.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/arithmetic.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/array-slicing.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/array-splat.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/arrays.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/awk-printf-width.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/background.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bash-c-exports.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bash-command.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bash-flags.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bash-source-var.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bash-stdin-pipe.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/bc.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/blackbox-edge-cases.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/blackbox-exploration.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/brace-expansion.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/brace_expansion_lookahead.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/cat.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/checksum.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/chown-kill.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/cmd-suggestions.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/cmdsub_depth_unquoted.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/column.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/comm.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/command-not-found.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/command-subst.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/command.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/command_v.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/compgen-path.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/conditional-short-circuit.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/conditional.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/control-flow.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/cuttr.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/date.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/declare.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/df.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/diff.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/dirstack.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/du.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/echo.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/empty-bodies.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/env.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/errexit.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/eval-bugs.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/exec-command.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/exec-fd-redirect.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/exec-fd-variable.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/exit-status.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/expr.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/extglob.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/file.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/fileops.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/find.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/functions.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/getopts.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/glob-options.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/glob_match_cap.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/globs.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/gzip.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/headtail.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/help-flag.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/heredoc-edge.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/heredoc.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/herestring.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/hextools.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/history.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/indirect-expansion.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/less.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/ln.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/ls.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/memory_budget_desync.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/mktemp.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/nameref.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/negative-tests.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/nl.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/nounset.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/numfmt.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/od.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/parse-errors.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/paste-flags.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/paste.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/path.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/pipes-redirects.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/printenv.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/printf.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/procsub.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/quote.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/read-builtin.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/readlink.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/recursive-cmdsub.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/regex-limit.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/replace_pattern_limit.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/script-exec.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/seq.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/set-allexport.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/shell-grammar.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/shuf.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/sleep.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/sortuniq.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/source.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/stat.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/string-ops.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/strings.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/subprocess-isolation.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/subshell.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/tar.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/tar_create.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/tee.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/temp-binding.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/test-operators.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/test-tty.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/textrev.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/time.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/timeout.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/tree.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/truncate.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/type.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/unicode.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/unset-exported-var.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/var-op-test.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/variables.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/wait.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/watch.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/wc.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/word-split.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/bash/xargs.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/grep/eval-bugs.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/grep/grep.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/grep/rg.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/jq/jq.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/python/env_leak.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/python/python.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/sed/eval-bugs.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/sed/sed.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/typescript/typescript.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/spec_cases/yq/yq.test.sh +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/ssh_builtin_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/ssh_supabase_tests.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit/tests/support/filesystem_security_conformance.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/Cargo.toml +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/README.md +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/bash_basics.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/custom_filesystem_interop.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/data_pipeline.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/fastapi_async_tool.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/jupyter_async_test.ipynb +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/k8s_orchestrator.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/langgraph_async_tool.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/llm_tool.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/examples/session_history.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/src/lib.rs +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/_bashkit_categories.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/_security_advanced.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/_security_core.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_ai_adapters.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_analyze.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_async_callbacks.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_basic.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_builtins.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_control_flow.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_custom_builtin_fs.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_error_handling.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_execution_profiles.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_fastapi_integration.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_filesystem_interop.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_integration.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_jupyter_compat.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_langgraph_integration.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_network_config.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_network_credentials.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_python_security.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_registered_tools.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_runtime_extension.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_scripts.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_security.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_shell_injection.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_snapshot_history.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_sqlite.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_streaming_output.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_strings_and_quoting.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_teardown_determinism.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_tool_metadata.py +0 -0
- {bashkit-0.17.0 → bashkit-0.17.1}/crates/bashkit-python/tests/test_vfs.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
499
|
+
version = "0.17.1"
|
|
500
500
|
dependencies = [
|
|
501
501
|
"bashkit",
|
|
502
502
|
"console_error_panic_hook",
|
|
@@ -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.
|
|
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.
|
|
17
|
+
bashkit = { version = "0.17.1", features = ["logging"] }
|
|
18
18
|
tracing-subscriber = "0.3" # or your preferred subscriber
|
|
19
19
|
```
|
|
20
20
|
|
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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::*;
|