Skip to content
Automation
Skill

/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

From plugin
agenvoy
8314 skills

Claude Code

$ npx -y skills add pardnchiu/agenvoy --skill extension-install --agent claude-code

SKILL.md

extension-install.SKILL.md
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

Read more
@agenvoy
Ships withagenvoy

A local AI agent harness in Go that runs 24/7 with auto-built tools, MCP, and Ollama

Stars on GitHub

Momentum

stars in total
831
Star history of agenvoy/Agenvoy on GitHub, a chart by star-history.com

Other skills on agenvoy.

extension-upload

extension-upload

Package a script tool under ~/.config/agenvoy/tools/script/ into a tar.gz and publish to pkg.agenvoy.com registry. Keyword…

@agenvoy@agenvoyInstall Skill
scheduler-skill-creator

scheduler-skill-creato…

建立並排程定時觸發的 skill。**所有新增定時/週期任務、提醒、排程通知的請求必須走此 skill**,禁止直接呼叫 schedules(mode=write)(那是 skill 已存在時的時間綁定工具,不該作為新建排程的入口)。…

@agenvoy@agenvoyInstall Skill
skill-creator

skill-creator

Create, edit, improve, or audit AgentSkills. Use when creating a new skill from scratch or when asked to improve, review, audit,…

@agenvoy@agenvoyInstall Skill

More skills from other plugins.

agent-builder

agent-builder

Load immediately after an Agent intent, before the first agent_builder_* call. Governs how you create, configure, test, and…

n8n11d209k
@n8n-io@n8n-ioInstall Skill
browser-use

browser-use

Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…

@browser-use@browser-useInstall Skill
agent-browser

agent-browser

Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…

@vercel-labs-2@vercel-labs-2Install Skill
add-anydoc

add-anydoc

Add local office-document-to-Markdown conversion to NanoClaw agent containers with the pinned Firecrawl AnyDoc CLI. Use when…

@nanocoai@nanocoaiInstall Skill

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.