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