Releases: vlshcc/vlsh
Releases · vlshcc/vlsh
v1.1.1
2026-02-20 — version 1.1.1
Features added
output_hook plugin capability
- Plugins can now capture the stdout of every command by declaring the
output_hookcapability. The shell invokes the plugin binary as:
<binary> output_hook <cmdline> <exit_code> <output>
where<output>is the captured stdout of the command. - Output is captured for pipe-chain commands (the final stage that receives
piped input) and for the built-inechocommand. Direct-terminal commands
(interactive programs such asvimorhtop, and plain non-piped
commands) pass an empty string so that TTY behaviour is never broken. has_output_hook booladded to thePluginstruct inplugins/plugins.v;
parsed inplugins.load()alongside the existing capability tokens.- New
run_output_hooks(loaded []Plugin, cmdline string, exit_code int, output string)function inplugins/plugins.v; invoked from
dispatch_cmd()invlsh.vafter every external command, theecho
built-in, and the system-lsfallthrough path. last_output stringfield added toexec.Task; populated inrun()when
the final pipe-stage output is naturally captured.dispatch_cmd()invlsh.vgains afull_cmdline stringparameter so
hooks see the original unsplit input rather than a reconstructed string.
New example plugin: examples/output_log.v
- Demonstrates
output_hookby recording a timestamped block per command
(header + captured stdout) to~/.vlsh/output.log. - Registers two shell commands:
output_search <pattern>— grep the log for entries matching a patternoutput_log_clear— wipe the log file
- Skips empty commands and internal plugin-management invocations to keep
the log clean.
Documentation
README.mdupdated: feature bullets, plugin-system paragraph, plugin
protocol tables (output_hookargument and capability token rows),
example-plugin snippet, newoutput_logplugin section, module API
summary (run_output_hooksadded).help pluginsupdated incmds/cmds.v: capabilities block added listing
all six capability tokens includingoutput_hook.examples/hello_plugin.vprotocol header updated withoutput_hook
argument documentation.- Version bumped to
1.1.1invlsh.vandv.mod.
v1.1.0
2026-02-20 — version 1.1.0
Features added
Versioned remote plugin structure
- The remote plugin repository now uses a folder-per-plugin layout:
vlshcc/plugins/<name>/contains aDESCmetadata file (TOML: name,
author, email, description) and one subdirectory per semver release
(v1.0.0/,v1.1.0/, …), each holding the plugin's.vsource file. - Locally, plugins are stored in
~/.vlsh/plugins/<name>/<version>/<name>.v
(only the installed version is kept). Compiled binaries remain in the flat
~/.vlsh/plugins/.bin/directory as before. - Old flat
.vfiles in~/.vlsh/plugins/are silently ignored; no
migration is required.
New and updated plugin subcommands
plugins listnow shows the installed semver version next to each name.plugins remotenow marks each installed plugin with its version and flags
when a newer version is available in the remote repository
([installed v1.0.0, update available: v1.1.0]).plugins search <query>(new) — replacesplugins remote search; searches
both the plugin name and thedescriptionfield from the DESC file
(case-insensitive).plugins install <name>now resolves and installs the latest semver version
and prints the installed version string (git v1.1.0 installed).plugins update [name](new) — with a name, updates that one plugin to the
latest remote version; without a name, updates every installed plugin.
Prints one status line per plugin (updated or already at latest). Reloads
plugins after any successful update.plugins delete <name>now removes the entire plugin folder
(os.rmdir_all) instead of just the.vfile.
New structs and helpers in plugins/plugins.v
PluginDesc { name, author, email, description string }— holds metadata
parsed from a remoteDESCfile.InstalledPlugin { name, version, src string }— holds the name, installed
semver version, and source path of a local plugin.Pluginstruct gains aversion stringfield populated at load time.- New public functions:
installed_list(),remote_plugin_names(),
remote_versions(),latest_remote_version(),fetch_desc(),
update_plugin(),search_remote(). install(name)now returns the installed version string (!string).remote_available()removed; replaced byremote_plugin_names().- Semver ordering:
parse_semver/compare_semverhelpers sort version
strings using a[3]intfixed array. - TOML parsing: lightweight line-by-line
parse_desc/extract_toml_val
helpers — no external library required.
Automatic plugin directory creation
~/.vlsh/plugins/(and~/.vlsh/plugins/.bin/) are now created
automatically on startup if they do not exist.
Bugs fixed
GitHub API directory detection broken (plugins remote)
- V's JSON decoder does not correctly handle
@[json: 'type']when the
JSON key is a language keyword, leaving the mapped field always empty.
Replaced with a check onhtml_url.contains('/tree/'), which is a
guaranteed GitHub API property for directory entries (files use/blob/).
This fixesplugins remotereporting "no remote plugins found" even when
the remote repository is reachable and correctly structured.
Documentation
README.mdupdated: plugin feature bullet, installation section
(v1.1.0 URLs), built-in commands table, shell-features plugins paragraph,
"How plugins work" section, managing-plugins command block, example plugin
install instructions, and module API summary.help pluginsupdated: removedplugins remote list/plugins remote search; addedplugins search <query>andplugins update [name];
updated descriptions forplugins listandplugins remote.- Version bumped to
1.1.0invlsh.vandv.mod.
v1.0.11
2026-02-19 — version 1.0.11
Features added
Plugin mux status bar hook (mux_status capability)
- Plugins can now contribute text to the centre of the mux status bar by
declaring themux_statuscapability and handling themux_statusargument. - The mux polls each capable plugin binary roughly once per second while mux is
active and displays the joined output centred between the fixedvlsh mux
(left) and pane-count (right) labels. Multiple plugins' outputs are separated
by two spaces. The text is truncated to fit if the terminal is too narrow. has_mux_status booladded to thePluginstruct inplugins/plugins.v;
parsed inplugins.load()alongside the existing capability tokens.- New
mux_status_binaries(loaded []Plugin) []stringhelper in
plugins/plugins.vreturns the binary paths of allmux_status-capable
plugins, ready to be passed tomux.enter(). mux.enter()signature changed toenter(status_providers []string).
The providers are stored onMuxand polled via the new
refresh_status_text()method inmux/mux.v.render_statusbar_sb,render_all, andrender_dirtyinmux/render.v
each gain astatus_text stringparameter; the status bar renders the text
centred in the fill region when it is non-empty.vlsh.vpassesplugins.mux_status_binaries(loaded_plugins)to
mux.enter()so the live plugin list is always used.examples/hello_plugin.vupdated:mux_statusadded to the capabilities
block and a matching handler stub prints[ example plugin ].- Version bumped to
1.0.11invlsh.vandv.mod. - Packages rebuilt:
builds/vlsh_1.0.11_amd64.deband
builds/vlsh_1.0.11_amd64_linux.
v1.0.10
2026-02-19 — version 1.0.10
Changes
share command extracted into a plugin
- The
share <file>built-in command has been removed from the main shell
binary and moved to a standalone plugin (plugins/share.vin the official
plugin repository at https://github.com/vlshcc/plugins). - The
pub fn share()function and itsnet.httpimport have been removed
fromcmds/cmds.v. The'share'dispatch case has been removed from
vlsh.v. Theshareentry has been removed from thehelplisting and
help_subincmds/cmds.v. - To restore the command:
plugins install sharethenplugins reload. - Version bumped to
1.0.10invlsh.vandv.mod. - Packages rebuilt:
builds/vlsh_1.0.10_amd64.deband
builds/vlsh_1.0.10_amd64_linux.
v1.0.9
2026-02-19 — version 1.0.9
Features added
Remote plugin repository support
- New
plugins remote/plugins remote listsubcommand lists all plugins
available in the official repository at https://github.com/vlshcc/plugins.
Already-installed plugins are shown in bold with an[installed]tag. plugins remote search <query>filters the remote list by name substring
(case-insensitive).plugins install <name>downloads the named.vsource file from the remote
repository into~/.vlsh/plugins/without requiring git, curl, or any
external tooling. After installing, runplugins reloadto activate it.plugins delete <name>removes a locally installed plugin's source file and
compiled binary, and immediately unloads it from the active session.- Implemented in
plugins/plugins.v:remote_available() ![]string,
install(name string) !,delete_plugin(name string) !. Uses
https://api.github.com/repos/vlshcc/plugins/contentsfor listing and
https://raw.githubusercontent.com/vlshcc/plugins/main/<name>.vfor
downloads.
v1.0.8
2026-02-19 — version 1.0.8
Bugs fixed
Glob expansion failed for paths containing ../ or ./
cp ../plugins/* .(and similar patterns with relative path components)
passed the literal*to the external command instead of expanding it.- Root cause: V's
os.globwalks directory entries internally and explicitly
skips.and..entries, so any glob pattern whose directory component
contains../or./always returned zero matches. - Fixed in
utils/utils.v(glob_expand): when the pattern contains a/,
the directory component is now resolved to an absolute path via
os.real_path()beforeos.globis called. The filename wildcard is
kept as-is, so../plugins/*becomes/home/user/repos/plugins/*and
matches correctly.
Other changes
- Version bumped to
1.0.8invlsh.vandv.mod. - Packages rebuilt:
builds/vlsh_1.0.8_amd64.deband
builds/vlsh_1.0.8_amd64_linux.
v1.0.7
Features added
Mux scrollback buffer
- Each mux pane now retains up to 1 000 lines of scrollback history. Rows that
scroll off the top of the visible area are saved into a per-pane ring buffer
(scrollback [][]Cell, maxscrollback_max = 1000rows) inmux/pane.v. view_scroll_up(n int)/view_scroll_down(n int)methods move the
viewport into or back out of the scrollback buffer.- While scrolled back, the view is kept anchored: every new line of output
incrementsscroll_offsetso the same historical rows stay on screen.
When the buffer reaches capacity the oldest row is silently dropped (one-row
drift is accepted at that point). - An orange indicator (
-N lines) is rendered in the top-right corner of the
pane wheneverscroll_offset > 0, so the user always knows they are in
scroll view. Implemented inrender_pane_sbinmux/render.v. - Text selection highlighting is suppressed while in scroll view (selection
coordinates are relative to the live grid only).
Mux scroll controls
- Mouse wheel — scroll wheel up/down events (SGR
Cb=64/Cb=65)
are now intercepted inmux/input.vand mapped to the new
scroll_pane_up/scroll_pane_downMuxActionvariants. Mouse wheel
always scrolls the active pane regardless of prefix state. - Keyboard —
Ctrl+V+PageUp(\x1b[5~) /Ctrl+V+PageDown
(\x1b[6~) also scroll the active pane. Handled in theprefix_waitbranch
ofInputHandler.handle(). - Scrolling is wired to the new
do_scroll_pane(up bool)helper in
mux/mux.vwhich moves the active pane by 5 lines per step.
Bugs fixed
SSH hostname completion plugin failed to compile
hosts_from_config() + hosts_from_known_hosts()used the+operator on
two[]stringvalues, which V does not support.- Fixed in
~/.vlsh/plugins/ssh_hosts.vby replacing the expression with an
explicit<<append:mut combined := hosts_from_config() combined << hosts_from_known_hosts()
Other changes
- Version bumped to
1.0.7invlsh.vandv.mod. help muxupdated with the new scroll keybindings and a note about the
1 000-line scrollback buffer.README.mdmux section updated: feature bullet extended, keybindings table
includesPageUp,PageDown, and mouse wheel rows, and a paragraph
describing the scroll indicator was added.- Disclaimer added to
README.md: the creator is not liable for any
damage, data loss, or other consequence from using vlsh or its plugins. - Packages rebuilt:
builds/vlsh_1.0.7_amd64.deband
builds/vlsh_1.0.7_amd64_linux.
v1.0.6
added a ssh hosts plugin, completion support for plugin and plugin di…
v1.0.5
Compiled binary (vlsh_1.0.5_amd64_linux) and deb package (tried on debian 13 and xubuntu 25.10)