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
5149 skills
Install
$ npx -y skills add agenvoy/Agenvoy --skill extension-install --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/extension-install

Context preview

The summary Claude sees to decide when to auto-load this skill.

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

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_file: ~/.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`, call:

pkg_manage(action="install", package="<dep>")

The tool internally:

  • `exec.LookPath(<dep>)` already present → returns `already_installed:true`, this step is satisfied
  • Linux only — probes `apt/apt-get/dnf/yum/pacman/apk` (first found) and runs `sudo -n <pm> install -y <dep>`; the sudo ticket comes from the password collected during confirmation
  • macOS → the tool is not registered; use `run_command(["brew","install","<dep>"], write_paths=["/opt/homebrew"])`
  • After install, `LookPath` re-checks

Response is JSON `{"ok": true/false, ...}`. `ok:false` or tool error → **abort immediately** and `rm -rf .staging`.

Each call triggers a `KindToolConfirm` popup (`AlwaysAllow=false`); the user sees "About to run `sudo apt install -y ffmpeg` — confirm?". User decline → tool fails → skill aborts.

> Note: `pkg_manage` is Linux-only (not registered on macOS) and available on every channel. Root actions go through the same system-password confirmation `run_command` uses for `write_paths`, so no terminal is needed.

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.

> Not

Read more
Ships withagenvoy

Self-hosted AI agent harness in a single Go binary — writes, sandbox-tests and repairs its own tools, and lets Claude Code, Codex and any MCP client build and share them.

Get the whole plugin
Stats
514
Stars
45
Forks
Active
Maintenance
Go
Language
AGPL-3.0
License
1d ago
Last commit
7mo ago
Created

Repo: agenvoy/Agenvoy

Other skills on agenvoy.

readme-generate
Skill

readme-generate

從原始碼分析自動生成雙語 README。當使用者請求為專案建立 README、需要從程式碼庫生成 README.md(英文)和 README.zh.md(中文)、或希望為其函式庫/套件建立一致的多語言文件時使用。

@agenvoy@agenvoyView Skill
scheduler-skill-creator
Skill

scheduler-skill-creato…

建立並排程定時觸發的 skill。**所有新增定時/週期任務、提醒、排程通知的請求必須走此 skill**,禁止直接呼叫 schedules(mode=write)(那是 skill 已存在時的時間綁定工具,不該作為新建排程的入口)。 必定觸發的訊息特徵(任一即活化): - 相對延遲:「X 分鐘後」「X…

@agenvoy@agenvoyView Skill