/extension-install
Install an Agenvoy extension from pkg.agenvoy.com registry (browse/pick) or local tarball into ~/.config/agenvoy/tools/.extension/<type>/<name>@<version>/. Extracts tar.gz, validates manifest (email field, type api/script only), installs deps, stores keychain keys, atomically
Claude Code
$ npx -y skills add pardnchiu/agenvoy --skill extension-install --agent claude-code
Codex
$ npx skills add pardnchiu/agenvoy --skill extension-install -a codex -y
Cursor
$ npx skills add pardnchiu/agenvoy --skill extension-install -a cursor -y
Gemini CLI
$ npx skills add pardnchiu/agenvoy --skill extension-install -a gemini-cli -y
GitHub Copilot
$ npx skills add pardnchiu/agenvoy --skill extension-install -a github-copilot -y
OpenCode
$ npx skills add pardnchiu/agenvoy --skill extension-install -a opencode -y
Windsurf
$ npx skills add pardnchiu/agenvoy --skill extension-install -a windsurf -y
SKILL.md
extension-install.SKILL.mdname: extension-install
description: Install an Agenvoy extension from pkg.agenvoy.com registry (browse/pick) or local tarball into ~/.config/agenvoy/tools/.extension/<type>/<name>@<version>/. Extracts tar.gz, validates manifest (email field, type api/script only), installs deps, stores keychain keys, atomically moves staged dir. Collisions handled by Overwrite/Rename/Cancel popup.
> **本 Skill 為 Agenvoy 內部最佳化版本**,依 Agenvoy 的執行環境撰寫(`run_command` 的 CWD、`~/.config/agenvoy/skills/.system/` 安裝位置、`edit_skill`/`schedules`/`find_edit_tool` 等工具、subagent 與排程的觸發路徑),**不保證適配其他 AI harness**。
Extension Installer
Takes a packager-produced tarball, installs it as an extension visible to the runtime scanner.
Input
`tarball` (**optional**): absolute path to a tar.gz.
- **Provided** → skip to §1 and extract the local file (offline / already-downloaded case)
- **Missing** → run §0 list + pick + download, then proceed to §1
`pkg.agenvoy.com` is the fixed registry endpoint — it is not a choice, so there is nothing to ask about.
Flow
0. Browse and download from registry (when no tarball)
0.1 GET /list — fetch the catalog
Call `http_request`:
{
"url": "https://pkg.agenvoy.com/list?limit=100",
"method": "GET",
"content_type": "json"
}Expect 200 with body `{"ok":true,"items":[{...}],"count":N,"limit":100,"offset":0}`.
Each `item` carries `name` / `type` / `email` / `version` / `summary` / `description` / `dependence` / `api_key_name` / `files` / `r2_key` / `size_bytes` / `sha256` / `created_at`.
`status_code != 200` or `items` empty → abort with "registry unavailable or no packages".
0.2 ask_user singleSelect to pick a package
Convert `items` into display strings, one per line:
<item.name>@<item.version> (<item.email>) · <item.type> · <item.summary>
Example: `yt_dlp_youtube_downloader@1.0.0 (chiu@example.com) · script · Download a YouTube video...`
`ask_user` (singleSelect):
Pick the extension to install (N total):
`options` are the display strings. Record the user's chosen item index → extract that item's `r2_key` / `name` / `email` / `version`.
User cancel → abort.
0.3 GET /download — pull the tar locally
Call `download_file` (**not** `http_request` — binary doesn't belong in a string body):
{
"url": "https://pkg.agenvoy.com/download?key=<selected item.r2_key>",
"output_file": "~/.config/agenvoy/download/<name>@<version>.tar.gz",
"timeout": 300
}Response: `{ok, output_file, size_bytes, sha256, ...}`.
Verify the download:
- `size_bytes > 0`
- If the response carries `sha256`, compare to the picked item's `sha256`; mismatch → abort and `rm` the file
- Any other failure → abort with the error
Use `output_file` as the `tarball` variable and **proceed to §1**.
1. Extract into staging
Fixed staging directory: `~/.config/agenvoy/tools/.extension/.staging/` (**cleaned and recreated** on every install).
rm -rf ~/.config/agenvoy/tools/.extension/.staging
mkdir -p ~/.config/agenvoy/tools/.extension/.staging
tar -xzf <tarball> -C ~/.config/agenvoy/tools/.extension/.staging
After extraction, the staging directory should contain exactly one subdirectory `<original-basename>/` (the packager uses `-C <parent>` to keep the outer dir in the tarball). `run_command: ls ~/.config/agenvoy/tools/.extension/.staging` gets `<original-basename>`.
If extraction fails, or staging contains 0 / >1 subdirectories, abort with:
❌ Tarball contents are invalid (cannot find a single root dir). Verify the tarball was produced by the extension-upload skill.
2. Read and validate manifest.json
`read_files: ~/.config/agenvoy/tools/.extension/.staging/<original-basename>/manifest.json`
Missing file → abort with "manifest.json missing in tarball, refuse to install".
Validate each field (any failure aborts; a broken manifest is a packager-side defect, so abort and report it):
| Field | Condition | |---|---| | `name` | non-empty, matches `^[a-z0-9][a-z0-9_-]*$` | | `type` | ∈ `{api, script}` (worker rejects mcp) | | `version` | strict semver `^\d+\.\d+\.\d+$` | | `summary` | non-empty | | `email` | non-empty, matches `^[^@\s]+@[^@\s]+\.[^@\s]+$`, already lowercase (worker normalizes) | | `dependence` | array | | `api_key_name` | array, each element matches `[A-Z][A-Z0-9_]*_API_KEY` | | `files` | array, length ≥ 1, must include `tool.json` |
Every path in `files` must exist in the staging subdirectory; any missing file → abort.
3. Install system dependencies
For each `<dep>` in `manifest.dependence`:
1. `run_command(["sh","-c","command -v <dep>"])` prints a path → already installed, this dep is satisfied. 2. Otherwise install it with `run_command`:
- Linux → use the package manager named on the system prompt's `Host OS` line (only when it names none, find it with `run_command(["sh","-c","command -v apt-get dnf yum pacman apk"])`), then `["sudo","apt-get","install","-y","<dep>"]` / `["sudo","dnf","install","-y","<dep>"]` / `["sudo","yum","install","-y","<dep>"]` / `["sudo","pacman","-S","--noconfirm","<dep>"]` / `["sudo","apk","add","<dep>"]`
- macOS → `run_command(["brew","install","<dep>"], sandbox=false)`; never sudo with brew
3. Re-run `command -v <dep>`; still missing or the install exited non-zero → **abort immediately** and `rm -rf .staging`.
Each install call asks for the system password in the confirmation (sudo, or `sandbox=false` for brew). User decline → the call fails → skill aborts.
4. Check and fill keychain keys
For each `<KEY>` in `manifest.api_key_name`, call:
store_secret(key="<KEY>", prompt="<extension name> needs <KEY>; enter the value (re-enter to overwrite an existing one):")
`store_secret` calls `keychain.Set` internally. User cancels / empty value → tool returns error → skill **aborts** and removes staging.
> Note: Agenvoy has no read-only key check tool, so **even an existing key is re-prompted**. The user can re-enter the
Read more
name: extension-install description: Install an Agenvoy extension from pkg.agenvoy.com registry (browse/pick) or local tarball into ~/.config/agenvoy/tools/.extension/<type>/<name>@<version>/. Extracts tar.gz, validates manifest (email field, type api/script only), installs deps, stores keychain keys, atomically moves staged dir. Collisions handled by Overwrite/Rename/Cancel popup.
> **本 Skill 為 Agenvoy 內部最佳化版本**,依 Agenvoy 的執行環境撰寫(`run_command` 的 CWD、`~/.config/agenvoy/skills/.system/` 安裝位置、`edit_skill`/`schedules`/`find_edit_tool` 等工具、subagent 與排程的觸發路徑),**不保證適配其他 AI harness**。
Extension Installer
Takes a packager-produced tarball, installs it as an extension visible to the runtime scanner.
Input
`tarball` (**optional**): absolute path to a tar.gz.
- **Provided** → skip to §1 and extract the local file (offline / already-downloaded case)
- **Missing** → run §0 list + pick + download, then proceed to §1
`pkg.agenvoy.com` is the fixed registry endpoint — it is not a choice, so there is nothing to ask about.
Flow
0. Browse and download from registry (when no tarball)
0.1 GET /list — fetch the catalog
Call `http_request`:
{
"url": "https://pkg.agenvoy.com/list?limit=100",
"method": "GET",
"content_type": "json"
}Expect 200 with body `{"ok":true,"items":[{...}],"count":N,"limit":100,"offset":0}`.
Each `item` carries `name` / `type` / `email` / `version` / `summary` / `description` / `dependence` / `api_key_name` / `files` / `r2_key` / `size_bytes` / `sha256` / `created_at`.
`status_code != 200` or `items` empty → abort with "registry unavailable or no packages".
0.2 ask_user singleSelect to pick a package
Convert `items` into display strings, one per line:
<item.name>@<item.version> (<item.email>) · <item.type> · <item.summary>
Example: `yt_dlp_youtube_downloader@1.0.0 (chiu@example.com) · script · Download a YouTube video...`
`ask_user` (singleSelect):
Pick the extension to install (N total):
`options` are the display strings. Record the user's chosen item index → extract that item's `r2_key` / `name` / `email` / `version`.
User cancel → abort.
0.3 GET /download — pull the tar locally
Call `download_file` (**not** `http_request` — binary doesn't belong in a string body):
{
"url": "https://pkg.agenvoy.com/download?key=<selected item.r2_key>",
"output_file": "~/.config/agenvoy/download/<name>@<version>.tar.gz",
"timeout": 300
}Response: `{ok, output_file, size_bytes, sha256, ...}`.
Verify the download:
- `size_bytes > 0`
- If the response carries `sha256`, compare to the picked item's `sha256`; mismatch → abort and `rm` the file
- Any other failure → abort with the error
Use `output_file` as the `tarball` variable and **proceed to §1**.
1. Extract into staging
Fixed staging directory: `~/.config/agenvoy/tools/.extension/.staging/` (**cleaned and recreated** on every install).
rm -rf ~/.config/agenvoy/tools/.extension/.staging
mkdir -p ~/.config/agenvoy/tools/.extension/.staging
tar -xzf <tarball> -C ~/.config/agenvoy/tools/.extension/.staging
After extraction, the staging directory should contain exactly one subdirectory `<original-basename>/` (the packager uses `-C <parent>` to keep the outer dir in the tarball). `run_command: ls ~/.config/agenvoy/tools/.extension/.staging` gets `<original-basename>`.
If extraction fails, or staging contains 0 / >1 subdirectories, abort with:
❌ Tarball contents are invalid (cannot find a single root dir). Verify the tarball was produced by the extension-upload skill.
2. Read and validate manifest.json
`read_files: ~/.config/agenvoy/tools/.extension/.staging/<original-basename>/manifest.json`
Missing file → abort with "manifest.json missing in tarball, refuse to install".
Validate each field (any failure aborts; a broken manifest is a packager-side defect, so abort and report it):
| Field | Condition | |---|---| | `name` | non-empty, matches `^[a-z0-9][a-z0-9_-]*$` | | `type` | ∈ `{api, script}` (worker rejects mcp) | | `version` | strict semver `^\d+\.\d+\.\d+$` | | `summary` | non-empty | | `email` | non-empty, matches `^[^@\s]+@[^@\s]+\.[^@\s]+$`, already lowercase (worker normalizes) | | `dependence` | array | | `api_key_name` | array, each element matches `[A-Z][A-Z0-9_]*_API_KEY` | | `files` | array, length ≥ 1, must include `tool.json` |
Every path in `files` must exist in the staging subdirectory; any missing file → abort.
3. Install system dependencies
For each `<dep>` in `manifest.dependence`:
1. `run_command(["sh","-c","command -v <dep>"])` prints a path → already installed, this dep is satisfied. 2. Otherwise install it with `run_command`:
- Linux → use the package manager named on the system prompt's `Host OS` line (only when it names none, find it with `run_command(["sh","-c","command -v apt-get dnf yum pacman apk"])`), then `["sudo","apt-get","install","-y","<dep>"]` / `["sudo","dnf","install","-y","<dep>"]` / `["sudo","yum","install","-y","<dep>"]` / `["sudo","pacman","-S","--noconfirm","<dep>"]` / `["sudo","apk","add","<dep>"]`
- macOS → `run_command(["brew","install","<dep>"], sandbox=false)`; never sudo with brew
3. Re-run `command -v <dep>`; still missing or the install exited non-zero → **abort immediately** and `rm -rf .staging`.
Each install call asks for the system password in the confirmation (sudo, or `sandbox=false` for brew). User decline → the call fails → skill aborts.
4. Check and fill keychain keys
For each `<KEY>` in `manifest.api_key_name`, call:
store_secret(key="<KEY>", prompt="<extension name> needs <KEY>; enter the value (re-enter to overwrite an existing one):")
`store_secret` calls `keychain.Set` internally. User cancels / empty value → tool returns error → skill **aborts** and removes staging.
> Note: Agenvoy has no read-only key check tool, so **even an existing key is re-prompted**. The user can re-enter the
A local AI agent harness in Go that runs 24/7 with auto-built tools, MCP, and Ollama
Other skills on agenvoy.
More skills from other plugins.
browser-use
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…
agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…
Questions about extension-install.
- Which coding agents can use extension-install?
- extension-install installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

