bash-classify 0.6.0__tar.gz → 0.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {bash_classify-0.6.0 → bash_classify-0.8.0}/.claude-plugin/marketplace.json +1 -1
- {bash_classify-0.6.0 → bash_classify-0.8.0}/PKG-INFO +1 -1
- {bash_classify-0.6.0 → bash_classify-0.8.0}/SPEC.md +4 -2
- {bash_classify-0.6.0 → bash_classify-0.8.0}/coding-agent-plugins/claude-code/.claude-plugin/plugin.json +1 -1
- bash_classify-0.8.0/coding-agent-plugins/claude-code/hooks/hook-permission-request.sh +37 -0
- bash_classify-0.8.0/coding-agent-plugins/claude-code/hooks/hooks.json +31 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/docs/classification-guidance.md +8 -2
- {bash_classify-0.6.0 → bash_classify-0.8.0}/schemas/command.schema.json +8 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/bash.yaml +2 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/env.yaml +0 -1
- bash_classify-0.8.0/src/bash_classify/commands/gog.yaml +983 -0
- bash_classify-0.8.0/src/bash_classify/commands/mise.yaml +579 -0
- bash_classify-0.8.0/src/bash_classify/commands/pnpm.yaml +343 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/pup.yaml +272 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/sh.yaml +2 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/xargs.yaml +0 -1
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/database.py +4 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/matcher.py +28 -8
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/models.py +2 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/test_classifier.py +4 -2
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/test_matcher.py +71 -0
- bash_classify-0.6.0/coding-agent-plugins/claude-code/hooks/hooks.json +0 -18
- {bash_classify-0.6.0 → bash_classify-0.8.0}/.claude/rules/command-database.md +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/.editorconfig +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/.github/workflows/ci.yml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/.github/workflows/publish.yml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/.gitignore +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/.python-version +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/CLAUDE.md +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/LICENSE +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/README.md +0 -0
- /bash_classify-0.6.0/coding-agent-plugins/claude-code/hooks/classify-bash.sh → /bash_classify-0.8.0/coding-agent-plugins/claude-code/hooks/hook-pre-tool-use.sh +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/pyproject.toml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/ruff.toml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/__init__.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/__main__.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/classifier.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/cli.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/agent-browser.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/apt.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/awk.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/basename.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/bash-classify.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/black.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/brew.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/builtin.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/cargo.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/cat.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/chgrp.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/chmod.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/chown.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/column.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/comm.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/command.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/cp.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/curl.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/cut.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/date.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/df.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/diff.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/dig.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/dirname.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/docker.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/du.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/echo.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/eslint.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/expand.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/false.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/file.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/find.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/fmt.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/fold.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/free.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/gawk.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/gcloud.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/gh.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/git.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/glab-discussion.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/glab.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/go.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/gradle.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/gradlew.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/grep.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/groups.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/gunzip.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/gws.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/gzip.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/hadolint.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/head.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/helm.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/hostname.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/id.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/install.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/isort.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/java.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/javac.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/join.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/journalctl.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/jq.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/kill.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/killall.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/kubectl.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/less.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/ln.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/ls.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/make.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/md5sum.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/mkdir.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/more.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/mv.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/mvn.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/mvnw.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/mypy.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/netstat.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/nice.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/nl.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/node.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/nohup.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/npm.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/npx.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/nslookup.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/paste.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/ping.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/pip.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/pip3.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/pipx.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/pkill.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/poetry.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/prettier.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/printenv.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/printf.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/ps.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/pwd.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/pytest.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/python.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/python3.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/read.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/readlink.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/realpath.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/rev.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/rg.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/rm.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/rsync.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/ruff.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/scp.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/sed.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/seq.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/sha1sum.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/sha256sum.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/shellcheck.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/sort.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/ss.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/ssh.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/stat.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/strace.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/sudo.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/systemctl.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/tac.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/tail.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/tar.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/tee.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/terraform.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/test.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/time.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/timeout.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/top.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/touch.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/tr.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/traceroute.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/true.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/tsc.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/type.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/uname.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/unexpand.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/uniq.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/unzip.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/uptime.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/uv.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/wc.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/wget.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/whereis.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/which.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/whoami.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/xmllint.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/yarn.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/yes.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/yq.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/zip.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/commands/zsh.yaml +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/parser.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/src/bash_classify/py.typed +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/__init__.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/conftest.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/test_cli.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/test_cli_serialization.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/test_database.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/test_models.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/test_parser.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/test_real_world.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/test_schema.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/tests/test_smoke.py +0 -0
- {bash_classify-0.6.0 → bash_classify-0.8.0}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bash-classify
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: Classify bash commands as READONLY, WRITE, DANGEROUS, or UNKNOWN
|
|
5
5
|
Project-URL: Homepage, https://github.com/fprochazka/bash-classify
|
|
6
6
|
Project-URL: Repository, https://github.com/fprochazka/bash-classify
|
|
@@ -151,13 +151,13 @@ $ echo 'sh -c "ls /tmp | grep log"' | bash-classify
|
|
|
151
151
|
```json
|
|
152
152
|
{
|
|
153
153
|
"expression": "sh -c \"ls /tmp | grep log\"",
|
|
154
|
-
"classification": "
|
|
154
|
+
"classification": "READONLY",
|
|
155
155
|
"directories": ["/tmp"],
|
|
156
156
|
"commands": [
|
|
157
157
|
{
|
|
158
158
|
"command": ["sh"],
|
|
159
159
|
"argv": ["sh", "-c", "ls /tmp | grep log"],
|
|
160
|
-
"classification": "
|
|
160
|
+
"classification": "READONLY",
|
|
161
161
|
"matched_rule": "sh",
|
|
162
162
|
"inner_commands": [
|
|
163
163
|
{
|
|
@@ -850,6 +850,8 @@ The `delegates_to` field defines how a command (or option like `find -exec`) han
|
|
|
850
850
|
| `flag` | `string` | For `flag_value_is_expression`: which flag's value to parse |
|
|
851
851
|
| `strip_assignments` | `bool` | For `rest_are_argv`: strip leading `KEY=VALUE` tokens before the inner command |
|
|
852
852
|
| `min_classification` | `enum` | Floor classification for the inner command (e.g. `sudo` forces at least `EXTERNAL_EFFECTS`) |
|
|
853
|
+
| `delegated_classification` | `enum` | When delegation resolves at least one inner command, the wrapper's own classification drops to this value before inner-elevation is applied. Intended for pure delegation wrappers like `sh -c` / `bash -c` where the wrapper itself has no effect beyond the command it runs. Only applies when the current classification came from the command's own base (not from an option override or strict-mode escalation). |
|
|
854
|
+
| `delegated_risk` | `enum` | Optional companion to `delegated_classification` — the risk floor applied when delegation resolves. Defaults to the default risk for `delegated_classification`. |
|
|
853
855
|
|
|
854
856
|
### Database field reference
|
|
855
857
|
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Fallback hook: PreToolUse isn't consistently fired from subagents, so we
|
|
5
|
+
# also classify on PermissionRequest (just before the user sees the dialog)
|
|
6
|
+
# and auto-allow low-risk commands there.
|
|
7
|
+
|
|
8
|
+
BASH_CLASSIFY=""
|
|
9
|
+
if command -v bash-classify &>/dev/null; then
|
|
10
|
+
BASH_CLASSIFY="bash-classify"
|
|
11
|
+
elif [[ -x "$HOME/.local/bin/bash-classify" ]]; then
|
|
12
|
+
BASH_CLASSIFY="$HOME/.local/bin/bash-classify"
|
|
13
|
+
else
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
input=$(cat)
|
|
18
|
+
|
|
19
|
+
command=$(echo "$input" | jq -r '.tool_input.command // empty')
|
|
20
|
+
|
|
21
|
+
if [[ -z "$command" ]]; then
|
|
22
|
+
exit 0
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
classification_output=$(echo "$command" | "$BASH_CLASSIFY" 2>/dev/null) || true
|
|
26
|
+
|
|
27
|
+
if [[ -z "$classification_output" ]]; then
|
|
28
|
+
exit 0
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
risk=$(echo "$classification_output" | jq -r '.risk // empty')
|
|
32
|
+
|
|
33
|
+
if [[ "$risk" == "LOW" ]]; then
|
|
34
|
+
echo '{"hookSpecificOutput":{"hookEventName":"PermissionRequest","decision":{"behavior":"allow"}}}'
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
exit 0
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Auto-allow low-risk bash commands using bash-classify",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"PreToolUse": [
|
|
5
|
+
{
|
|
6
|
+
"matcher": "Bash",
|
|
7
|
+
"hooks": [
|
|
8
|
+
{
|
|
9
|
+
"type": "command",
|
|
10
|
+
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/hook-pre-tool-use.sh",
|
|
11
|
+
"timeout": 10,
|
|
12
|
+
"statusMessage": "Classifying bash command..."
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"PermissionRequest": [
|
|
18
|
+
{
|
|
19
|
+
"matcher": "Bash",
|
|
20
|
+
"hooks": [
|
|
21
|
+
{
|
|
22
|
+
"type": "command",
|
|
23
|
+
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/hook-permission-request.sh",
|
|
24
|
+
"timeout": 10,
|
|
25
|
+
"statusMessage": "Classifying bash command..."
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -236,6 +236,12 @@ subcommands:
|
|
|
236
236
|
|
|
237
237
|
Some commands do not do work themselves -- they delegate to an inner command. bash-classify models this with `delegates_to`, which tells the matcher how to extract the inner command's argv and classify it recursively.
|
|
238
238
|
|
|
239
|
+
### Pure-wrapper rule of thumb
|
|
240
|
+
|
|
241
|
+
For commands that are pure passthroughs -- they do nothing themselves beyond running the inner command (e.g. `env`, `xargs`, `mise exec`, `pnpm exec`) -- **omit `classification`**. The missing base defaults to `READONLY`, which is the identity element for severity-max against the delegated inner: the inner command's classification is what surfaces. Writing `classification: READONLY` explicitly on a pure wrapper is misleading -- it reads as "this command is safe" when the real intent is "inherit from whatever I wrap."
|
|
242
|
+
|
|
243
|
+
Only set a non-`READONLY` base when the wrapper itself contributes risk regardless of the inner (e.g. `sudo` is `EXTERNAL_EFFECTS` because it elevates privileges) or when the wrapper also has a meaningful standalone behavior that isn't READONLY.
|
|
244
|
+
|
|
239
245
|
### `rest_are_argv`
|
|
240
246
|
|
|
241
247
|
All remaining positional args (after the wrapper's own options) form the inner command.
|
|
@@ -244,7 +250,7 @@ All remaining positional args (after the wrapper's own options) form the inner c
|
|
|
244
250
|
|
|
245
251
|
```yaml
|
|
246
252
|
command: xargs
|
|
247
|
-
classification
|
|
253
|
+
# classification omitted -- pure passthrough, inherits from inner
|
|
248
254
|
delegates_to:
|
|
249
255
|
mode: rest_are_argv
|
|
250
256
|
options:
|
|
@@ -267,7 +273,7 @@ delegates_to:
|
|
|
267
273
|
|
|
268
274
|
```yaml
|
|
269
275
|
command: env
|
|
270
|
-
classification
|
|
276
|
+
# classification omitted -- pure passthrough
|
|
271
277
|
delegates_to:
|
|
272
278
|
mode: rest_are_argv
|
|
273
279
|
strip_assignments: true # strip leading KEY=VALUE tokens
|
|
@@ -116,6 +116,14 @@
|
|
|
116
116
|
"min_classification": {
|
|
117
117
|
"$ref": "#/$defs/Classification",
|
|
118
118
|
"description": "Floor classification for the inner command"
|
|
119
|
+
},
|
|
120
|
+
"delegated_classification": {
|
|
121
|
+
"$ref": "#/$defs/Classification",
|
|
122
|
+
"description": "When delegation successfully resolves at least one inner command, the wrapper's own classification drops to this value before inner-elevation is applied. Use for pure delegation wrappers like sh/bash where the wrapper itself has no effect beyond the command it runs."
|
|
123
|
+
},
|
|
124
|
+
"delegated_risk": {
|
|
125
|
+
"$ref": "#/$defs/Risk",
|
|
126
|
+
"description": "Optional companion to delegated_classification — the risk floor applied when delegation resolves. Defaults to the default risk for delegated_classification."
|
|
119
127
|
}
|
|
120
128
|
}
|
|
121
129
|
},
|