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.zipInstalls 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.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
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.jsonbefore 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:
| Field | Value |
|---|---|
name | Non-empty unique identifier |
version | Non-empty version string |
label | Human-readable picker label |
description | Short picker description |
category | Must be "cli" |
cli | Must be the only category config block |
Useful optional top-level fields:
| Field | Purpose |
|---|---|
icon | Path relative to the extension directory |
picker.shortcut | Picker shortcut letter |
picker.group | Picker group, commonly "agents" or "tools" |
The cli block accepts:
| Field | Purpose |
|---|---|
command | Required executable name or absolute path |
args | Base argument array; defaults to [] |
env | String-to-string environment additions |
envVar | Environment variable that overrides command |
resumeArgs | Resume argument template using {{sessionId}} |
createSessionArgs | New-session argument template using {{sessionId}} |
modelArgs | Model argument template using {{model}} |
sandboxArgs | Sandbox argument template using {{sandbox}} |
permissionModeArgs | Permission argument template using {{permissionMode}} |
permissionModeEnvVar | Environment variable used for permission mode |
permissionModeValues | Maps Freshell permission modes to environment values |
supportsPermissionMode | Whether the picker exposes permission controls |
supportsModel | Whether the picker exposes model controls |
supportsSandbox | Whether the picker exposes sandbox controls |
terminalBehavior | Optional 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
-
Clone or locate the project in a stable absolute path.
-
Install dependencies and build its executable artifacts when required.
-
Create or correct
freshell.jsonusing the supported CLI schema above. -
Verify the configured command runs successfully from a normal terminal.
-
Link the extension directory:
mkdir -p ~/.freshell/extensions ln -sfn /absolute/path/to/extension ~/.freshell/extensions/<name> -
Confirm the link resolves with
readlink -f. -
Report that activation requires a Freshell restart. Restart only when the user has explicitly approved restarting the live server.
-
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
categoryto"cli", and keep exactly onecliblock. - Command unavailable: install/build it or set the configured
envVarto its absolute executable path. - Changed files have no effect: extensions are scanned only at server startup; wait for an approved restart.
- Existing
clientorservermanifest: 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.jsonis valid JSON and contains no unknown keys.categoryis"cli", with onecliblock and noclientorserverblock.- 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.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| extension-installer (this skill) | 0 | 7mo | Review | Intermediate |
| playwright-browser-automation | 29 | 9mo | Review | Intermediate |
| desktop | 9 | 4mo | No flags | Advanced |
| telegram-mini-app | 62 | 8mo | Review | Advanced |
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.
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.
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.
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.
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.
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"