Skip to content

Думаю есть смысл переписать skiller что бы через него можно было скачивать агентов, софт, MCP, Plugins и другие инструменты #376

Closed

Description

@skulidropek
Image

Activity

  1. skulidropek commented on Jun 6, 2026

    @skulidropek
    MemberAuthor

    План по переписыванию Skiller в универсальный установщик инструментов

    Сохраняю согласованный v1-plan по issue #376.

    Зафиксированные решения

    • Scope установки: выбранный docker-git project/container, не host-global по умолчанию.
    • Режим установки: Skiller показывает install plan и запускает установку только после явного подтверждения пользователя.
    • Источники каталога: использовать уже существующие marketplace/registry, а не заводить собственный bundled marketplace как единственный источник.
    • Scope “софт”: AI/dev tools, релевантные агентным workflow, а не общий package manager для всего npm/pip/brew/winget.
    • Минимум v1: все агенты из уже существующего списка Skiller (44 entries на текущем скриншоте) должны устанавливаться “из коробки”, если для них есть install command/docs в agent TOML.

    Целевая модель

    Переписать Skiller с модели “skills manager” на нормализованный каталог MarketplaceTool:

    type MarketplaceToolKind = "skill" | "agent" | "mcp" | "plugin" | "dev-tool"
    
    type MarketplaceToolSource =
      | "skills.sh"
      | "clawhub"
      | "mcp-registry"
      | "smithery"
      | "agent-config"
      | "codex-plugin-marketplace"
    
    type MarketplaceTool = {
      readonly id: string
      readonly kind: MarketplaceToolKind
      readonly source: MarketplaceToolSource
      readonly name: string
      readonly description: string | null
      readonly installState: "installed" | "not-installed" | "manual" | "unsupported"
      readonly provenance: string | null
    }

    Старые skill flows должны остаться совместимыми: skills.sh и ClawHub продолжают работать как источники skills, текущие install-to-agent/project сценарии не ломаем.

    Agent install flow

    • Использовать существующие agents/*.toml как curated source для agent/dev-tool entries.
    • Для Linux/container использовать install_command_linux, если он задан; иначе safe fallback из install_command, только если команда кроссплатформенная/поддержанная.
    • Для небезопасных или OS-specific команд без Linux-варианта показывать manual state + docs URL.
    • После установки запускать refresh detection: detect_agents, плюс lightweight check по cli_command там, где он задан.
    • UI-кнопка Install на карточках агентов должна открывать confirmation modal, а не только installation guide.

    MCP install flow

    Источники:

    • Official MCP Registry REST API: https://registry.modelcontextprotocol.io/v0.1/servers.
    • Smithery CLI/API там, где он даёт готовую install/add команду.

    Поддержать в v1 только детерминированные формы:

    • remote MCP: codex mcp add <name> --url <url> и совместимый opencode flow;
    • npm stdio package: запуск через argv-форму вроде npx -y <package>@<version>;
    • entries с required secrets/auth/config показывать как manual/needs-config, пока пользователь не ввёл значения;
    • pypi/oci/custom transports в v1 не выполнять автоматически, если нет безопасного adapter.

    Plugin install flow

    • Для Codex plugins использовать существующий CLI surface:
      • codex plugin marketplace add <source>
      • codex plugin add <plugin>@<marketplace>
    • Generic arbitrary plugin execution в v1 не делать.
    • Для неизвестных plugin marketplaces показывать manual install guidance.

    Execution/security boundary

    • Browser/UI не должен передавать произвольный shell string для исполнения.
    • UI запрашивает prepare_tool_install, получает typed ToolInstallPlan, показывает его пользователю, затем вызывает execute_tool_install с id/selector плана.
    • Trusted side заново валидирует план перед запуском.
    • Команды выполнять как argv, без shell, кроме curated agent TOML команд после confirmation.
    • В docker-git scoped mode команды должны идти через selected project container:
      • container: SkillerContainerScope.containerName
      • user: SkillerContainerScope.sshUser
      • cwd: SkillerContainerScope.containerProjectPath
    • Хранить provenance/status в выбранном container home, например ~/.docker-git/skiller/tool-installs.json.
    • Не писать вне allowlisted roots: selected project, selected home, known agent config dirs, known MCP/plugin config files.

    API/tRPC additions

    Skiller tRPC:

    • list_tools
    • search_tools
    • prepare_tool_install
    • execute_tool_install
    • list_tool_installs

    docker-git API:

    • scoped tool install execution endpoint рядом с текущими Skiller/project routes;
    • typed request/response schemas через @effect/schema;
    • typed errors для timeout, non-zero exit, unsupported tool, manual config required.

    Legacy endpoints for project skills оставить без breaking changes.

    UI changes

    • Dashboard agent cards: Install запускает confirmation flow для installable agents.
    • Marketplace page: перейти с MarketplaceSkill wording на unified Tools/MarketplaceTool with kind filters: Skills, Agents, MCP, Plugins, Dev tools.
    • Detail pane должен показывать:
      • source marketplace/registry;
      • install target;
      • commands/config files that will change;
      • required secrets/config state;
      • provenance and install result/log.
    • Unsupported/manual entries не должны выглядеть как failed install; показывать понятное manual state.

    Test plan

    Skiller tests:

    • agent TOML -> MarketplaceTool normalization;
    • Linux install command selection and safe fallback;
    • MCP Registry remote/npm package -> deterministic install plan;
    • unsupported/auth-required MCP entries -> manual state;
    • Codex plugin marketplace selector -> deterministic install plan;
    • no arbitrary browser-provided command execution.

    docker-git API tests:

    • scoped install execution uses container/project/user from SkillerContainerScope;
    • rejects arbitrary command payloads;
    • maps timeout/non-zero exit to typed errors;
    • keeps legacy /projects/:projectId/skills behavior unchanged.

    Verification commands:

    bun run typecheck
    bun run check
    bun run test
    bun run skiller:init
    bun run skiller:install
    bun run skiller:check

    External source notes used while planning

  2. skulidropek commented on Jun 6, 2026

    @skulidropek
    MemberAuthor

    Implemented the Skiller Web docker-git connection flow.

    Backend (docker-git):

    • added /skiller/connect and /api/skiller/connect for project discovery and runtime connection
    • added exact-origin CORS for configured Skiller Web origins plus local dev
    • added /skiller/events proxy support for SSE
    • added connectSkillerWeb path that starts/reuses the local Skiller runtime even when external Skiller Web launch is configured

    Frontend (skiller-web):

    • production web build now shows a docker-git backend gate before rendering the app
    • supports backendUrl/projectKey/sessionId launch params
    • stores connection state and routes tRPC/SSE through docker-git after connect
    • adds Settings disconnect to switch backend
    • /launch now passes params to the browser instead of Vercel server-fetching local docker-git URLs

    Verification:

    • docker-git API typecheck: passed
    • docker-git API test suite: 179 passed
    • skiller-web build/typecheck: passed
    • skiller-web test: 11 passed
    • local browser smoke: gate, mock connect, disconnect passed
    • Vercel production deploy: https://skiller-web-henna.vercel.app

    Commits:

    • docker-git issue branch: 670a168
    • skiller-web main: 64c4470
  3. skulidropek commented on Jun 6, 2026

    @skulidropek
    MemberAuthor

    Implemented and merged.

    What changed:

    • docker-git now supports external Skiller Web launch links with backendUrl, projectKey, and sessionId.
    • docker-git allows the production Skiller Web origin https://skiller-web-henna.vercel.app by default for Skiller connection routes.
    • docker-git answers Chrome Private Network Access preflights with Access-Control-Allow-Private-Network: true when requested.
    • Skiller context endpoints now participate in the same Skiller CORS flow, so direct /launch?...&projectKey=... does not produce an early browser CORS failure.
    • Skiller Web now parses docker-git launch params from both normal query strings and hash-router query strings, including localhost URLs.

    Merged/deployed:

    Verification:

    • bun run --filter @effect-template/api lint
    • bun run --filter @effect-template/api typecheck
    • bun run --filter @effect-template/api test
    • bun run test and bun run build in skiller-web
    • GitHub Actions on docker-git main commit aaa4f30: Checking Dependencies and Check both passed
    • Browser smoke on production with /#/?backendUrl=http%3A%2F%2F127.0.0.1%3A4181 auto-loaded projects
    • Browser smoke on production with /launch?backendUrl=http%3A%2F%2F127.0.0.1%3A4181&projectKey=project-proof auto-connected and stored the docker-git connection
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions