Plugin SDK
Plugin bir manifest.json bilen suratlandyrylýar. Işläp düzme döwründe manifesti
barlaýan şertnama platforma gurnama wagtynda berjaý edýäni bilen şol bir, şonuň üçin
validate-den geçen manifest marketplace kabul etjek manifestdir. aihummer plugin
CLI bütin ömri öz içine alýar: skafolddan gol çekmäge we çap etmäge çenli.
Bir manifest, bir şertnama
Pluginiň takyk bir hakykat çeşmesi bar — onuň manifest.json-i. Ol plugin görnüşini
(kind), nähili sazlanýandygyny (config[]), onuň başarnyklaryny we —
host-native hyzmatlar üçin — SystemdDeployer işledýän
install[] ädimlerini we başlangyç buýrugyny yglan edýär. Işläp düzme
we gurnama şol bir barlag şertnamasyny ulanýandygy üçin, “dogry manifest” we
“gurnap boljak plugin” şol bir manyny aňladýar.
[!NOTE] Manifest pluginiň şertnamasyny suratlandyrýar, onuň dükan-sahypa adyny däl. Maşyn
slugkatalog/bukja adyndan (hususy side-load) ýa-da iberiş meýdanyndan (jemgyýetçilik) gelýär — serediň Plugin çap etmek.
CLI
aihummer plugin işläp düzme, gaplama we çap etmek buýruklaryny birleşdirýär:
# Scaffold a manifest (kind: connector | service | openapi | mcp)
aihummer plugin init <kind> [dir]
# Validate a manifest against the install contract
aihummer plugin validate <manifest.json>
# Generate an ed25519 author key (writes <prefix>.key and <prefix>.pub)
aihummer plugin keygen [--out <prefix>]
# Build and package the plugin into a release tarball + .sha256
aihummer plugin package <dir> [--out <file>] [--slug <slug>] [--build "<cmd>"]
# Sign the release identity (slug\0version\0source_ref); with --manifest the
# signature is embedded into the manifest.signature field
aihummer plugin sign --key <priv> [--manifest <m.json>] <bundle|dir>
# Upload a private plugin into your own instance (side-load)
aihummer plugin publish --private --instance <url> --token <admin> <bundle.tar.gz>
# Open a PR to the public AiHummer/marketplace-catalog
aihummer plugin publish --public --dir <dir> --key <priv> \
--artifact-url <url> --publisher <name> \
--description <text> --icon <url> [--screenshot <url> ...] \
[--channel stable|beta] [--register-key <pub>]
| Buýruk | Näme edýär |
|---|---|
init <kind> [dir] |
Saýlanan görnüş üçin başlangyç manifest.json ýazýar. |
validate <m.json> |
Manifesti gurnama bilen şol bir şertnama bilen barlaýar. |
keygen |
Awtor açar jübütini döredýär: .key (hususy, gizlin saklaň) we .pub, key id-i çap edýär. |
package <dir> |
Gurýar (islege görä --build) we --strip-components=1 ýerleşişi bilen <slug>-<version>.tar.gz-a gaplaýar, .sha256 ýazýar. Hiç haçan .env, *.key, node_modules, .git gaplamaýar. |
sign --key <priv> |
Reliz şahsyýetine gol çekýär; goly we key id-i çap edýär; --manifest bilen goly manifeste gömýär. |
publish --private |
Bukjany gurnamaňyzyň POST /v1/admin/modules/upload-yna ýükleýär. |
publish --public |
AiHummer/marketplace-catalog-a PR açýar. |
Iki çap etmek rejesi-de Plugin çap etmek bölüminde jikme-jik berlendir.
Manifest meýdanlary
Meýdanyň gerekdigi kind-a we pluginiň jemgyýetçilik bolup-bolmazlygyna bagly. Esasy we şahsyýet meýdanlary:
| Meýdan | Görnüş | Gerek | Maksat |
|---|---|---|---|
kind |
string | elmydama | Görnüş: connector | service | openapi | mcp. |
version |
string | hawa | Plugin wersiýasy (semver), meselem 1.0.0. |
contract |
string | kanallar üçin | Şertnama ID, meselem aihummer.channel.v1. |
scope |
string | ýok | Giriş modeli: shared (deslapky) ýa-da personal. |
capabilities |
string[] | ýok | Yglan edilen başarnyklar. |
config |
object[] | ýok | Sazlama görnüş meýdanlary; her birine key, hem-de label, secret, required gerek. |
oauth |
object | ýok | Ulanyjynyň hasabyny birikdirmek üçin OAuth2 (authorize_url, token_url, scopes[]). |
signature |
string | gol çekilende | reliz şahsyýetine base64 ed25519 goly (sign tarapyndan gömülen). |
Görnüşe mahsus meýdanlar — kind-a baglylykda takyk bir blok doldurylýar:
| Meýdan | Görnüş üçin | Gerek | Maksat |
|---|---|---|---|
host_native.exec_start |
connector, service | hawa | Uzak ýaşaýan hyzmaty işledýän buýruk. |
host_native.runtime |
connector, service, mcp | ýok | node | python | binary. |
host_native.install |
connector, service, mcp | ýok | Gurnama ädimleri (shell buýruklarynyň massiwi), ekstraksiýadan soň host-da işledilýär. |
host_native.port |
connector, service | ýok | Halanýan TCP porty (deployer $PORT arkaly täzeden belläp biler). |
host_native.health_path |
connector, service | ýok | Saglyk-barlag ýoly (deslapky /healthz). |
openapi.spec_url |
openapi | hawa | OpenAPI 3.x spek URL-i. |
openapi.base_url |
openapi | ýok | servers[0].url-y üýtgetmek. |
openapi.allowed_hosts |
openapi | ýok | Döredilen gurallar üçin egress rugsat sanawy. |
openapi.auth |
openapi | ýok | securityScheme → secret adyny düzmek. |
openapi.tool_prefix |
openapi | ýok | Gural-ady prefiksi. |
mcp.transport |
mcp | hawa | stdio ýa-da http. |
mcp.command / mcp.args |
mcp (stdio) | stdio üçin hawa | Serwer ýerine ýetiriji we argumentler. |
mcp.url |
mcp (http) | http üçin hawa | MCP ahyrky nokat URL-i. |
mcp.auth_header / mcp.secret_token_key |
mcp (http) | ýok | Bearer token üçin header we secret açary. |
Dükan-sahypa we şahsyýet meýdanlary (jemgyýetçilik pluginleri üçin)
Jemgyýetçilik kataloguna girmek üçin manifest çap ediji şahsyýetini we dükan-sahypa meýdanlaryny götermeli. Hususy side-load bularyň hiç birine mätäç däl — beýle plugin gurama derejesinde ynamlydyr.
| Meýdan | Görnüş | Gerek | Maksat |
|---|---|---|---|
visibility |
string | ýok | public | private | unlisted. Boş = miras/birinji tarap (şahsyýet talaby ýok). |
publisher |
string | jemgyýetçilik üçin | Çap ediji ady, ^[a-z0-9][a-z0-9-]{1,38}$. Jemgyýetçilik slug-lar @publisher/slug diýlip atlandyrylýar. |
publisher_key_id |
string | jemgyýetçilik üçin | Artefaktyň gol çekilen açarynyň key id-i. |
description |
string | jemgyýetçilik üçin | Katalogda dükan-sahypa beýany. |
icon |
string | jemgyýetçilik üçin | Plugin nyşany: https:// URL ýa-da data: URI. |
screenshots |
string[] | ýok | Dükan-sahypa skrinşotlary (https:// URL-leriň massiwi; her biri boş däl). |
[!TIP] Her çap etmekden öň
aihummer plugin validateişlediň. Gurnama we barlag şertnamasy birmeňzeş, şonuň üçin ýerli geçen manifest hem marketplace deployer hem-de jemgyýetçilik katalog walidatory tarapyndan kabul ediler.
Minimal manifestler
service skafold (aihummer plugin init service ýazýan zat):
{
"version": "1.0.0",
"kind": "service",
"scope": "shared",
"contract": "aihummer.channel.v1",
"host_native": {
"runtime": "node",
"install": ["npm ci --omit=dev"],
"exec_start": "node dist/main.js",
"port": 8800,
"health_path": "/healthz"
},
"config": [
{ "key": "api_token", "label": "API token", "secret": true, "required": true }
]
}
Kodsuz openapi manifesti has-da gysga — ol diňe speke ugrukdyrýar:
{
"version": "1.0.0",
"kind": "openapi",
"scope": "shared",
"openapi": {
"spec_url": "https://api.example.com/openapi.json",
"tool_prefix": "example_",
"allowed_hosts": ["api.example.com"],
"auth": { "bearerAuth": "api_token" }
},
"config": [
{ "key": "api_token", "label": "API token", "secret": true, "required": true }
]
}
mcp manifesti (stdio transport):
{
"version": "1.0.0",
"kind": "mcp",
"scope": "shared",
"host_native": { "runtime": "node", "install": ["npm ci --omit=dev"] },
"mcp": { "transport": "stdio", "command": "node", "args": ["server.js"] }
}
Manifestden marketplace-e
Barlagdan soň, plugin gaplanýar (package), gol çekilýär (sign) we iki
rejäniň birinde çap edilýär:
- Hususy (özüňiz üçin) — Admin UI ýa-da
publish --privatearkaly gurnamaňyza side-load. Artefakt gurnamany hiç haçan terk etmeýär. - Jemgyýetçilik (hemmeler üçin) —
publish --publicjemgyýetçilik kataloguna PR açýar; synanyşykdan soň AiHummer relizi garşy-gol çekýär we ony jemgyýet katalogyna çap edýär.
Doly gezelenç üçin Plugin çap etmek bölümine serediň.
Indiki ädim
- Plugin çap etmek — hususy side-load we jemgyýetçilik registri, iberiş şertnamasy, moderasiýa.
- Kodsuz integrasiýalar —
openapiwemcpgörnüşleri jikme-jik. - Gurnamak we täzelenmeler —
install[]-i näme işledýär, saglyk derwezesi, ynam we gol çekilen täzelenmeler. - Marketplace: umumy syn we derejeler — her görnüş nirede ýaşaýar we resmi katalog jemgyýetden nähili tapawutlanýar.