diff --git a/README.md b/README.md index 02ecd81b433..1db5907be44 100644 --- a/README.md +++ b/README.md @@ -197,6 +197,7 @@ Superset works with any CLI-based coding agent, including: | Gemini CLI  [Gemini CLI](https://github.com/google-gemini/gemini-cli) | Fully supported | | GitHub Copilot  [GitHub Copilot](https://github.com/features/copilot) | Fully supported | | Grok  [Grok](https://x.ai/) | Fully supported | +| Hermes  [Hermes](https://github.com/NousResearch/hermes-agent) | Fully supported | | Kimi Code  [Kimi Code](https://www.kimi.com/) | Fully supported | | Kiro  [Kiro](https://kiro.dev/cli/) | Fully supported | | Mastra Code  [Mastra Code](https://mastra.ai/) | Fully supported | diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentIconPicker/agent-icon-options.ts b/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentIconPicker/agent-icon-options.ts index a7968bb21e2..509bdf28672 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentIconPicker/agent-icon-options.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentIconPicker/agent-icon-options.ts @@ -22,6 +22,7 @@ export const AGENT_ICON_OPTIONS: readonly AgentIconOption[] = [ { id: "vibe", label: "Mistral Vibe" }, { id: "kimi", label: "Kimi Code" }, { id: "grok", label: "Grok" }, + { id: "hermes", label: "Hermes" }, { id: "fx", label: "fx" }, { id: "agy", label: "Antigravity" }, { id: "kiro", label: "Kiro" }, diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts index 9002bd5960e..d13fdcd10e5 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts @@ -867,6 +867,8 @@ export const SETTINGS_ITEMS: SettingsItem[] = [ "moonshot", "grok", "xai", + "hermes", + "nous", "fx", "vercel", "antigravity", @@ -935,6 +937,8 @@ export const SETTINGS_ITEMS: SettingsItem[] = [ "moonshot", "grok", "xai", + "hermes", + "nous", "fx", "vercel", "antigravity", diff --git a/apps/docs/content/docs/agent-integration.mdx b/apps/docs/content/docs/agent-integration.mdx index b81f9fa1e84..2d369993527 100644 --- a/apps/docs/content/docs/agent-integration.mdx +++ b/apps/docs/content/docs/agent-integration.mdx @@ -25,6 +25,7 @@ Run AI coding agents in isolated workspaces. Each agent works independently with - **Cursor Agent** - Cursor AI agent - **Droid** - Factory's autonomous coding agent - **Polygraph** - Meta-harness with cross-repo visibility and persistent memory +- **Hermes** - Nous Research's autonomous coding and research agent - **fx** - Vercel's terminal coding agent - **Antigravity** - Google's Antigravity CLI (`agy`) - **Kiro** - AWS's spec-driven CLI coding agent diff --git a/apps/docs/content/docs/terminal-presets.mdx b/apps/docs/content/docs/terminal-presets.mdx index f723335b32d..e881712899e 100644 --- a/apps/docs/content/docs/terminal-presets.mdx +++ b/apps/docs/content/docs/terminal-presets.mdx @@ -55,6 +55,7 @@ Pre-configured presets for popular AI agents. Defaults mirror the bundled Supers - **vibe** - `vibe --trust --auto-approve` (Mistral's coding agent; trust grants access to `AGENTS.md` and `.agents/skills/`) - **kimi** - `kimi` (Kimi Code CLI; prompt launches run with `kimi -p` and resume in the interactive TUI) - **grok** - `grok --always-approve` (xAI's Grok Build CLI; prompts seed the interactive session directly) +- **hermes** - `hermes chat --yolo` (Nous Research's Hermes Agent; prompt launches run with `-q` and continue in the interactive chat) - **fx** - `fx` (Vercel's coding agent; prompt launches run `fx ask --auto` and resume the session in the TUI) - **agy** - `agy --mode accept-edits` (Google's Antigravity CLI; prompt launches seed the interactive session with `-i`) - **kiro** - `kiro-cli chat --trust-all-tools` (AWS's Kiro CLI; prompts seed the interactive session directly) diff --git a/apps/marketing/public/app-icons/hermes.svg b/apps/marketing/public/app-icons/hermes.svg new file mode 100644 index 00000000000..45fd164ca2b --- /dev/null +++ b/apps/marketing/public/app-icons/hermes.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/marketing/src/app/components/FeaturesSection/components/UniversalCompatibilityDemo/UniversalCompatibilityDemo.tsx b/apps/marketing/src/app/components/FeaturesSection/components/UniversalCompatibilityDemo/UniversalCompatibilityDemo.tsx index ba514e2b50b..eccd78a645a 100644 --- a/apps/marketing/src/app/components/FeaturesSection/components/UniversalCompatibilityDemo/UniversalCompatibilityDemo.tsx +++ b/apps/marketing/src/app/components/FeaturesSection/components/UniversalCompatibilityDemo/UniversalCompatibilityDemo.tsx @@ -15,6 +15,7 @@ const AGENTS = [ { name: "Mistral Vibe", icon: "/app-icons/vibe.svg", size: 18 }, { name: "Kimi Code", icon: "/app-icons/kimi.svg", size: 18 }, { name: "Grok CLI", icon: "/app-icons/grok.svg", size: 18 }, + { name: "Hermes", icon: "/app-icons/hermes.svg", size: 18 }, { name: "fx", icon: "/app-icons/fx.svg", size: 18 }, { name: "Antigravity", icon: "/app-icons/agy.svg", size: 18 }, { name: "Kiro", icon: "/app-icons/kiro.svg", size: 18 }, diff --git a/packages/shared/src/agent-command.test.ts b/packages/shared/src/agent-command.test.ts index 6742662d957..f657d77ac7b 100644 --- a/packages/shared/src/agent-command.test.ts +++ b/packages/shared/src/agent-command.test.ts @@ -181,6 +181,34 @@ describe("fx agent registration", () => { }); }); +describe("hermes agent registration", () => { + it("is a registered terminal agent with the right label", () => { + expect(AGENT_TYPES).toContain("hermes"); + expect(AGENT_LABELS.hermes).toBe("Hermes"); + }); + + it("runs prompt launches as a one-shot query and continues them in the chat", () => { + const command = buildAgentPromptCommand({ + prompt: "hello", + randomId: "hermes-1234", + agent: "hermes", + }); + + expect(command).toStartWith( + "hermes chat --yolo -q \"$(cat <<'SUPERSET_PROMPT_hermes1234'", + ); + expect(command).toEndWith('\n)" ; hermes chat --yolo -c'); + }); + + it("derives host preset prompt and resume args from the base command", () => { + const preset = getPresetById("hermes"); + expect(preset?.command).toBe("hermes"); + expect(preset?.args).toEqual(["chat", "--yolo"]); + expect(preset?.promptArgs).toEqual(["-q"]); + expect(preset?.resumeArgs).toEqual(["-r"]); + }); +}); + describe("grok agent registration", () => { it("is a registered terminal agent with the right label", () => { expect(AGENT_TYPES).toContain("grok"); diff --git a/packages/shared/src/builtin-terminal-agents.ts b/packages/shared/src/builtin-terminal-agents.ts index 9bff7604cd9..a09222d9f59 100644 --- a/packages/shared/src/builtin-terminal-agents.ts +++ b/packages/shared/src/builtin-terminal-agents.ts @@ -231,6 +231,17 @@ export const BUILTIN_TERMINAL_AGENTS = [ resumeCommand: "fx resume", nonInteractiveCommand: "fx ask --auto", }), + createBuiltinTerminalAgent({ + id: "hermes", + label: "Hermes", + description: + "Nous Research's autonomous agent for coding, research, and terminal workflows.", + command: "hermes chat --yolo", + promptCommand: "hermes chat --yolo -q", + promptCommandSuffix: "; hermes chat --yolo -c", + resumeCommand: "hermes chat --yolo -r", + nonInteractiveCommand: "hermes chat -q", + }), ] as const; export type BuiltinTerminalAgentType = diff --git a/packages/ui/src/assets/icons/preset-icons/hermes-white.svg b/packages/ui/src/assets/icons/preset-icons/hermes-white.svg new file mode 100644 index 00000000000..45fd164ca2b --- /dev/null +++ b/packages/ui/src/assets/icons/preset-icons/hermes-white.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/ui/src/assets/icons/preset-icons/hermes.svg b/packages/ui/src/assets/icons/preset-icons/hermes.svg new file mode 100644 index 00000000000..1b8bd4fa874 --- /dev/null +++ b/packages/ui/src/assets/icons/preset-icons/hermes.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/ui/src/assets/icons/preset-icons/index.ts b/packages/ui/src/assets/icons/preset-icons/index.ts index 509ad880bd2..f4eb3bcf998 100644 --- a/packages/ui/src/assets/icons/preset-icons/index.ts +++ b/packages/ui/src/assets/icons/preset-icons/index.ts @@ -13,6 +13,8 @@ import fxWhiteIcon from "./fx-white.svg"; import geminiIcon from "./gemini.svg"; import grokIcon from "./grok.svg"; import grokWhiteIcon from "./grok-white.svg"; +import hermesIcon from "./hermes.svg"; +import hermesWhiteIcon from "./hermes-white.svg"; import kimiIcon from "./kimi.svg"; import kimiWhiteIcon from "./kimi-white.svg"; import kiroIcon from "./kiro.svg"; @@ -42,6 +44,7 @@ export const PRESET_ICONS: Record = { fx: { light: fxIcon, dark: fxWhiteIcon }, gemini: { light: geminiIcon, dark: geminiIcon }, grok: { light: grokIcon, dark: grokWhiteIcon }, + hermes: { light: hermesIcon, dark: hermesWhiteIcon }, kimi: { light: kimiIcon, dark: kimiWhiteIcon }, kiro: { light: kiroIcon, dark: kiroIcon }, pi: { light: piIcon, dark: piWhiteIcon }, @@ -90,6 +93,8 @@ export { geminiIcon, grokIcon, grokWhiteIcon, + hermesIcon, + hermesWhiteIcon, kimiIcon, kimiWhiteIcon, kiroIcon,