Skip to Content
Card SDKСправочник по манифесту

Справочник по манифесту

У каждой карточки в корне папки лежит neurosquad-card.json. Приложение читает его при установке и отказывается ставить карточку, чей манифест не проходит проверку; npx @neurosquad/card-sdk validate выполняет ровно те же проверки на вашей машине.

Для подсказок в редакторе укажите в $schema схему, которая поставляется с SDK: ./node_modules/@neurosquad/card-sdk/schema/neurosquad-card.v1.json (шаблон React) или ./vendor/neurosquad-card.schema.json (простой шаблон). Она же экспортируется как @neurosquad/card-sdk/schema.json.

Полный пример

{ "$schema": "./node_modules/@neurosquad/card-sdk/schema/neurosquad-card.v1.json", "manifestVersion": 1, "name": "test-radar", "displayName": { "en": "Test radar", "ru": "Радар тестов", "zh": "测试雷达" }, "version": "1.0.0", "protocol": 1, "description": "Runs the test suite in a connected terminal and shows what broke.", "author": { "name": "Acme", "url": "https://acme.dev" }, "license": "MIT", "homepage": "https://acme.dev/test-radar", "keywords": ["tests", "ci"], "icon": "icon.png", "minAppVersion": "0.1.100", "entry": "dist/index.html", "card": { "defaultSize": { "w": 460, "h": 340 }, "minSize": { "w": 320, "h": 220 } }, "permissions": [ "agents.read", "terminals.write", { "id": "fs.read", "reason": "Reads the JUnit report" }, { "id": "network", "hosts": ["api.github.com"], "reason": "Links failures to GitHub issues" }, { "id": "clipboard.write", "optional": true } ], "settings": [ { "key": "command", "type": "string", "label": "Test command", "default": "npm test" }, { "key": "githubToken", "type": "secret", "label": "GitHub token", "scope": "package" } ], "ports": { "inputs": [{ "id": "run", "label": "Run", "type": "ns:trigger", "default": true }], "outputs": [ { "id": "failures", "label": "Failures", "type": "ns:tasks", "retain": true }, { "id": "summary", "label": "Summary", "type": "ns:markdown" } ] }, "tools": [ { "name": "run_tests", "title": "Run the tests", "description": "Runs the project's tests and returns failing test names with messages.", "inputSchema": { "type": "object", "properties": { "filter": { "type": "string", "maxLength": 200 } } }, "timeoutMs": 120000 } ] }

Описание

ПолеОбязательноПравилоЗначение
$schemaстрокаДля редактора. Приложение его игнорирует.
manifestVersionда1Формат манифеста.
nameдаa-z, цифры и -, начинается с буквы, 2–48 символовИдентификатор пакета. С него начинаются имена инструментов карточки, и он же — пространство имён её своих типов портов. Зарезервированы (встроенные карточки и семейства инструментов): neurosquad, neurosquad-card, custom, canvas, browser, terminal, agent, note, todo, kanban, host, system, telegram, image, reference, ports, web-watch, watch, timer, sticky, standup, squad, mcp, skill, official.
displayNameдалокализуемый текст, ≤ 80Имя карточки в меню, шапке и диалоге установки.
versionдаSemVer (1.2.0, 1.2.0-beta.1)Для информации — установка привязана к коммиту, а не к версии. Но всё равно повышайте её: пользователи видят её при обновлении.
protocolдацелое числоПротокол карточек, под который вы писали, — сегодня 1. Карточку под более новый протокол, чем знает приложение, оно откажется ставить с сообщением «нужен более новый NeuroSquad».
descriptionлокализуемый текст, ≤ 300Показывается в диалоге установки и в выборе карточек.
author{ "name", "url"? }url должен быть https://. Показывается как указанный самим автором (self-declared).
licenseстрока ≤ 100Идентификатор SPDX, например MIT.
homepageURL https://
keywords≤ 20 уникальных строк, до 40 символов каждая
iconпуть к .png или .webp в пакетеКвадратная, ≤ 128 КБ (от 128×128 выглядит чётко). Проверяется по содержимому при установке. Без иконки у карточки будет кусочек пазла.
minAppVersionSemVerМинимальная версия NeuroSquad, в которой карточка работает.
entryпуть к файлу .html, по умолчанию index.htmlСтраница, которая загружается в карточку.

Локализуемый текст — это либо обычная строка, либо объект, где обязателен английский: { "en": "Test radar", "ru": "Радар тестов", "zh": "测试雷达" }. Приложение показывает язык пользователя, а если его нет — английский.

Правила для текста. В именах, описаниях, подписях, причинах и описаниях инструментов нельзя использовать управляющие символы (табуляция и перевод строки в описаниях допустимы), переопределения и изоляцию направления текста (bidi), разделители строк, символы нулевой ширины и другие невидимые символы. Называть себя «NeuroSquad», «official» или «verified» в displayName или author могут только официальные карточки (опубликованные из организации glmn-ai) — validate предупреждает, приложение отказывает.

Пути (entry, icon) задаются относительно манифеста через / — без .., без ведущего /, без обратных слэшей, без имён устройств Windows (con, nul…), ничего внутри __ns/ (эта папка зарезервирована приложением), не глубже 20 уровней и не длиннее 240 символов.

Размер — card

"card": { "defaultSize": { "w": 460, "h": 340 }, "minSize": { "w": 320, "h": 220 }, "maxSize": { "w": 1200, "h": 900 } }

Размеры — в единицах холста (CSS-пиксели при масштабе 100 %), целые числа: ширина 200–2400, высота 120–1800, причём minSize ≤ defaultSize ≤ maxSize. По умолчанию 420×320, минимум 200×120, максимум 2400×1800. Пользователь меняет размер в этих пределах; card.requestResize() тоже в них ограничивается.

Разрешения — permissions

Список (до 32) идентификаторов разрешений или объектов с подробностями:

"permissions": [ "agents.read", { "id": "network", "hosts": ["api.github.com", "*.example.com", "status.example.org:8443"] }, { "id": "fs.read", "reason": { "en": "Reads the JUnit report", "ru": "Читает отчёт JUnit" } }, { "id": "clipboard.write", "optional": true } ]
КлючЗначение
idОдин из идентификаторов со страницы Разрешения.
hostsТолько для network, и там обязателен: до 32 шаблонов хостов.
reasonЛокализуемый текст ≤ 300, показывается под разрешением в диалоге установки. Объясните зачем.
optionaltrue — не спрашивается при установке; карточка просит его во время работы через card.permissions.request().

Обязательные разрешения при установке выдаются целиком или никак. Если указать один и тот же идентификатор дважды, записи объединятся (и обязательная победит необязательную).

Шаблоны хостов для network: только имена хостов в нижнем регистре — api.example.com, api.example.com:8443 (порт, отличный от 443) или *.example.com (любой поддомен, но не сам example.com). Без схемы, пути, IP-адреса, голого * и localhost — этот компьютер открывает отдельное разрешение network.local.

Форма настроек — settings

До 40 полей. Форму рисует приложение (она открывается из ⋯ → Settings… карточки или вызовом card.settings.open()); карточка читает значения.

"settings": [ { "key": "command", "type": "string", "label": "Test command", "default": "npm test", "maxLength": 200 }, { "key": "notes", "type": "text", "label": "Notes", "placeholder": "Anything the agents should know" }, { "key": "interval", "type": "number", "label": "Check every (min)", "default": 5, "min": 1, "max": 60, "step": 1 }, { "key": "compact", "type": "boolean", "label": "Compact view", "default": false }, { "key": "branch", "type": "select", "label": "Branch", "default": "main", "options": [{ "value": "main", "label": "main" }, { "value": "dev", "label": "dev" }] }, { "key": "accent", "type": "color", "label": "Accent", "default": "#22c55e" }, { "key": "apiKey", "type": "secret", "label": "API key", "required": true, "scope": "package" } ]
КлючЗначение
keyНачинается с буквы; буквы, цифры, _, -; до 64 символов. Уникален.
typestring (одна строка), text (несколько строк), number, boolean, select, color (#rrggbb), secret.
label, description, placeholderЛокализуемый текст (≤ 80, ≤ 300, ≤ 80).
defaultЗначение типа поля. Для select — один из вариантов, для color — #rrggbb, для number — в пределах min/max. Для secret не допускается.
requiredБез него форма не сохранится.
scopeinstance (по умолчанию): своё у каждой карточки на холсте. package: общее для всех карточек этого пакета.
maxLengthstring, text, secret. По умолчанию 2 000 для string, 20 000 для text.
min, max, stepnumber.
optionsТолько select, 1–50 пар { "value", "label" }.

Секреты вводятся только в форме приложения, хранятся в зашифрованном виде и никогда не доходят до карточки: карточка узнаёт лишь, задан ли секрет, и пользуется им через подстановку {{secret:<key>}} в заголовках сетевых запросов.

Порты — ports

Типизированные каналы данных по стрелкам: до 16 входов (inputs) и 16 выходов (outputs). Подробно — в разделе Порты.

"ports": { "inputs": [ { "id": "run", "label": "Run", "type": "ns:trigger", "default": true }, { "id": "lookup", "label": "Look up", "type": "ns:text", "mode": "request", "response": { "type": "ns:json" } } ], "outputs": [ { "id": "failures", "label": "Failures", "type": "ns:tasks", "retain": true }, { "id": "coverage", "label": "Coverage", "type": "test-radar/coverage", "description": "Line coverage per file, 0..1", "schema": { "type": "object", "additionalProperties": { "type": "number", "minimum": 0, "maximum": 1 } } } ] }
КлючДляЗначение
idобоихa-z, цифры, -, начинается с буквы, до 32 символов. Уникален в пределах направления.
label, descriptionобоихЛокализуемый текст (≤ 80, ≤ 500). Его видят пользователи, другие карточки и агенты, которые изучают порт.
typeобоихОбщеизвестный тип ns:* или свой <package-name>/<type-name>.
schemaобоихДополнительная JSON Schema, которой значение тоже должно соответствовать. Обязательна для своих типов.
modeвходовstream (по умолчанию): сообщения без ответа. request: отправитель ждёт ответа.
responseвходов-запросов{ "type", "schema"? } — тип ответа. Обязателен для mode: "request".
defaultвходовПредпочтительный вход, когда выход другой карточки подходит к нескольким. Не больше одного.
retainвыходовПриложение хранит последнее значение: другие карточки могут прочитать его в любой момент, а только что подключённая получает его один раз.

Свой тип из пространства имён другого пакета допустим (с предупреждением) — так две карточки договариваются об общем формате.

Инструменты — tools

До 32 инструментов, которые могут вызывать подключённые к карточке агенты. Подробно — в разделе Инструменты для агентов.

КлючЗначение
namea-z, цифры, _, начинается с буквы, до 40 символов. Агент видит <name with - → _>_<tool>, например test_radar_run_tests. Это имя не может совпадать со встроенным инструментом NeuroSquad (canvas_spawn_card, terminal_send_keys…) и не может содержать __.
titleДо 80 символов, название для человека.
descriptionДо 2 000 символов, для модели, по-английски: что делает и что возвращает.
inputSchemaJSON Schema с "type": "object". Свойство card зарезервировано (его добавляет приложение).
readOnlytrue, если инструмент ничего не меняет, — подсказка для агента.
timeoutMs1 000–120 000, по умолчанию 30 000.

Ваши JSON Schema

Схемы портов, схемы ответов и inputSchema инструментов используют безопасное подмножество JSON Schema 2020-12 и проверяются при установке (≤ 500 узлов, глубина ≤ 16):

  • Поддерживается: type, enum, const, properties, required, additionalProperties, minProperties, maxProperties, items, minItems, maxItems, uniqueItems, minLength, maxLength, format, minimum, maximum, exclusiveMinimum, exclusiveMaximum, multipleOf, anyOf, oneOf, $ref (# или #/$defs/<name>), $defs.
  • Форматы: uri, date-time, date, email, color, uuid.
  • Аннотации, которые игнорируются: $id, $schema, $comment, title, description, default, examples, deprecated, readOnly, writeOnly.
  • Ограничения: enum — не больше 256 вариантов и 16 КБ в сумме; const — не больше 4 КБ.
  • Нельзя: pattern (регулярные выражения из карточки выполнялись бы в приложении — риск отказа в обслуживании) и любые ключевые слова не из списка выше.

$id схемы, https://neurosquad.ai/schemas/neurosquad-card.v1.json, — это идентификатор, а не адрес для скачивания: указывайте в $schema копию из SDK.