BeepBoopBit/plk
CLI that detects repeated command sequences from your shell history and turns them into reusable shortcuts
plk
Command sequence merger CLI — detects repeated command patterns from your shell history and lets you save/run them as shortcuts.
The Problem
You keep typing the same multi-step command sequences:
cd ~/project/frontend
pnpm run devgit add .
git commit -m "wip"
git pushEvery time. Manually. plk detects these patterns automatically and lets you run them with a single command.
Installation
From source
git clone https://github.com/BeepBoopBit/plk.git
cd plk
cargo build --release
cp target/release/plk ~/.local/bin/From crates.io
cargo install plkQuick Start
# 1. Install the shell hook
plk init --shell zsh # or bash
# 2. Reload your shell
source ~/.zshrc
# 3. Use your shell normally — plk records commands in the background
# 4. After repeating patterns, check what plk detected
plk ls auto
# 5. Run a detected sequence
plk auto <id>
# 6. Save it as a named shortcut
plk save <id> --name dev
# 7. Run it anytime
plk run devSee QUICKSTART.md for a detailed walkthrough.
Commands
| Command | Description |
|---|---|
plk init [--shell zsh|bash] |
Install shell hook, completions, and optionally enable swapx |
plk auto [id] |
List or run auto-detected sequences |
plk run <name> |
Run a saved shortcut |
plk ls auto |
List auto-detected sequences |
plk ls saved |
List saved shortcuts |
plk save <id> --name <n> |
Save an auto-detected sequence |
plk add --name <name> "<cmd>" |
Manually add a shortcut |
plk rm <name> |
Remove a saved shortcut |
plk dismiss <id> |
Dismiss a suggestion permanently |
plk gc |
Clean up old history entries |
plk reset |
Wipe all plk data and start fresh |
How It Works
- A shell hook (installed via
plk init) records every command you run with its timestamp and working directory plksegments your history into sessions (split by 5s gaps)- Repeated sequences of 2+ commands are detected and ranked by frequency
- When a sequence is repeated enough times (default 10), plk suggests saving it:
plk: "cd ~/project/frontend && pnpm run dev" repeated 10x. Save it? Run: plk save a1b2c3 --name <name> To dismiss: plk dismiss a1b2c3 - You can browse, run, or save these as named shortcuts
Configuration
Optional config at ~/.config/plk/config.toml:
# Time gap (ms) that splits history into sessions (default: 5000)
session_gap_ms = 5000
# Minimum repetitions to detect a sequence (default: 2)
min_frequency = 2
# Only consider history from the last N days (default: 30)
history_days = 30
# Maximum history entries to keep (default: 10000)
max_history_entries = 10000
# Suggest saving a sequence after this many repetitions (default: 10, 0 to disable)
suggestion_threshold = 10
# Enable swapx integration — plk will write rules to ~/.config/swapx/rules.plk.yaml (default: false)
swapx_integration = falseData Storage
| What | Default Path |
|---|---|
| History log | ~/.local/share/plk/history.log |
| Saved shortcuts | ~/.local/share/plk/shortcuts.json |
| Dismissed suggestions | ~/.local/share/plk/dismissed.json |
| Config | ~/.config/plk/config.toml |
Override with PLK_DATA_DIR and PLK_CONFIG_DIR environment variables.
swapx Integration
If you use swapx, plk can automatically register rules so that typing the first command of a shortcut triggers a swapx prompt.
Setup
During plk init, if swapx is detected on your system, plk will ask:
swapx detected. Enable swapx integration? (y/N)
You can also enable it manually in ~/.config/plk/config.toml:
swapx_integration = trueHow it works
When you save a shortcut, plk writes a rule to ~/.config/swapx/rules.plk.yaml (a separate file from your manual swapx rules). The rule uses the raw command you typed as the match — so if you use zoxide and type cd project, the swapx match is cd project, not the resolved absolute path.
plk will also ask whether the rule should be global or directory-scoped:
Swapx rule scope — directory (/home/user/projects) or global? (d/G)
- Global (default) — the rule triggers anywhere
- Directory — the rule only triggers when you're in that specific directory (uses swapx's
dirfield)
Example
plk add --name dev "cd prompt && pnpm run dev"
# Swapx rule scope — directory (/home/user/projects) or global? (d/G) GNow typing cd prompt triggers swapx:
? cd prompt
> plk: dev (cd prompt && pnpm run dev)
just cd prompt (default)
Removing a shortcut (plk rm) or resetting (plk reset) cleans up rules.plk.yaml automatically — your manual swapx rules in rules.yaml are never touched.
Shell Support
- zsh — full support (hook + tab completions with descriptions)
- bash — full support (hook + tab completions)
Tip: Use zoxide for Smarter cd
zoxide is a smarter cd that learns which directories you visit most. It pairs well with plk — when you type cd project instead of cd /home/user/long/path/to/project, plk records the short alias you actually typed, making detected sequences more readable and swapx rules more intuitive.
Tip: Use fzf for Better Tab Completion
If you have fzf installed, its tab completion integration gives you a much nicer experience — fuzzy filtering, a preview of each sequence, and arrow-key selection instead of cycling through options.
For zsh, add to your .zshrc (after plk init):
# fzf must be set up first: https://github.com/junegunn/fzf#setting-up-shell-integration
source <(fzf --zsh)For bash, add to your .bashrc (after plk init):
eval "$(fzf --bash)"Then plk auto <TAB> will open an fzf picker with the sequence descriptions.