Skip to content

Releases: vlshcc/vlsh

v1.1.1

20 Feb 07:47

Choose a tag to compare

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_hook capability. 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-in echo command. Direct-terminal commands
    (interactive programs such as vim or htop, and plain non-piped
    commands) pass an empty string so that TTY behaviour is never broken.
  • has_output_hook bool added to the Plugin struct in plugins/plugins.v;
    parsed in plugins.load() alongside the existing capability tokens.
  • New run_output_hooks(loaded []Plugin, cmdline string, exit_code int, output string) function in plugins/plugins.v; invoked from
    dispatch_cmd() in vlsh.v after every external command, the echo
    built-in, and the system-ls fallthrough path.
  • last_output string field added to exec.Task; populated in run() when
    the final pipe-stage output is naturally captured.
  • dispatch_cmd() in vlsh.v gains a full_cmdline string parameter so
    hooks see the original unsplit input rather than a reconstructed string.

New example plugin: examples/output_log.v

  • Demonstrates output_hook by 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 pattern
    • output_log_clear — wipe the log file
  • Skips empty commands and internal plugin-management invocations to keep
    the log clean.

Documentation

  • README.md updated: feature bullets, plugin-system paragraph, plugin
    protocol tables (output_hook argument and capability token rows),
    example-plugin snippet, new output_log plugin section, module API
    summary (run_output_hooks added).
  • help plugins updated in cmds/cmds.v: capabilities block added listing
    all six capability tokens including output_hook.
  • examples/hello_plugin.v protocol header updated with output_hook
    argument documentation.
  • Version bumped to 1.1.1 in vlsh.v and v.mod.

v1.1.0

20 Feb 06:42

Choose a tag to compare

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 a DESC metadata file (TOML: name,
    author, email, description) and one subdirectory per semver release
    (v1.0.0/, v1.1.0/, …), each holding the plugin's .v source 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 .v files in ~/.vlsh/plugins/ are silently ignored; no
    migration is required.

New and updated plugin subcommands

  • plugins list now shows the installed semver version next to each name.
  • plugins remote now 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) — replaces plugins remote search; searches
    both the plugin name and the description field 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 .v file.

New structs and helpers in plugins/plugins.v

  • PluginDesc { name, author, email, description string } — holds metadata
    parsed from a remote DESC file.
  • InstalledPlugin { name, version, src string } — holds the name, installed
    semver version, and source path of a local plugin.
  • Plugin struct gains a version string field 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 by remote_plugin_names().
  • Semver ordering: parse_semver / compare_semver helpers sort version
    strings using a [3]int fixed 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 on html_url.contains('/tree/'), which is a
    guaranteed GitHub API property for directory entries (files use /blob/).
    This fixes plugins remote reporting "no remote plugins found" even when
    the remote repository is reachable and correctly structured.

Documentation

  • README.md updated: 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 plugins updated: removed plugins remote list / plugins remote search; added plugins search <query> and plugins update [name];
    updated descriptions for plugins list and plugins remote.
  • Version bumped to 1.1.0 in vlsh.v and v.mod.

v1.0.11

19 Feb 19:16

Choose a tag to compare

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 the mux_status capability and handling the mux_status argument.
  • The mux polls each capable plugin binary roughly once per second while mux is
    active and displays the joined output centred between the fixed vlsh 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 bool added to the Plugin struct in plugins/plugins.v;
    parsed in plugins.load() alongside the existing capability tokens.
  • New mux_status_binaries(loaded []Plugin) []string helper in
    plugins/plugins.v returns the binary paths of all mux_status-capable
    plugins, ready to be passed to mux.enter().
  • mux.enter() signature changed to enter(status_providers []string).
    The providers are stored on Mux and polled via the new
    refresh_status_text() method in mux/mux.v.
  • render_statusbar_sb, render_all, and render_dirty in mux/render.v
    each gain a status_text string parameter; the status bar renders the text
    centred in the fill region when it is non-empty.
  • vlsh.v passes plugins.mux_status_binaries(loaded_plugins) to
    mux.enter() so the live plugin list is always used.
  • examples/hello_plugin.v updated: mux_status added to the capabilities
    block and a matching handler stub prints [ example plugin ].
  • Version bumped to 1.0.11 in vlsh.v and v.mod.
  • Packages rebuilt: builds/vlsh_1.0.11_amd64.deb and
    builds/vlsh_1.0.11_amd64_linux.

v1.0.10

19 Feb 18:37

Choose a tag to compare

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.v in the official
    plugin repository at https://github.com/vlshcc/plugins).
  • The pub fn share() function and its net.http import have been removed
    from cmds/cmds.v. The 'share' dispatch case has been removed from
    vlsh.v. The share entry has been removed from the help listing and
    help_sub in cmds/cmds.v.
  • To restore the command: plugins install share then plugins reload.
  • Version bumped to 1.0.10 in vlsh.v and v.mod.
  • Packages rebuilt: builds/vlsh_1.0.10_amd64.deb and
    builds/vlsh_1.0.10_amd64_linux.

v1.0.9

19 Feb 17:49

Choose a tag to compare

2026-02-19 — version 1.0.9

Features added

Remote plugin repository support

  • New plugins remote / plugins remote list subcommand 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 .v source file from the remote
    repository into ~/.vlsh/plugins/ without requiring git, curl, or any
    external tooling. After installing, run plugins reload to 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/contents for listing and
    https://raw.githubusercontent.com/vlshcc/plugins/main/<name>.v for
    downloads.

v1.0.8

19 Feb 17:32

Choose a tag to compare

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.glob walks 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() before os.glob is 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.8 in vlsh.v and v.mod.
  • Packages rebuilt: builds/vlsh_1.0.8_amd64.deb and
    builds/vlsh_1.0.8_amd64_linux.

v1.0.7

19 Feb 15:32

Choose a tag to compare

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, max scrollback_max = 1000 rows) in mux/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
    increments scroll_offset so 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 whenever scroll_offset > 0, so the user always knows they are in
    scroll view. Implemented in render_pane_sb in mux/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 in mux/input.v and mapped to the new
    scroll_pane_up / scroll_pane_down MuxAction variants. Mouse wheel
    always scrolls the active pane regardless of prefix state.
  • KeyboardCtrl+V + PageUp (\x1b[5~) / Ctrl+V + PageDown
    (\x1b[6~) also scroll the active pane. Handled in the prefix_wait branch
    of InputHandler.handle().
  • Scrolling is wired to the new do_scroll_pane(up bool) helper in
    mux/mux.v which 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 []string values, which V does not support.
  • Fixed in ~/.vlsh/plugins/ssh_hosts.v by replacing the expression with an
    explicit << append:
    mut combined := hosts_from_config()
    combined << hosts_from_known_hosts()

Other changes

  • Version bumped to 1.0.7 in vlsh.v and v.mod.
  • help mux updated with the new scroll keybindings and a note about the
    1 000-line scrollback buffer.
  • README.md mux section updated: feature bullet extended, keybindings table
    includes PageUp, 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.deb and
    builds/vlsh_1.0.7_amd64_linux.

v1.0.6

19 Feb 15:10

Choose a tag to compare

added a ssh hosts plugin, completion support for plugin and plugin di…

v1.0.5

19 Feb 14:43

Choose a tag to compare

Compiled binary (vlsh_1.0.5_amd64_linux) and deb package (tried on debian 13 and xubuntu 25.10)