feat(nova): add hermes plugin instructions (#832)

This commit is contained in:
MaheshtheDev 2026-04-06 23:18:38 +00:00
parent 8405305c50
commit 0638f65bc3
9 changed files with 72 additions and 15 deletions

View file

@ -95,7 +95,7 @@ It also comes with an agent embedded inside, which we call Nova.
### Supermemory Plugins
Supermemory comes built with Plugins for Claude Code, OpenCode and OpenClaw.
Supermemory comes built with Plugins for Claude Code, OpenCode, OpenClaw, and Hermes.
<img width="844" height="484" alt="image" src="https://github.com/user-attachments/assets/ecb879a2-8652-495d-9228-f305a97ba603" />
@ -106,6 +106,7 @@ You can find them here:
- Openclaw plugin: https://github.com/supermemoryai/openclaw-supermemory
- Claude code plugin: https://github.com/supermemoryai/claude-supermemory
- OpenCode plugin: https://github.com/supermemoryai/opencode-supermemory
- Hermes agent (Supermemory memory provider): https://github.com/NousResearch/hermes-agent
### MCP - Quick install
@ -137,7 +138,7 @@ Memory is scoped with **projects** (container tags) so you can separate work and
### Supported clients
**Claude Desktop** · **Cursor** · **Windsurf** · **VS Code** · **Claude Code** · **OpenCode** · **OpenClaw**
**Claude Desktop** · **Cursor** · **Windsurf** · **VS Code** · **Claude Code** · **OpenCode** · **OpenClaw** · **Hermes**
The MCP server is open source — [view the source](https://supermemory.ai/docs/supermemory-mcp/mcp).

View file

@ -41,6 +41,8 @@ import {
fullscreenParam,
chatParam,
integrationParam,
pluginsPanelParam,
type IntegrationParamValue,
} from "@/lib/search-params"
type DocumentsResponse = z.infer<typeof DocumentsWithMemoriesResponseSchema>
@ -121,7 +123,17 @@ export default function NewPage() {
fullscreenParam,
)
const [isChatOpen, setIsChatOpen] = useQueryState("chat", chatParam)
const [, setIntegration] = useQueryState("integration", integrationParam)
const [integrationFromUrl, setIntegration] = useQueryState(
"integration",
integrationParam,
)
const [pluginsPanelFromUrl] = useQueryState("plugins", pluginsPanelParam)
useEffect(() => {
if (integrationFromUrl || pluginsPanelFromUrl === true) {
void setViewMode("integrations")
}
}, [integrationFromUrl, pluginsPanelFromUrl, setViewMode])
// Ephemeral local state (not worth URL-encoding)
const [fullscreenInitialContent, setFullscreenInitialContent] = useState("")
@ -378,7 +390,7 @@ export default function NewPage() {
)
const handleOpenIntegrations = useCallback(
(integration?: "import" | "chrome" | "connections") => {
(integration?: IntegrationParamValue) => {
setViewMode("integrations")
if (integration) {
setIntegration(integration)

View file

@ -67,6 +67,16 @@ const PLUGIN_INFO: Record<string, PluginInfo> = {
],
icon: "/images/plugins/openclaw.svg",
},
hermes: {
name: "Hermes",
description: "Memory layer for Hermes agent",
features: [
"Semantic search across previous sessions",
"Auto-capture of conversation context",
"Builds persistent user profile from interactions",
],
icon: "/images/plugins/hermes.svg",
},
cursor: {
name: "Cursor",
description:
@ -339,7 +349,7 @@ function AuthConnectContent() {
</button>
<a
href="https://app.supermemory.ai/?view=integrations/plugins"
href="https://app.supermemory.ai/?plugins=true"
className={dmSans125ClassName(
"text-[12px] text-[#737373] hover:text-[#FAFAFA] transition-colors",
)}

View file

@ -21,6 +21,7 @@ import { GoogleDrive, Notion, OneDrive } from "@ui/assets/icons"
import { ArrowLeft, Sun } from "lucide-react"
import {
integrationParam,
pluginsPanelParam,
type IntegrationParamValue,
} from "@/lib/search-params"
import Image from "next/image"
@ -46,7 +47,8 @@ const cards: IntegrationCardDef[] = [
{
id: "plugins",
title: "Plugins",
description: "Claude Code, OpenCode, and other AI tool integrations",
description:
"Claude Code, OpenCode, Hermes, and other AI tool integrations",
pro: true,
icon: (
<div className="flex items-center -space-x-1.5">
@ -71,6 +73,13 @@ const cards: IntegrationCardDef[] = [
height={24}
className="size-6 rounded"
/>
<Image
src="/images/plugins/hermes.svg"
alt="Hermes"
width={24}
height={24}
className="size-6 rounded"
/>
</div>
),
},
@ -156,17 +165,26 @@ export function IntegrationsView() {
"integration",
integrationParam,
)
const [pluginsPanel, setPluginsPanel] = useQueryState(
"plugins",
pluginsPanelParam,
)
const [selectedCard, setSelectedCard] = useState<CardId | null>(null)
useEffect(() => {
if (pluginsPanel === true) {
setSelectedCard("plugins")
return
}
if (integration && INTEGRATION_TO_CARD[integration]) {
setSelectedCard(INTEGRATION_TO_CARD[integration])
}
}, [integration])
}, [integration, pluginsPanel])
const handleBack = () => {
setSelectedCard(null)
setIntegration(null)
void setPluginsPanel(null)
}
switch (selectedCard) {

View file

@ -83,6 +83,19 @@ const PLUGIN_CATALOG: Record<string, PluginInfo> = {
docsUrl: "https://docs.supermemory.ai/integrations/openclaw",
repoUrl: "https://github.com/supermemoryai/openclaw-supermemory",
},
hermes: {
id: "hermes",
name: "Hermes",
description: "Memory layer for Hermes agent",
features: [
"Semantic search across previous sessions",
"Auto-capture of conversation context",
"Builds persistent user profile from interactions",
],
icon: "/images/plugins/hermes.svg",
docsUrl: "https://docs.supermemory.ai/integrations/hermes",
repoUrl: "https://github.com/NousResearch/hermes-agent",
},
}
interface ConnectedPlugin {
@ -335,7 +348,7 @@ export function PluginsDetail() {
"text-[12px] text-[#737373]",
)}
>
Claude Code, OpenCode, OpenClaw & more
Claude Code, OpenCode, OpenClaw, Hermes & more
</span>
</div>

View file

@ -29,7 +29,10 @@ import { QuickNoteCard } from "./quick-note-card"
import { HighlightsCard, type HighlightItem } from "./highlights-card"
import { GraphCard } from "./memory-graph"
import { Button } from "@ui/components/button"
import { categoriesParam } from "@/lib/search-params"
import {
categoriesParam,
type IntegrationParamValue,
} from "@/lib/search-params"
import { NovaEmptyState } from "@/components/nova/nova-empty-state"
import {
AlertDialog,
@ -143,9 +146,7 @@ interface HighlightsProps {
interface NovaEmptyStateProps {
onAddMemory: (tab: "note" | "link") => void
onOpenIntegrations: (
integration?: "import" | "chrome" | "connections",
) => void
onOpenIntegrations: (integration?: IntegrationParamValue) => void
isAllSpaces: boolean
spaceName?: string
onSwitchToAllSpaces?: () => void

View file

@ -1,6 +1,7 @@
"use client"
import { CHROME_EXTENSION_URL } from "@repo/lib/constants"
import type { IntegrationParamValue } from "@/lib/search-params"
import { cn } from "@lib/utils"
import { dmSansClassName } from "@/lib/fonts"
import { Button } from "@ui/components/button"
@ -10,9 +11,7 @@ import { ArrowRight, Link2, FileText, Zap } from "lucide-react"
interface NovaEmptyStateProps {
onAddMemory: (tab: "note" | "link") => void
onOpenIntegrations: (
integration?: "import" | "chrome" | "connections",
) => void
onOpenIntegrations: (integration?: IntegrationParamValue) => void
isAllSpaces: boolean
spaceName?: string
onSwitchToAllSpaces?: () => void

View file

@ -29,6 +29,8 @@ export type IntegrationParamValue = (typeof integrationLiterals)[number]
export const integrationParam = parseAsStringLiteral(integrationLiterals)
export type ViewParamValue = (typeof viewLiterals)[number]
export const viewParam = parseAsStringLiteral(viewLiterals).withDefault("list")
export const pluginsPanelParam = parseAsBoolean
export const categoriesParam = parseAsArrayOf(parseAsString, ",").withDefault(
[],
)

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 19 KiB