Skip to content

Plugins and themes

A plugin adds behavior. A theme changes how Jensen looks. A theme is delivered by a plugin.

A plugin is a single main.js that registers what it needs when it loads. It can add panes, commands, settings and themes. A plugin can also extend the tools your assistant sees, so it changes what your assistant can do in the project, not only what you can see.

A plugin has no authority by default. It reaches only what you grant. Enabling one that declares capabilities shows a sheet titled {name} wants access: Grant only what you trust. The kernel blocks anything not granted here. It shows a risk level, low, medium or high.

Permission What it opens
Read the code graph Read the map.
Knowledge base Search and ingest project knowledge.
Git history Read history and semantic diffs.
Panes and layout Add and arrange panes.
Read your code editor, Edit your code Read or change open files.
Theme Switch the active theme and add new ones.
Jensen settings Read and write settings.
Project files Named paths inside the project. Empty means no access.
Network Named hosts only. Empty means no network.

Two defaults matter most. A plugin listing no paths gets no filesystem, and one listing no hosts gets no network. You add access, you never take it away. Choose Enable plugin to grant, or Cancel.

Open Settings, Extensions, Plugins.

  • Enable community plugins is the master switch. Off, Jensen contacts no registry, blocks new downloads and stops every installed plugin.
  • Browse plugins lists the catalog. Use Search plugins, Filter by category and Refresh. Cards read Unverified until a plugin is checked, with Asks for listing its permissions.
  • Install and Remove manage each one.
  • Install from a GitHub release takes a Repository such as owner/name, a Release tag and a Manifest sha256, so you can pin an exact build.
  • Private registry URL points at your own index.json over HTTPS. Its plugins show beside the public ones and win on a conflicting id.

Plugins speak protocol version 1. Build with jensen-plugin-sdk, which writes a manifest with "apiVersion": 1. Jensen refuses a plugin that:

  • Has no apiVersion. It was built for the retired plugin system, so rebuild it.
  • Uses activationEvents. Every enabled plugin loads at startup.
  • Ships WebAssembly or a separate UI entry.
  • Declares contributes. Register panes, commands, settings and themes at runtime from main.js.

A manifest holds id, name, version, minAppVersion, apiVersion, description, author, entry.main and permissions. Permissions are graph, knowledge, git, workspace, theme, settings, editor (none, read or write), fs and network. An id uses lowercase letters, digits, . and -.

Publish in the plugins panel walks you through it: Choose folder…, then it assembles your release and shows the Registry entry to Copy. Create a GitHub release, then open a pull request on the registry.

A theme is one document with three blocks:

Block What it colors
ui The workbench chrome.
syntax The editor.
ansi The sixteen terminal slots.

Jensen derives only state variants and elevation from what you supply. It never guesses a palette from a few anchor colors, so a theme looks as its author intended.

A theme plugin asks for the Theme permission and registers its document at runtime. It can also list, set and remove themes.

Pick one in Settings, Workspace, General, Appearance, Theme. Bundled themes include Catppuccin (Latte, Frappe, Macchiato, Mocha), Dracula, Gotham, Nord, Rose Pine, Rose Pine Dawn and Tokyo Night. Plugin themes appear in the same list while the plugin is enabled.