პლაგინი აღწერილია ერთი manifest.json-ით. კონტრაქტი, რომელიც ამოწმებს მანიფესტს
განვითარების დროს, იგივეა, რასაც პლატფორმა აღასრულებს ინსტალაციის დროს, ასე რომ
მანიფესტი, რომელიც გადის validate-ს, არის მანიფესტი, რომელსაც marketplace მიიღებს.
aihummer plugin CLI მოიცავს მთელ სასიცოცხლო ციკლს: ჩონჩხიდან ხელმოწერამდე და
გამოქვეყნებამდე.
ერთი მანიფესტი, ერთი კონტრაქტი
პლაგინს აქვს ზუსტად ერთი ჭეშმარიტების წყარო — მისი manifest.json. ის აცხადებს
პლაგინის სახეობას (kind), თუ როგორ კონფიგურირდება ის (config[]), მის
შესაძლებლობებს და — ჰოსტზე-მშობლიური სერვისებისთვის — install[] ნაბიჯებსა და გაშვების
ბრძანებას, რომელსაც SystemdDeployer
აწარმოებს. ვინაიდან განვითარება და ინსტალაცია იყენებენ იმავე ვალიდაციის კონტრაქტს,
“ვალიდური მანიფესტი” და “ინსტალირებადი პლაგინი” ერთსა და იმავეს ნიშნავს.
[!NOTE]
მანიფესტი აღწერს პლაგინის კონტრაქტს, და არა მის store-გვერდის სახელს. მანქანური
slug მოდის დირექტორიის/bundle-ის სახელიდან (პირადი side-load) ან წარდგენის
ველიდან (საჯარო) — იხილეთ პლაგინის გამოქვეყნება.
CLI
aihummer plugin აერთიანებს განვითარების, შეფუთვისა და გამოქვეყნების ბრძანებებს:
# Scaffold a manifest (kind: connector | service | openapi | mcp)aihummer plugin init <kind> [dir]# Validate a manifest against the install contractaihummer 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 + .sha256aihummer 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 fieldaihummer 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-catalogaihummer plugin publish --public --dir <dir> --key <priv> \ --artifact-url <url> --publisher <name> \ --description <text> --icon <url> [--screenshot <url> ...] \ [--channel stable|beta] [--register-key <pub>]
ბრძანება
რას აკეთებს
init <kind> [dir]
წერს საწყის manifest.json-ს არჩეული სახეობისთვის.
validate <m.json>
ამოწმებს მანიფესტს იმავე კონტრაქტით, რასაც ინსტალაცია.
keygen
აგენერირებს ავტორის გასაღების წყვილს: .key (პირადი, შეინახეთ საიდუმლოდ) და .pub, ბეჭდავს key id-ს.
package <dir>
აგებს (სურვ. --build) და აფუთავს <slug>-<version>.tar.gz-ში --strip-components=1 განლაგებით, წერს .sha256-ს. არასოდეს აფუთავს .env, *.key, node_modules, .git.
sign --key <priv>
ხელს აწერს release-ის იდენტობას; ბეჭდავს ხელმოწერასა და key id-ს; --manifest-ით ჩაშენებს ხელმოწერას მანიფესტში.
publish --private
ტვირთავს bundle-ს თქვენი ინსტანციის POST /v1/admin/modules/upload-ში.
სახეობა-სპეციფიკური ველები — ზუსტად ერთი ბლოკი ივსება kind-ის მიხედვით:
ველი
სახეობისთვის
სავალდებულო
დანიშნულება
host_native.exec_start
connector, service
კი
ბრძანება, რომელიც აწარმოებს ხანგრძლივ სერვისს.
host_native.runtime
connector, service, mcp
არა
node | python | binary.
host_native.install
connector, service, mcp
არა
ინსტალაციის ნაბიჯები (shell ბრძანებების მასივი), ეშვება ჰოსტზე ამოღების შემდეგ.
host_native.port
connector, service
არა
სასურველი TCP პორტი (deployer-მა შეიძლება ხელახლა მიანიჭოს $PORT-ით).
host_native.health_path
connector, service
არა
ჯანმრთელობის შემოწმების გზა (ნაგულისხმევი /healthz).
openapi.spec_url
openapi
კი
OpenAPI 3.x სპეციფიკაციის URL.
openapi.base_url
openapi
არა
servers[0].url-ის გადაფარვა.
openapi.allowed_hosts
openapi
არა
სინთეზირებული ხელსაწყოების გამავალი ნებადართულთა სია.
openapi.auth
openapi
არა
securityScheme → secret-ის სახელის რუკა.
openapi.tool_prefix
openapi
არა
ხელსაწყოს სახელის პრეფიქსი.
mcp.transport
mcp
კი
stdio ან http.
mcp.command / mcp.args
mcp (stdio)
კი stdio-სთვის
სერვერის შესასრულებელი და არგუმენტები.
mcp.url
mcp (http)
კი http-სთვის
MCP ბოლოწერტილის URL.
mcp.auth_header / mcp.secret_token_key
mcp (http)
არა
header და secret გასაღები bearer token-ისთვის.
Store-გვერდისა და იდენტობის ველები (საჯარო პლაგინებისთვის)
საჯარო კატალოგში მოსახვედრად მანიფესტს უნდა ჰქონდეს გამომქვეყნებლის იდენტობა და
store-გვერდის ველები. პირად side-load-ს არცერთი ეს არ სჭირდება — ასეთი პლაგინი სანდოა
ინსტანციის დონეზე.
ველი
ტიპი
სავალდებულო
დანიშნულება
visibility
string
არა
public | private | unlisted. ცარიელი = legacy/პირველი მხარის (იდენტობის მოთხოვნის გარეშე).
publisher
string
საჯაროსთვის
გამომქვეყნებლის namespace, ^[a-z0-9][a-z0-9-]{1,38}$. საჯარო slug-ები იწოდება @publisher/slug.
publisher_key_id
string
საჯაროსთვის
key id იმ გასაღებისა, რომლითაც არტეფაქტი ხელმოწერილია.
description
string
საჯაროსთვის
store-გვერდის აღწერა კატალოგში.
icon
string
საჯაროსთვის
პლაგინის ხატულა: https:// URL ან data: URI.
screenshots
string[]
არა
store-გვერდის ეკრანის სურათები (https:// URL-ების მასივი; თითოეული არაცარიელი).
[!TIP]
გაუშვით aihummer plugin validate ყოველი გამოქვეყნების წინ. ინსტალაციისა და
ვალიდაციის კონტრაქტი იდენტურია, ასე რომ მანიფესტი, რომელიც ლოკალურად გადის, მიიღება
როგორც marketplace-ის deployer-ის, ისე საჯარო კატალოგის ვალიდატორის მიერ.
მინიმალური მანიფესტები
service ჩონჩხი (რასაც aihummer plugin init service წერს):
ვალიდაციის შემდეგ პლაგინი იფუთება (package), ხელმოწერილია (sign) და ქვეყნდება
ორი რეჟიმიდან ერთით:
პირადი (საკუთარი თავისთვის) — side-load თქვენს ინსტანციაში ადმინ-UI-ით ან
publish --private-ით. არტეფაქტი არასოდეს ტოვებს ინსტანციას.
საჯარო (ყველასთვის) — publish --public ხსნის PR-ს საჯარო კატალოგში; განხილვის
შემდეგ AiHummer თანახელს აწერს release-ს და აქვეყნებს მას საზოგადოების კატალოგში.