feat(dashboard): full-featured profile builder (model + skills + MCPs)#39084
Merged
Conversation
…l + MCPs + skills) Backend foundation for the dashboard profile builder. Extends POST /api/profiles to accept, in one call, everything a profile needs beyond name/clone: - mcp_servers[] -> written into the new profile's config.yaml - keep_skills[] -> replace-semantics: disable every seeded skill not kept - hub_skills[] -> async install via 'hermes -p <name> skills install <id>' All applied best-effort AFTER the profile dir exists, so a hiccup in any one never 500s the create. Model/MCP/keep-skills writes are profile-scoped via the HERMES_HOME context override (same mechanism as the existing _write_profile_model). Hub installs go through a subprocess scoped with -p because skills_hub.SKILLS_DIR is import-time-bound and the runtime override can't redirect it. Adds two helpers (_write_profile_mcp_servers, _disable_unselected_skills) and a TestClient test asserting all four paths land in the NEW profile's config and the hub spawn is scoped to it. Design doc at docs/design/profile-builder.md.
Adds a dedicated /profiles/new builder that composes everything a profile
needs into one stepped create flow, reusing the existing Models/Skills/MCP
data paths instead of duplicating them:
- Identity name + description
- Model provider+model picker (api.getModelOptions)
- Skills keep-which-built-in/optional (replace semantics, default = full
bundle) + skills-hub search/add (api.getSkills, searchSkillsHub)
- MCPs add HTTP/stdio servers inline
- Review blueprint -> single POST /api/profiles create
Nothing writes until Create; the one call commits model+MCPs+skill selection
and spawns hub-skill installs (reported in the success toast). ProfilesPage
header gets a 'Build' button (full builder) alongside 'Create' (quick modal).
Route is page-only (not in the sidebar nav). Verified with vite build (2258
modules, green).
Contributor
🔎 Lint report:
|
7 tasks
KeyArgo
pushed a commit
to KeyArgo/hermes-agent
that referenced
this pull request
Jun 6, 2026
Cherry-picked profile builder feature from upstream PR NousResearch#39084: - ProfileBuilderPage.tsx (new page) - Extended createProfile API with model/mcp/skills params - Backend endpoint accepts mcp_servers, keep_skills, hub_skills - Build button in Profiles page header - Design doc
alt-glitch
pushed a commit
that referenced
this pull request
Jun 14, 2026
#39084) * feat(profiles): extend create endpoint for full profile-builder (model + MCPs + skills) Backend foundation for the dashboard profile builder. Extends POST /api/profiles to accept, in one call, everything a profile needs beyond name/clone: - mcp_servers[] -> written into the new profile's config.yaml - keep_skills[] -> replace-semantics: disable every seeded skill not kept - hub_skills[] -> async install via 'hermes -p <name> skills install <id>' All applied best-effort AFTER the profile dir exists, so a hiccup in any one never 500s the create. Model/MCP/keep-skills writes are profile-scoped via the HERMES_HOME context override (same mechanism as the existing _write_profile_model). Hub installs go through a subprocess scoped with -p because skills_hub.SKILLS_DIR is import-time-bound and the runtime override can't redirect it. Adds two helpers (_write_profile_mcp_servers, _disable_unselected_skills) and a TestClient test asserting all four paths land in the NEW profile's config and the hub spawn is scoped to it. Design doc at docs/design/profile-builder.md. * feat(dashboard): full-featured profile builder page Adds a dedicated /profiles/new builder that composes everything a profile needs into one stepped create flow, reusing the existing Models/Skills/MCP data paths instead of duplicating them: - Identity name + description - Model provider+model picker (api.getModelOptions) - Skills keep-which-built-in/optional (replace semantics, default = full bundle) + skills-hub search/add (api.getSkills, searchSkillsHub) - MCPs add HTTP/stdio servers inline - Review blueprint -> single POST /api/profiles create Nothing writes until Create; the one call commits model+MCPs+skill selection and spawns hub-skill installs (reported in the success toast). ProfilesPage header gets a 'Build' button (full builder) alongside 'Create' (quick modal). Route is page-only (not in the sidebar nav). Verified with vite build (2258 modules, green).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Profiles can now be created in the dashboard with full control over Model+Provider, Skills (built-in/optional + skills-hub), MCP servers, Name, and Description — in one stepped builder, instead of the thin name+clone+model create modal.
This replaces the CLI
hermes profile wizardapproach (PR #31781): a profile is a full HERMES_HOME dir, and the dashboard already owns mature Models/Skills/MCP pages, so the builder composes those existing data paths rather than reinventing them.Changes
hermes_cli/web_server.py:POST /api/profilesacceptsmcp_servers[],keep_skills[],hub_skills[](all optional, all best-effort post-create so a hiccup never 500s the create). Two new helpers:_write_profile_mcp_serversand_disable_unselected_skills, both profile-scoped via the HERMES_HOME context override (same mechanism as the existing_write_profile_model).hermes -p <name> skills install <id>— a subprocess, becauseskills_hub.SKILLS_DIRis import-time-bound and the runtime override can't redirect it (a fresh child re-binds it to the profile's HERMES_HOME).web/src/pages/ProfileBuilderPage.tsx: new/profiles/newstepped page (Identity → Model → Skills → MCPs → Review). Nothing writes until Create. Skills use replace semantics with a "start from full bundle" default.web/src/pages/ProfilesPage.tsx: headerBuildbutton → builder; quickCreatemodal kept.web/src/lib/api.ts,web/src/App.tsx: extendedcreateProfilesignature + route (page-only, not in sidebar nav).docs/design/profile-builder.md: design rationale + the two architectural seams found.Validation
-p <name>tests/hermes_cli/test_web_server.py(profile/create)test_profiles_create_builder_fields_*)vite buildNotes
Infographic