|
| 1 | +export * as BashArity from "./arity" |
| 2 | + |
| 3 | +const ARITY: Record<string, number> = { |
| 4 | + cat: 1, // cat file.txt |
| 5 | + cd: 1, // cd /path/to/dir |
| 6 | + chmod: 1, // chmod 755 script.sh |
| 7 | + chown: 1, // chown user:group file.txt |
| 8 | + cp: 1, // cp source.txt dest.txt |
| 9 | + echo: 1, // echo "hello world" |
| 10 | + env: 1, // env |
| 11 | + export: 1, // export PATH=/usr/bin |
| 12 | + grep: 1, // grep pattern file.txt |
| 13 | + kill: 1, // kill 1234 |
| 14 | + killall: 1, // killall process |
| 15 | + ln: 1, // ln -s source target |
| 16 | + ls: 1, // ls -la |
| 17 | + mkdir: 1, // mkdir new-dir |
| 18 | + mv: 1, // mv old.txt new.txt |
| 19 | + ps: 1, // ps aux |
| 20 | + pwd: 1, // pwd |
| 21 | + rm: 1, // rm file.txt |
| 22 | + rmdir: 1, // rmdir empty-dir |
| 23 | + sleep: 1, // sleep 5 |
| 24 | + source: 1, // source ~/.bashrc |
| 25 | + tail: 1, // tail -f log.txt |
| 26 | + touch: 1, // touch file.txt |
| 27 | + unset: 1, // unset VAR |
| 28 | + which: 1, // which node |
| 29 | + aws: 3, // aws s3 ls |
| 30 | + az: 3, // az storage blob list |
| 31 | + bazel: 2, // bazel build |
| 32 | + brew: 2, // brew install node |
| 33 | + bun: 2, // bun install |
| 34 | + "bun run": 3, // bun run dev |
| 35 | + "bun x": 3, // bun x vite |
| 36 | + cargo: 2, // cargo build |
| 37 | + "cargo add": 3, // cargo add tokio |
| 38 | + "cargo run": 3, // cargo run main |
| 39 | + cdk: 2, // cdk deploy |
| 40 | + cf: 2, // cf push app |
| 41 | + cmake: 2, // cmake build |
| 42 | + composer: 2, // composer require laravel |
| 43 | + consul: 2, // consul members |
| 44 | + "consul kv": 3, // consul kv get config/app |
| 45 | + crictl: 2, // crictl ps |
| 46 | + deno: 2, // deno run server.ts |
| 47 | + "deno task": 3, // deno task dev |
| 48 | + doctl: 3, // doctl kubernetes cluster list |
| 49 | + docker: 2, // docker run nginx |
| 50 | + "docker builder": 3, // docker builder prune |
| 51 | + "docker compose": 3, // docker compose up |
| 52 | + "docker container": 3, // docker container ls |
| 53 | + "docker image": 3, // docker image prune |
| 54 | + "docker network": 3, // docker network inspect |
| 55 | + "docker volume": 3, // docker volume ls |
| 56 | + eksctl: 2, // eksctl get clusters |
| 57 | + "eksctl create": 3, // eksctl create cluster |
| 58 | + firebase: 2, // firebase deploy |
| 59 | + flyctl: 2, // flyctl deploy |
| 60 | + gcloud: 3, // gcloud compute instances list |
| 61 | + gh: 3, // gh pr list |
| 62 | + git: 2, // git checkout main |
| 63 | + "git config": 3, // git config user.name |
| 64 | + "git remote": 3, // git remote add origin |
| 65 | + "git stash": 3, // git stash pop |
| 66 | + go: 2, // go build |
| 67 | + gradle: 2, // gradle build |
| 68 | + helm: 2, // helm install mychart |
| 69 | + heroku: 2, // heroku logs |
| 70 | + hugo: 2, // hugo new site blog |
| 71 | + ip: 2, // ip link show |
| 72 | + "ip addr": 3, // ip addr show |
| 73 | + "ip link": 3, // ip link set eth0 up |
| 74 | + "ip netns": 3, // ip netns exec foo bash |
| 75 | + "ip route": 3, // ip route add default via 1.1.1.1 |
| 76 | + kind: 2, // kind delete cluster |
| 77 | + "kind create": 3, // kind create cluster |
| 78 | + kubectl: 2, // kubectl get pods |
| 79 | + "kubectl kustomize": 3, // kubectl kustomize overlays/dev |
| 80 | + "kubectl rollout": 3, // kubectl rollout restart deploy/api |
| 81 | + kustomize: 2, // kustomize build . |
| 82 | + make: 2, // make build |
| 83 | + mc: 2, // mc ls myminio |
| 84 | + "mc admin": 3, // mc admin info myminio |
| 85 | + minikube: 2, // minikube start |
| 86 | + mongosh: 2, // mongosh test |
| 87 | + mysql: 2, // mysql -u root |
| 88 | + mvn: 2, // mvn compile |
| 89 | + ng: 2, // ng generate component home |
| 90 | + npm: 2, // npm install |
| 91 | + "npm exec": 3, // npm exec vite |
| 92 | + "npm init": 3, // npm init vue |
| 93 | + "npm run": 3, // npm run dev |
| 94 | + "npm view": 3, // npm view react version |
| 95 | + nvm: 2, // nvm use 18 |
| 96 | + nx: 2, // nx build |
| 97 | + openssl: 2, // openssl genrsa 2048 |
| 98 | + "openssl req": 3, // openssl req -new -key key.pem |
| 99 | + "openssl x509": 3, // openssl x509 -in cert.pem |
| 100 | + pip: 2, // pip install numpy |
| 101 | + pipenv: 2, // pipenv install flask |
| 102 | + pnpm: 2, // pnpm install |
| 103 | + "pnpm dlx": 3, // pnpm dlx create-next-app |
| 104 | + "pnpm exec": 3, // pnpm exec vite |
| 105 | + "pnpm run": 3, // pnpm run dev |
| 106 | + poetry: 2, // poetry add requests |
| 107 | + podman: 2, // podman run alpine |
| 108 | + "podman container": 3, // podman container ls |
| 109 | + "podman image": 3, // podman image prune |
| 110 | + psql: 2, // psql -d mydb |
| 111 | + pulumi: 2, // pulumi up |
| 112 | + "pulumi stack": 3, // pulumi stack output |
| 113 | + pyenv: 2, // pyenv install 3.11 |
| 114 | + python: 2, // python -m venv env |
| 115 | + rake: 2, // rake db:migrate |
| 116 | + rbenv: 2, // rbenv install 3.2.0 |
| 117 | + "redis-cli": 2, // redis-cli ping |
| 118 | + rustup: 2, // rustup update |
| 119 | + serverless: 2, // serverless invoke |
| 120 | + sfdx: 3, // sfdx force:org:list |
| 121 | + skaffold: 2, // skaffold dev |
| 122 | + sls: 2, // sls deploy |
| 123 | + sst: 2, // sst deploy |
| 124 | + swift: 2, // swift build |
| 125 | + systemctl: 2, // systemctl restart nginx |
| 126 | + terraform: 2, // terraform apply |
| 127 | + "terraform workspace": 3, // terraform workspace select prod |
| 128 | + tmux: 2, // tmux new -s dev |
| 129 | + turbo: 2, // turbo run build |
| 130 | + ufw: 2, // ufw allow 22 |
| 131 | + vault: 2, // vault login |
| 132 | + "vault auth": 3, // vault auth list |
| 133 | + "vault kv": 3, // vault kv get secret/api |
| 134 | + vercel: 2, // vercel deploy |
| 135 | + volta: 2, // volta install node |
| 136 | + wp: 2, // wp plugin install |
| 137 | + yarn: 2, // yarn add react |
| 138 | + "yarn dlx": 3, // yarn dlx create-react-app |
| 139 | + "yarn run": 3, // yarn run dev |
| 140 | +} |
| 141 | + |
| 142 | +/** |
| 143 | + * Longest-matching-prefix command arity: how many tokens make up the |
| 144 | + * human-understandable command. `git commit -m "x"` -> `git commit`, |
| 145 | + * `npm run dev` -> `npm run dev`. |
| 146 | + */ |
| 147 | +export function prefix(tokens: readonly string[]): readonly string[] { |
| 148 | + for (let len = tokens.length; len > 0; len--) { |
| 149 | + const prefix = tokens.slice(0, len).join(" ") |
| 150 | + const arity = ARITY[prefix] |
| 151 | + if (arity !== undefined) return tokens.slice(0, arity) |
| 152 | + } |
| 153 | + if (tokens.length === 0) return [] |
| 154 | + return tokens.slice(0, 1) |
| 155 | +} |
0 commit comments