Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,18 @@ One command deploys the mnemon skill, prompt files, and TRAE native hooks for
both TRAE IDE and TRAE Work to `.trae/`. The integration uses `SessionStart`,
`UserPromptSubmit`, and `Stop` hooks in `.trae/hooks.json`.

### [Qoder](https://qoder.com/) (QoderWork)

```bash
mnemon setup --target qoder --yes
mnemon setup --target qoderwork --yes
```

Qoder deploys the mnemon skill, prompt files, and native hooks to `.qoder/`
or `~/.qoder/`. QoderWork uses its native user config at `~/.qoderwork/`.
Both integrations register `SessionStart`, `UserPromptSubmit`, and `Stop`
hooks in `settings.json`.

### [OpenClaw](https://github.com/openclaw/openclaw)

```bash
Expand Down Expand Up @@ -221,7 +233,7 @@ memory is useful.

- **Zero user-side operation** — install once; supported runtimes can use hooks, minimal runtimes can use persistent rules
- **LLM-supervised** — the host LLM decides what to remember, update, and forget; no embedded LLM, no API keys
- **Multi-framework support** — Claude Code, Codex, and Cursor (hooks), OpenClaw (plugins), Pi (extensions), Nanobot (skills), and more
- **Multi-framework support** — Claude Code, Codex, Cursor, Qoder, and QoderWork (hooks), OpenClaw (plugins), Pi (extensions), Nanobot (skills), and more
- **Markdown-installable harness** — `SKILL.md`, `INSTALL.md`, `GUIDELINE.md`, and four lifecycle reminders
- **Four-graph architecture** — temporal, entity, causal, and semantic edges, not just vector similarity
- **Intent-native protocol** — three primitives (`remember`, `link`, `recall`) map to the LLM's cognitive vocabulary, not database syntax; structured JSON output with signal transparency
Expand All @@ -238,8 +250,14 @@ All your local agentic AIs — across sessions and frameworks — sharing one po
```
Claude Code ──┐
Codex ────────┤
Cursor ───────┤
Qoder ────────┤
QoderWork ────┤
OpenClaw ─────┤
Pi ───────────┤
Expand All @@ -254,7 +272,7 @@ All your local agentic AIs — across sessions and frameworks — sharing one po
```

The foundation is in place: a single `~/.mnemon` database that any agent can
read and write. Claude Code, Codex, and Cursor setup automate hook
read and write. Claude Code, Codex, Cursor, Qoder, and QoderWork setup automate hook
installation; OpenClaw can use plugin hooks; Pi integrates via native skills
and TypeScript lifecycle extensions; Nanobot integrates via skill files;
NanoClaw integrates via container skills and volume mounts. The same harness can
Expand Down
139 changes: 131 additions & 8 deletions cmd/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,20 @@ var setupCmd = &cobra.Command{
Short: "Deploy mnemon into LLM CLI environments",
Long: `Detect installed LLM CLIs and deploy mnemon integration.

By default, installs to project-local config (.claude/, .codex/, .cursor/, .trae/, .openclaw/, .nanobot/, .pi/).
Use --global to install to user-wide config (~/.claude/, ~/.codex/, ~/.cursor/, ~/.trae/, ~/.openclaw/, ~/.nanobot/workspace/, ~/.pi/agent/).
Hermes Agent uses its native user config at ~/.hermes/.
By default, installs to project-local config (.claude/, .codex/, .cursor/, .trae/, .qoder/, .openclaw/, .nanobot/, .pi/).
Use --global to install to user-wide config (~/.claude/, ~/.codex/, ~/.cursor/, ~/.trae/, ~/.qoder/, ~/.openclaw/, ~/.nanobot/workspace/, ~/.pi/agent/).
Hermes Agent and QoderWork use their native user config at ~/.hermes/ and ~/.qoderwork/.

Supported environments: Claude Code, Codex, Cursor, Trae, OpenClaw, Nanobot, Pi, Hermes Agent.
Supported environments: Claude Code, Codex, Cursor, Trae, Qoder, QoderWork, OpenClaw, Nanobot, Pi, Hermes Agent.

Examples:
mnemon setup # Interactive: project-local install
mnemon setup --global # Interactive: user-wide install
mnemon setup --target claude-code # Non-interactive: Claude Code only
mnemon setup --target cursor # Non-interactive: Cursor skill only
mnemon setup --target trae # Non-interactive: Trae skill and hooks
mnemon setup --target qoder # Non-interactive: Qoder skill and hooks
mnemon setup --target qoderwork # Non-interactive: QoderWork skill and hooks
mnemon setup --target hermes # Non-interactive: Hermes Agent only
mnemon setup --eject # Interactive: remove integrations
mnemon setup --eject --target claude-code # Non-interactive: remove Claude Code only
Expand All @@ -42,16 +44,16 @@ Examples:
}

func init() {
setupCmd.Flags().StringVar(&setupTarget, "target", "", "target environment (claude-code, codex, cursor, trae, openclaw, nanobot, pi, hermes)")
setupCmd.Flags().StringVar(&setupTarget, "target", "", "target environment (claude-code, codex, cursor, trae, qoder, qoderwork, openclaw, nanobot, pi, hermes)")
setupCmd.Flags().BoolVar(&setupEject, "eject", false, "remove mnemon integrations")
setupCmd.Flags().BoolVar(&setupYes, "yes", false, "auto-confirm all prompts (CI-friendly)")
setupCmd.Flags().BoolVar(&setupGlobal, "global", false, "install to user-wide config instead of project-local config")
rootCmd.AddCommand(setupCmd)
}

func runSetup(cmd *cobra.Command, args []string) error {
if setupTarget != "" && setupTarget != "claude-code" && setupTarget != "codex" && setupTarget != "cursor" && setupTarget != "trae" && setupTarget != "openclaw" && setupTarget != "nanobot" && setupTarget != "pi" && setupTarget != "hermes" {
return fmt.Errorf("invalid target %q (must be claude-code, codex, cursor, trae, openclaw, nanobot, pi, or hermes)", setupTarget)
if setupTarget != "" && setupTarget != "claude-code" && setupTarget != "codex" && setupTarget != "cursor" && setupTarget != "trae" && setupTarget != "qoder" && setupTarget != "qoderwork" && setupTarget != "openclaw" && setupTarget != "nanobot" && setupTarget != "pi" && setupTarget != "hermes" {
return fmt.Errorf("invalid target %q (must be claude-code, codex, cursor, trae, qoder, qoderwork, openclaw, nanobot, pi, or hermes)", setupTarget)
}

envs := setup.DetectEnvironments(setupGlobal)
Expand Down Expand Up @@ -87,7 +89,7 @@ func runInstallFlow(envs []setup.Environment) error {

if len(detected) == 0 {
fmt.Println("\nNo supported LLM CLI environments detected.")
fmt.Println("Install Claude Code, Codex, Cursor, Trae, OpenClaw, Nanobot, Pi, or Hermes Agent, then run 'mnemon setup' again.")
fmt.Println("Install Claude Code, Codex, Cursor, Trae, Qoder, QoderWork, OpenClaw, Nanobot, Pi, or Hermes Agent, then run 'mnemon setup' again.")
return nil
}

Expand Down Expand Up @@ -135,6 +137,10 @@ func installEnv(env *setup.Environment) error {
err = installCursor(env)
case "trae":
err = installTrae(env)
case "qoder":
err = installQoder(env)
case "qoderwork":
err = installQoderWork(env)
case "openclaw":
err = installOpenClaw(env)
case "nanobot":
Expand Down Expand Up @@ -569,6 +575,109 @@ func installTrae(env *setup.Environment) error {
return nil
}

// ─── Qoder ──────────────────────────────────────────────────────────

func installQoder(env *setup.Environment) error {
configDir := env.ConfigDir

if !setupGlobal && !setupYes && setup.IsInteractive() {
home := setup.HomeDir()
localDir := ".qoder"
globalDir := home + "/.qoder"
idx := setup.SelectOne("Install scope",
[]string{
fmt.Sprintf("Local — this project only (%s/)", localDir),
fmt.Sprintf("Global — all projects (%s/)", globalDir),
}, 0)
if idx == 1 {
configDir = globalDir
} else {
configDir = localDir
}
}

fmt.Printf("\nSetting up Qoder (%s)...\n", configDir)

return installQoderLike(
configDir,
setup.QoderWriteSkill,
setup.QoderRegisterHooks,
"Restart Qoder IDE/CLI to activate the mnemon skill and hooks.",
"Run 'mnemon setup --eject --target qoder' to remove.",
)
}

// ─── QoderWork ──────────────────────────────────────────────────────

func installQoderWork(env *setup.Environment) error {
configDir := env.ConfigDir

fmt.Printf("\nSetting up QoderWork (%s)...\n", configDir)

return installQoderLike(
configDir,
setup.QoderWorkWriteSkill,
setup.QoderWorkRegisterHooks,
"Restart QoderWork to activate the mnemon skill and hooks.",
"Run 'mnemon setup --eject --target qoderwork' to remove.",
)
}

func installQoderLike(configDir string, writeSkill func(string) (string, error), registerHooks func(string) (string, error), activation, ejectHint string) error {
fmt.Println("\n[1/3] Skill")
if path, err := writeSkill(configDir); err != nil {
setup.StatusError(0, 0, "Skill", err)
return err
} else {
setup.StatusOK(0, 0, "Skill", path)
}

fmt.Println("\n[2/3] Prompts")
var promptPath string
if path, err := setup.WritePromptFiles(); err != nil {
setup.StatusError(0, 0, "Prompts", err)
return err
} else {
setup.StatusOK(0, 0, "Prompts", path)
promptPath = path
}

fmt.Println("\n[3/3] Hooks")
for _, hook := range []struct {
label string
filename string
content []byte
}{
{"Hook: prime", "prime.sh", assets.QoderPrimeHook},
{"Hook: remind", "user_prompt.sh", assets.QoderUserPromptHook},
{"Hook: nudge", "stop.sh", assets.QoderStopHook},
} {
if path, err := setup.QoderWriteHook(configDir, hook.filename, hook.content); err != nil {
setup.StatusError(0, 0, hook.label, err)
return err
} else {
setup.StatusOK(0, 0, hook.label, path)
}
}
if path, err := registerHooks(configDir); err != nil {
setup.StatusError(0, 0, "Settings", err)
return err
} else {
setup.StatusUpdated(0, 0, "Settings", path)
}

fmt.Println()
fmt.Println("Setup complete!")
fmt.Printf(" Skill %s/skills/mnemon/SKILL.md\n", configDir)
fmt.Printf(" Hooks %s/settings.json (SessionStart, UserPromptSubmit, Stop)\n", configDir)
fmt.Printf(" Prompts %s/ (guide.md, skill.md)\n", promptPath)
fmt.Println()
fmt.Println(activation)
fmt.Println(ejectHint)

return nil
}

// ─── OpenClaw ───────────────────────────────────────────────────────

func installOpenClaw(env *setup.Environment) error {
Expand Down Expand Up @@ -1010,6 +1119,20 @@ func ejectEnv(env *setup.Environment) error {
return errs[0]
}

case "qoder":
errs := setup.QoderEject(env.ConfigDir)
ejectMarkdown("AGENTS.md", "Remove memory guidance from ./AGENTS.md?")
if len(errs) > 0 {
return errs[0]
}

case "qoderwork":
errs := setup.QoderWorkEject(env.ConfigDir)
ejectMarkdown("AGENTS.md", "Remove memory guidance from ./AGENTS.md?")
if len(errs) > 0 {
return errs[0]
}

case "openclaw":
errs := setup.OpenClawEject(env.ConfigDir)
ejectMarkdown("AGENTS.md", "Remove memory guidance from ./AGENTS.md?")
Expand Down
6 changes: 4 additions & 2 deletions docs/USAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ mnemon setup --target claude-code
mnemon setup --target codex
mnemon setup --target cursor
mnemon setup --target trae
mnemon setup --target qoder
mnemon setup --target qoderwork
mnemon setup --target openclaw
mnemon setup --target pi
mnemon setup --target nanobot --global
Expand All @@ -47,8 +49,8 @@ mnemon setup --eject --target claude-code

| Flag | Default | Description |
|---|---|---|
| `--global` | `false` | Install to user-wide config instead of project-local (recommended for Nanobot: installs to `~/.nanobot/workspace/`; Pi installs to `~/.pi/agent/`; Hermes installs to `~/.hermes/`) |
| `--target <name>` | (auto-detect) | Target environment: `claude-code`, `codex`, `cursor`, `trae`, `openclaw`, `nanobot`, `pi`, or `hermes` |
| `--global` | `false` | Install to user-wide config instead of project-local (recommended for Nanobot: installs to `~/.nanobot/workspace/`; Pi installs to `~/.pi/agent/`; Hermes installs to `~/.hermes/`; QoderWork installs to `~/.qoderwork/`) |
| `--target <name>` | (auto-detect) | Target environment: `claude-code`, `codex`, `cursor`, `trae`, `qoder`, `qoderwork`, `openclaw`, `nanobot`, `pi`, or `hermes` |
| `--eject` | `false` | Remove mnemon integrations |
| `--yes` | `false` | Auto-confirm all prompts |

Expand Down
21 changes: 16 additions & 5 deletions docs/zh/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,26 @@ mnemon setup

`mnemon setup` 自动检测 Claude Code,交互式部署技能文件、钩子和行为引导。启动新会话 — 记忆自动运作。

### [Trae](https://www.trae.ai/)
### [TRAE](https://www.trae.ai/) (TRAE Work)

```bash
mnemon setup --target trae --yes
```

一条命令将 mnemon skill、prompt 文件和 Trae 原生 hooks 部署到 `.trae/`。
该集成使用 `.trae/hooks.json` 中的 `SessionStart`、`UserPromptSubmit` 和
`Stop` hooks。
一条命令将 mnemon skill、prompt 文件和 TRAE 原生 hooks 部署到 `.trae/`,
同时覆盖 TRAE IDE 和 TRAE Work。该集成使用 `.trae/hooks.json` 中的
`SessionStart`、`UserPromptSubmit` 和 `Stop` hooks。

### [Qoder](https://qoder.com/) (QoderWork)

```bash
mnemon setup --target qoder --yes
mnemon setup --target qoderwork --yes
```

Qoder 会将 mnemon skill、prompt 文件和原生 hooks 部署到 `.qoder/` 或
`~/.qoder/`。QoderWork 使用原生用户级配置 `~/.qoderwork/`。两者都会在
`settings.json` 中注册 `SessionStart`、`UserPromptSubmit` 和 `Stop` hooks。

### [OpenClaw](https://github.com/openclaw/openclaw)

Expand Down Expand Up @@ -185,7 +196,7 @@ Agent 工作,并且只在有用时调用 Mnemon

- **零用户操作** — 安装一次;支持 hook 的 runtime 可用 hook,minimal runtime 可用持久规则
- **LLM 监督式** — 宿主 LLM 主动决定记什么、更新什么、遗忘什么;无内嵌 LLM,无 API 密钥
- **多框架支持** — Claude Code 和 Codex(hooks)、OpenClaw(plugins)、Pi(extensions)、Nanobot(skills)等
- **多框架支持** — Claude Code、Codex、Cursor、QoderQoderWork(hooks)、OpenClaw(plugins)、Pi(extensions)、Nanobot(skills)等
- **Markdown 可安装 harness** — `SKILL.md`、`INSTALL.md`、`GUIDELINE.md` 和四个生命周期提醒
- **四图架构** — 时序、实体、因果、语义四种边,不仅仅是向量相似度
- **意图原生协议** — 三个原语(`remember`、`link`、`recall`)映射到 LLM 的认知词汇而非数据库语法;结构化 JSON 输出,带信号透明度
Expand Down
6 changes: 4 additions & 2 deletions docs/zh/USAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ mnemon setup --target claude-code
mnemon setup --target codex
mnemon setup --target cursor
mnemon setup --target trae
mnemon setup --target qoder
mnemon setup --target qoderwork
mnemon setup --target openclaw
mnemon setup --target pi
mnemon setup --target nanobot --global
Expand All @@ -47,8 +49,8 @@ mnemon setup --eject --target claude-code

| 标志 | 默认值 | 说明 |
|---|---|---|
| `--global` | `false` | 安装到用户级配置而非项目本地(Nanobot 推荐安装到 `~/.nanobot/workspace/`;Pi 安装到 `~/.pi/agent/`;Hermes 安装到 `~/.hermes/`) |
| `--target <name>` | (自动检测) | 目标环境:`claude-code`、`codex`、`cursor`、`trae`、`openclaw`、`nanobot`、`pi` 或 `hermes` |
| `--global` | `false` | 安装到用户级配置而非项目本地(Nanobot 推荐安装到 `~/.nanobot/workspace/`;Pi 安装到 `~/.pi/agent/`;Hermes 安装到 `~/.hermes/`;QoderWork 安装到 `~/.qoderwork/`) |
| `--target <name>` | (自动检测) | 目标环境:`claude-code`、`codex`、`cursor`、`trae`、`qoder`、`qoderwork`、`openclaw`、`nanobot`、`pi` 或 `hermes` |
| `--eject` | `false` | 移除 mnemon 集成 |
| `--yes` | `false` | 自动确认所有提示 |

Expand Down
17 changes: 16 additions & 1 deletion internal/setup/assets/assets.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,21 @@ var TraeUserPromptHook []byte
//go:embed trae/stop.sh
var TraeStopHook []byte

//go:embed qoder/SKILL.md
var QoderSkill []byte

//go:embed qoderwork/SKILL.md
var QoderWorkSkill []byte

//go:embed qoder/prime.sh
var QoderPrimeHook []byte

//go:embed qoder/user_prompt.sh
var QoderUserPromptHook []byte

//go:embed qoder/stop.sh
var QoderStopHook []byte

//go:embed openclaw/SKILL.md
var OpenClawSkill []byte

Expand Down Expand Up @@ -106,5 +121,5 @@ var HermesCompactHook []byte

// All returns the embedded filesystem for inspection.
//
//go:embed claude codex cursor trae openclaw nanoclaw nanobot pi hermes
//go:embed claude codex cursor trae qoder qoderwork openclaw nanoclaw nanobot pi hermes
var All embed.FS
Loading
Loading