Skip to content
Automation
Skill

/extension-upload

Package a script tool under ~/.config/agenvoy/tools/script/ into a tar.gz and publish to pkg.agenvoy.com registry. Keyword picker, dep/key detection, config-stored email (ask + lowercase + persist), ask version, email verification gate, multipart upload with downgrade/unique

From plugin
agenvoy
8314 skills

Claude Code

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

SKILL.md

extension-upload.SKILL.md
name: extension-upload
description: Package a script tool under ~/.config/agenvoy/tools/script/ into a tar.gz and publish to pkg.agenvoy.com registry. Keyword picker, dep/key detection, config-stored email (ask + lowercase + persist), ask version, email verification gate, multipart upload with downgrade/unique guards.

> **本 Skill 為 Agenvoy 內部最佳化版本**,依 Agenvoy 的執行環境撰寫(`run_command` 的 CWD、`~/.config/agenvoy/skills/.system/` 安裝位置、`edit_skill`/`schedules`/`find_edit_tool` 等工具、subagent 與排程的觸發路徑),**不保證適配其他 AI harness**。

Extension Uploader

Packages an Agenvoy script tool directory into a marketplace tarball and uploads it to pkg.agenvoy.com. The source root is fixed at `~/.config/agenvoy/tools/script/`. If the user provides a keyword (e.g. `yt`), only matching subdirectories are listed.

Input

`keyword` (**optional**): substring filter (case-insensitive) over subdirectories under `~/.config/agenvoy/tools/script/`. Examples: `yt`, `dlp`, `tts`.

  • **With keyword** → list filtered matches
  • **Without keyword** (e.g. plain `/extension-upload`) → **list ALL subdirectories for the user to pick**; do not ask for a keyword

0. Select `extension_dir` (picker)

Fixed source root:

SCRIPT_ROOT=~/.config/agenvoy/tools/script

`find_files(mode=list)` lists all first-level subdirectories under `SCRIPT_ROOT` (non-recursive). **Skip names starting with `.` or `_`.**

Branch by input:

| Has keyword? | Candidate set | | ------------ | ---------------------------------------------------------------------- | | No | All subdirectories | | Yes | Subdirectories whose name (lowercased) contains `keyword` (lowercased) |

Branch by candidate count:

| Count | Action | | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 0 | Abort. With keyword: "No directory matching `<keyword>` under `SCRIPT_ROOT`". Without keyword: "`SCRIPT_ROOT` is empty — create a script tool first using `edit_tool(mode=write)`" | | 1 | Use that directory as `extension_dir` directly; report "auto-selected `<basename>`" | | ≥ 2 | `ask_user` singleSelect listing all candidates; user picks one as `extension_dir` |

`extension_dir` is the **absolute path** `<SCRIPT_ROOT>/<basename>`, used by every step below.

> Note: this skill only packages script tools (fixed `type: "script"`). The worker does not accept `mcp` type.

Flow

1. Read the directory

`find_files(mode=list, recursive=true)` enumerates every file under `extension_dir` (relative paths).

**Collect into `raw_files`, excluding:**

  • `.DS_Store`, `Thumbs.db`, `.git*`
  • `*.tar`, `*.tar.gz`, `*.tgz`, `*.zip`
  • An existing `manifest.json` (this skill will regenerate it)

`read_files` reads (if present):

  • `tool.json` (**required** — if missing, abort with "tool.json missing in <extension_dir>, refuse to package")
  • All `script.{js,py,sh}` / `*.js` / `*.py` / `*.sh`

1.5 Generic structure check (gate)

Check root-level files under `extension_dir`. Abort immediately on any violation:

| Rule | Condition | | ----------------------- | ----------------------------------------------------------------------- | | tool.json must exist | `extension_dir/tool.json` exists and is a regular file | | script mutual exclusion | `script.py` and `script.js` **must not coexist** (both present → abort) |

Abort message:

❌ Structure check failed: script.py and script.js cannot coexist (keep only one).

2. Infer type

Fixed `type: "script"` (this skill only packages tools under `~/.config/agenvoy/tools/script/`).

2.5 Type-specific structure check (gate)

For `type: script`:

| Rule | Condition | | ----------------- | ------------------------------------------------------------------------- | | script must exist | `script.py` or `script.js` must exist (exactly one); both missing → abort |

Abort message:

❌ Structure check failed: type:script requires script.py or script.js.

2.7 Health check (gate)

Verify the script can be parsed by its interpreter so consumers don't install something that immediately crashes. **Any failure aborts** and prints the stderr.

Branch on the script file confirmed in §2.5:

  • `script.py`:
  python3 -m py_compile <extension_dir>/script.py
  • `script.js`:
  node --check <extension_dir>/script.js

exit code ≠ 0 → abort:

❌ Health check failed: script cannot be parsed by the interpreter.
<first line of stderr>

> Note: only syntax-level. Top-level code is not executed; import errors / runtime errors / missing API keys are not checked. The author must test runtime behavior before packaging.

3. Detect `dependence` and `api_key_name`

Dependence (system binary names)

Scan every script file for these patterns to extract binaries:

  • JavaScript: `spawn("X"` / `exec("X"` / `execSync("X"` / `spawnSync("X"`
  • Python: `subprocess.run(["X"` / `subprocess.Popen(["X"` / `os.system("X "` / `shell=True` + `"X "`
  • Shell: the first non-reserved-word token

**Exclude:**

  • Shell builtins: `cd`, `echo`, `test`, `[`, `export`, `set`, `shift`, `pwd`, `true`, `false`
  • Interpreters themselves: `node`, `python`, `python3`, `bash`, `sh`, `/usr/bin/env`
  • Tools whitelisted by default: `ls`, `c
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-install

extension-install

Install an Agenvoy extension from pkg.agenvoy.com registry (browse/pick) or local tarball into…

@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-upload.

Which coding agents can use extension-upload?
extension-upload 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.