EX

extension-installer

A workflow for installing and setting up Freshell extension panes.

Install

mkdir -p .claude/skills/extension-installer && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/12755" && unzip -o skill.zip -d .claude/skills/extension-installer && rm skill.zip

Installs to .claude/skills/extension-installer

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Use when installing, creating, or setting up Freshell extensions — from GitHub repos, local directories, or from scratch as custom panes.
137 chars✓ has a “when” trigger
Intermediate

Key capabilities

  • →Add new pane types to Freshell
  • →Create custom extensions (server, client, or CLI)
  • →Debug why an installed extension is not showing up
  • →Validate extension manifests against strict schema
  • →Configure server extension environment variables with interpolation
  • →Expand homedir paths in environment variables

How it works

This skill guides the installation and configuration of Freshell extensions by validating manifests, managing symlinks, and ensuring proper loading based on category and pre-built artifacts.

Inputs & outputs

You give it
Extension source code or manifest file
You get back
Installed and loaded Freshell extension, or debugging information for installation issues

When to use extension-installer

  • →Add new pane type
  • →Install local Freshell extension
  • →Configure custom pane manifest
  • →Debug extension loading issues

About this skill

Installing Freshell CLI Extensions

Freshell's Rust server supports CLI extensions that launch terminal tools. It still validates historical client and server manifests for compatibility, but it does not start their processes, proxy their traffic, or render extension iframes. Do not create or present those categories as supported.

If the requested extension is a web application, run it independently and open its reachable URL in a normal Freshell browser pane. If it is a static page, serve it with an independent static-file server first.

Before installing

  • Inspect the project and its existing freshell.json before changing it.
  • Build or install the CLI yourself. Freshell does not run package installation or build steps for extensions.
  • Confirm the CLI command works on the host and determine whether it needs a fixed working directory or environment variables.
  • Use an absolute symlink target. Freshell scans symlinked directories.
  • Never restart the live Freshell server without the user's explicit approval. Installing files is safe; activating a new extension waits for the next approved restart.

Supported manifest

Create freshell.json in the extension directory. The manifest schema is strict: unknown keys or a category/config mismatch cause the extension to be skipped with a server warning.

Required top-level fields:

FieldValue
nameNon-empty unique identifier
versionNon-empty version string
labelHuman-readable picker label
descriptionShort picker description
categoryMust be "cli"
cliMust be the only category config block

Useful optional top-level fields:

FieldPurpose
iconPath relative to the extension directory
picker.shortcutPicker shortcut letter
picker.groupPicker group, commonly "agents" or "tools"

The cli block accepts:

FieldPurpose
commandRequired executable name or absolute path
argsBase argument array; defaults to []
envString-to-string environment additions
envVarEnvironment variable that overrides command
resumeArgsResume argument template using {{sessionId}}
createSessionArgsNew-session argument template using {{sessionId}}
modelArgsModel argument template using {{model}}
sandboxArgsSandbox argument template using {{sandbox}}
permissionModeArgsPermission argument template using {{permissionMode}}
permissionModeEnvVarEnvironment variable used for permission mode
permissionModeValuesMaps Freshell permission modes to environment values
supportsPermissionModeWhether the picker exposes permission controls
supportsModelWhether the picker exposes model controls
supportsSandboxWhether the picker exposes sandbox controls
terminalBehaviorOptional renderer and scroll behavior overrides

terminalBehavior.preferredRenderer currently accepts "canvas". terminalBehavior.scrollInputPolicy accepts "native" or "fallbackToCursorKeysWhenAltScreenMouseCapture".

Use the advanced capability fields only when the CLI actually implements the corresponding arguments. The built-in manifests under extensions/ are the best current examples for coding agents.

Minimal example

{
  "name": "htop-pane",
  "version": "0.1.0",
  "label": "htop",
  "description": "System monitor in a terminal pane",
  "category": "cli",
  "cli": {
    "command": "htop"
  },
  "picker": {
    "shortcut": "H",
    "group": "tools"
  }
}

Install from a repository or local directory

  1. Clone or locate the project in a stable absolute path.

  2. Install dependencies and build its executable artifacts when required.

  3. Create or correct freshell.json using the supported CLI schema above.

  4. Verify the configured command runs successfully from a normal terminal.

  5. Link the extension directory:

    mkdir -p ~/.freshell/extensions
    ln -sfn /absolute/path/to/extension ~/.freshell/extensions/<name>
    
  6. Confirm the link resolves with readlink -f.

  7. Report that activation requires a Freshell restart. Restart only when the user has explicitly approved restarting the live server.

  8. After an approved restart, inspect server logs, GET /api/extensions, and the New Tab picker. Launch the extension and verify its real terminal behavior.

Freshell scans ~/.freshell/extensions/, then .freshell/extensions/ relative to the server working directory, then the built-in extensions/ directory. The first manifest with a duplicate name wins.

Troubleshooting

  • Missing from the picker: inspect startup warnings, confirm the symlink and command, and check that the provider is enabled in Settings → Coding CLI.
  • Manifest rejected: remove unknown keys, require all five top-level identity fields, set category to "cli", and keep exactly one cli block.
  • Command unavailable: install/build it or set the configured envVar to its absolute executable path.
  • Changed files have no effect: extensions are scanned only at server startup; wait for an approved restart.
  • Existing client or server manifest: explain that it is historical and unavailable in the Rust runtime. For a web service, run it independently and open its URL in a browser pane.

Completion checklist

  • freshell.json is valid JSON and contains no unknown keys.
  • category is "cli", with one cli block and no client or server block.
  • The executable and any referenced artifacts exist and run on this host.
  • The symlink resolves to the intended stable directory.
  • No live restart occurred without explicit user approval.
  • After activation, logs are clean, the picker entry appears, and launching it exercises the configured CLI.

When not to use it

  • →For modifying built-in pane types
  • →When extensions are not pre-built
  • →When expecting hot-reload after changes

Limitations

  • →Does not run npm install, npm run build, or any build step for extensions
  • →Extensions are discovered only once when the server starts
  • →Manifest schema uses strict validation, rejecting unknown keys

How it compares

This workflow provides a structured approach to extending Freshell with custom functionalities, enforcing strict manifest validation and pre-built requirements, unlike ad-hoc extension development.

Compared to similar skills

extension-installer side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
extension-installer (this skill)07moReviewIntermediate
playwright-browser-automation299moReviewIntermediate
desktop94moNo flagsAdvanced
telegram-mini-app628moReviewAdvanced

Try saying

Example prompts that trigger this skill in your AI assistant.

You might also like

playwright-browser-automation

lackeyjb

Complete browser automation with Playwright. Auto-detects dev servers, writes clean test scripts to /tmp. Test pages, fill forms, take screenshots, check responsive design, validate UX, test login flows, check links, automate any browser task. Use when user wants to test websites, automate browser interactions, validate web functionality, or perform any browser-based testing.

29146

desktop

lobehub

Electron desktop development guide. Use when implementing desktop features, IPC handlers, controllers, preload scripts, window management, menu configuration, or Electron-specific functionality. Triggers on desktop app development, Electron IPC, or desktop local tools implementation.

941

telegram-mini-app

davila7

Expert in building Telegram Mini Apps (TWA) - web apps that run inside Telegram with native-like experience. Covers the TON ecosystem, Telegram Web App API, payments, user authentication, and building viral mini apps that monetize. Use when: telegram mini app, TWA, telegram web app, TON app, mini app.

62163

codex-skill

feiskyer

Use when user asks to leverage codex, gpt-5, or gpt-5.1 to implement something (usually implement a plan or feature designed by Claude). Provides non-interactive automation mode for hands-off task execution without approval prompts.

12110

bullmq-specialist

davila7

BullMQ expert for Redis-backed job queues, background processing, and reliable async execution in Node.js/TypeScript applications. Use when: bullmq, bull queue, redis queue, background job, job queue.

2595

shopify-development

davila7

Build Shopify apps, extensions, themes using GraphQL Admin API, Shopify CLI, Polaris UI, and Liquid. TRIGGER: "shopify", "shopify app", "checkout extension", "admin extension", "POS extension", "shopify theme", "liquid template", "polaris", "shopify graphql", "shopify webhook", "shopify billing", "app subscription", "metafields", "shopify functions"

1299

Search skills

Search the agent skills registry