Skip to content

Prepare OpenClaw, Hermes, and Cursor integrations for release#174

Merged
wey-gu merged 14 commits into
mainfrom
dev_0619
Apr 8, 2026
Merged

Prepare OpenClaw, Hermes, and Cursor integrations for release#174
wey-gu merged 14 commits into
mainfrom
dev_0619

Conversation

@wey-gu

@wey-gu wey-gu commented Apr 8, 2026

Copy link
Copy Markdown
Member

Summary

Prepares the Nowledge Mem community integrations for release and upstream review across three surfaces:

  • OpenClaw: ClawHub-first distribution
  • Hermes: provider parity with the upstream Hermes PR branch
  • Cursor: stable local package shape with a proper session bootstrap path

This PR also normalizes remote setup guidance so user-facing instructions point to nmem config client ... instead of asking people to edit JSON files directly.

What Changed

OpenClaw

  • finalized ClawHub-facing package metadata
  • aligned package.json, openclaw.plugin.json, lockfile versioning, and repo registry metadata
  • added a stronger validator and release runbook
  • updated install guidance to use ClawHub as the primary path

Hermes

  • synced the community Hermes package to 0.5.5
  • aligned provider and client code with the upstream Hermes PR branch
  • fixed argument normalization for list-shaped inputs
  • fixed source attribution so saved memories are tagged as hermes
  • clarified remote setup through nmem config client ...

Cursor

  • renamed the package identity to nowledge-mem-cursor to avoid collisions with the Claude-oriented package
  • switched to the current mcp.json package shape
  • added a sessionStart hook for Working Memory bootstrap
  • tightened validation and clarified the local install flow
  • documented the real behavior contract: save-handoff only, not transcript save/import

Registry / Repo Surface

  • updated integrations.json to match shipped package versions
  • cleaned install and remote-setup wording so the repo-level guidance is consistent across integrations

Why These Changes Belong Together

These integrations share one product contract:

  • the same Mem backend
  • the same nmem client config path for local and remote access
  • the same expectation that release metadata, docs, and registry versions stay aligned

Shipping them together reduces drift between package contents, repo registry metadata, and the install paths users actually follow.

Validation

Passed locally:

  • OpenClaw validator
  • Cursor validator
  • Cursor template validator
  • Hermes provider tests
  • Hermes Python compile checks
  • git diff --check

Also verified manually:

  • OpenClaw ClawHub dry-run publish succeeded
  • Cursor local package loads as a distinct package identity
  • Hermes native save/search flows work with the synced provider package

Notes

  • This PR prepares the community repo surfaces. The Hermes core fix for lazy provider tool registration lives in the upstream Hermes PR, not in this repo.
  • Website/docs-site publication happens in the separate nowledge-labs-website repo.

Summary by CodeRabbit

Release Notes

  • New Features

    • Cursor: Local install workflow with session-start Working Memory bootstrapping
    • Hermes: Native provider improvements with better tool registration and MCP fallback
  • Bug Fixes

    • Hermes: Fixed native tool compatibility, error handling, and source attribution
    • OpenClaw: Enhanced validation and plugin metadata consistency
  • Documentation

    • Updated installation methods: Cursor (local linking), OpenClaw (ClawHub), all plugins
    • Proactive search and autonomous save guidance across integrations
    • Simplified remote configuration workflow using nmem config client commands
    • Added release guides and validation procedures
  • Chores

    • Version updates: Claude Code (0.7.3), Cursor (0.1.4), OpenClaw (0.8.3), Hermes (0.5.5)

wey-gu and others added 2 commits April 8, 2026 11:51
…tions

Strengthens per-turn behavioral injection from conditional ("Before
answering questions about prior work...") to assertive ("Search
proactively... Do not wait to be asked") across OpenClaw, Claude Code,
Cursor, and Codex. Addresses user reports of GPT 5.4 and Kimi K2.5 not
proactively searching memories.

OpenClaw (0.8.2): tightened BASE_GUIDANCE and SESSION_CONTEXT_GUIDANCE
to 6 lines (~60 tokens), removed redundant signal list and output-format
description, restored "(not file paths)" hint. Both search and save
directives now include "Do not wait to be asked."

Claude Code (0.7.3): UserPromptSubmit hook text changed from passive
syntax hint to directive framing. Also fixes pre-existing plugin.json
version mismatch (was 0.7.1, CHANGELOG already had 0.7.2).

Cursor (0.1.2): rule header changed to assertive, "Writing Rules"
renamed to "Autonomous Save" with explicit proactive directive.

Codex prompts: AGENTS.md search section aligned with shared behavioral
guidance (signal list expanded, directive lead).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@wey-gu

wey-gu commented Apr 8, 2026

Copy link
Copy Markdown
Member Author

@codex please help review

bugbot run

@coderabbitai

coderabbitai Bot commented Apr 8, 2026

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8ca49026-b37f-4668-bbd8-9a98a7dfd9ce

📥 Commits

Reviewing files that changed from the base of the PR and between f821734 and e3fada7.

📒 Files selected for processing (3)
  • nowledge-mem-hermes/CHANGELOG.md
  • nowledge-mem-hermes/client.py
  • nowledge-mem-hermes/provider.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • nowledge-mem-hermes/CHANGELOG.md

📝 Walkthrough

Walkthrough

Adds a Cursor session-start Working Memory hook and bootstrap script; updates install, validation, and docs for Cursor, OpenClaw, and Hermes; bumps multiple plugin/integration versions; tightens proactive search/save guidance; and refactors Hermes provider tooling and input/result normalization.

Changes

Cohort / File(s) Summary
Root docs & registry
README.md, integrations.json
Updated integration install notes (Cursor local plugin path, OpenClaw clawhub: spec, Hermes bootstrap/native-provider framing); bumped integration versions for Claude Code, Cursor, OpenClaw, Hermes; altered install/update command text and tool-naming/thread-save notes.
Claude Code plugin
nowledge-mem-claude-code-plugin/.claude-plugin/plugin.json, CHANGELOG.md, hooks/hooks.json, README.md, skills/*
Version bump to 0.7.3; per-turn guidance made more assertive; UserPromptSubmit message text updated; README/skills switch remote client docs to nmem config client set ....
Cursor plugin — manifest, marketplace & hooks
nowledge-mem-cursor-plugin/.cursor-plugin/plugin.json, .cursor-plugin/marketplace.json, hooks/hooks.json, hooks/session-start.mjs
Renamed package id to nowledge-mem-cursor, bumped version; added sessionStart hook and session-start.mjs that invokes nmem (10s timeout) with legacy-file fallback and emits <nowledge_working_memory> payload.
Cursor plugin — docs, rules, validation & release
nowledge-mem-cursor-plugin/README.md, CHANGELOG.md, RELEASING.md, scripts/validate-plugin.mjs, rules/nowledge-mem.mdc, skills/read-working-memory/SKILL.md
Documented session-start bootstrap and MCP naming (mcp.json); adjusted rules/skill to avoid re-reading if hook-provided WM exists; added validator checks (YAML frontmatter, mcp.json required, .mcp.json forbidden, hook presence/command check) and updated release checklist.
OpenClaw plugin & tooling
nowledge-mem-openclaw-plugin/openclaw.plugin.json, package.json, scripts/validate-plugin.mjs, RELEASING.md, CHANGELOG.md, src/hooks/behavioral.js, README.md, SKILL.md
Bumped to 0.8.3; added name/description/displayName and OpenClaw metadata; introduced validator and ClawHub publish runbook; updated behavioral guidance to proactive-search/autonomous-save; changed install command to clawhub: and documented local link workflow.
Hermes provider & docs
nowledge-mem-hermes/plugin.yaml, provider.py, README.md, CHANGELOG.md, RELEASING.md, client.py
Bumped to 0.5.5 and added lifecycle hooks; refactored provider to normalize inputs/results, accept multiple arg shapes, and provide consistent tool_result/tool_error responses; README/changelog emphasize native-provider bootstrap script with MCP fallback; client adds -s hermes on save.
Validators & release docs (misc)
nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs, nowledge-mem-cursor-plugin/scripts/validate-plugin.mjs, various RELEASING.md
Introduced/expanded plugin validation scripts and release runbooks enforcing manifest/schema/frontmatter/hook requirements and ClawHub/marketplace publish steps.
Small docs/skill adjustments across packages
multiple SKILL.md, commands/status.md, nowledge-mem-npx-skills/skills/check-integration/SKILL.md
Replaced manual config-file instructions with nmem config client set ... CLI setup; updated install examples for Cursor/OpenClaw and harmonized proactive guidance across skills.

Sequence Diagram(s)

sequenceDiagram
    participant Cursor as Cursor (session start)
    participant Hook as session-start.mjs
    participant nmem as nmem CLI
    participant File as LegacyFile (~\/ai-now/memory.md)
    participant Session as SessionContext

    Cursor->>Hook: sessionStart event
    Hook->>nmem: spawn `nmem --json wm read` (10s)
    alt nmem returns working memory
        nmem-->>Hook: JSON { content: "..." }
        Hook->>Hook: trim & wrap in <nowledge_working_memory>
        Hook->>Session: emit JSON with additional_context + hookSpecificOutput
    else nmem fails or parse error
        Hook->>File: read legacy file if present
        alt legacy file found
            File-->>Hook: file content
            Hook->>Hook: trim & wrap in <nowledge_working_memory>
            Hook->>Session: emit JSON with additional_context + hookSpecificOutput
        else no memory available
            Hook-->>Session: emit empty payload (no-op)
        end
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐇 I hop at dawn to boot the day,
I call nmem, fetch notes along the way,
Hooks tuck memories into session light,
Validators hum, release checks all right,
Proactive saves—my carrot in flight.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.41% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title directly and accurately describes the main objective: preparing three integrations (OpenClaw, Hermes, and Cursor) for release, which aligns with the comprehensive changes across multiple integration packages and their release-readiness updates.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev_0619

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@wey-gu

wey-gu commented Apr 8, 2026

Copy link
Copy Markdown
Member Author

bugbot run

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 836c9c7585

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread nowledge-mem-cursor-plugin/hooks/session-start.mjs Outdated
Comment thread integrations.json Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
nowledge-mem-openclaw-plugin/package.json (1)

39-42: Validate openclaw.release flags in the validator too.

You now declare openclaw.release.publishToClawHub / publishToNpm on Line 39-Line 42, but they are not currently enforced by scripts/validate-plugin.mjs, so accidental drift won’t fail validation.

♻️ Suggested validator patch
diff --git a/nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs b/nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs
@@
   assertString(openclaw.install?.npmSpec, "package.json openclaw.install.npmSpec");
   assertVersionFloor(openclaw.install?.minHostVersion, "package.json openclaw.install.minHostVersion");
   assertVersionFloor(openclaw.compat?.pluginApi, "package.json openclaw.compat.pluginApi");
   assertString(openclaw.build?.openclawVersion, "package.json openclaw.build.openclawVersion");
+  if (typeof openclaw.release?.publishToClawHub !== "boolean") {
+    fail("package.json openclaw.release.publishToClawHub must be a boolean");
+  }
+  if (typeof openclaw.release?.publishToNpm !== "boolean") {
+    fail("package.json openclaw.release.publishToNpm must be a boolean");
+  }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@nowledge-mem-openclaw-plugin/package.json` around lines 39 - 42, Add
validation in scripts/validate-plugin.mjs to enforce the new openclaw.release
flags: check that package.json (or parsed plugin manifest) contains
openclaw.release.publishToClawHub and openclaw.release.publishToNpm and that
they are booleans; if missing or not boolean, throw or log an error and exit
non‑zero so validation fails. Locate the existing validation flow (e.g. the
validatePluginConfig / validateManifest function in scripts/validate-plugin.mjs)
and insert a small check that reads manifest.openclaw?.release and asserts
typeof publishToClawHub === "boolean" and typeof publishToNpm === "boolean",
emitting a clear error message referencing openclaw.release.publishToClawHub /
openclaw.release.publishToNpm when validation fails.
nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs (1)

111-123: Broaden configSchema validation beyond three defaults.

Current checks only protect sessionContext, sessionDigest, and corpusSupplement. Key/type/default/range drift in the remaining schema properties won’t be caught by this validator.

Suggested direction
   const configSchema = manifest.configSchema?.properties;
   if (!configSchema || typeof configSchema !== "object") {
     fail("openclaw.plugin.json configSchema.properties must exist");
   }
+  const requiredConfigKeys = [
+    "sessionContext",
+    "sessionDigest",
+    "digestMinInterval",
+    "maxContextResults",
+    "recallMinScore",
+    "maxThreadMessageChars",
+    "captureExclude",
+    "captureSkipMarker",
+    "corpusSupplement",
+    "corpusMaxResults",
+    "corpusMinScore",
+    "apiUrl",
+    "apiKey",
+  ];
+  for (const key of requiredConfigKeys) {
+    if (!(key in configSchema)) {
+      fail(`configSchema.properties.${key} must exist`);
+    }
+  }
   if (configSchema.sessionContext?.default !== false) {
     fail("sessionContext must default to false");
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs` around lines 111 -
123, The validator currently only checks three defaults; update the logic around
manifest.configSchema?.properties (configSchema) to validate the full expected
schema set: ensure required property keys exist, their schema types match
expectations, and their default values/ranges match a defined spec instead of
only checking sessionContext, sessionDigest, and corpusSupplement; implement a
small expectedSpec mapping (property -> {type, default, optional range}) and
iterate over Object.entries(expectedSpec) to call fail(...) when a property is
missing, has the wrong type, or the default/value is outside the allowed range,
reusing the existing fail function for errors.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@nowledge-mem-cursor-plugin/hooks/session-start.mjs`:
- Around line 29-36: The readLegacyWorkingMemoryFile function reads legacyPath
unguarded causing the session-start hook to crash if readFileSync throws; wrap
the readFileSync call in a try/catch around the existing existsSync check so any
read errors (permissions/IO) are caught and the function returns an empty string
instead of throwing, and optionally log or debug the error via the same logger
used elsewhere in the module for visibility.

In `@nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs`:
- Around line 21-27: The readFile call inside assertNonEmpty can throw and
should be wrapped in a try/catch so validation errors are surfaced via fail(...)
instead of uncaught exceptions; modify assertNonEmpty (the function that calls
readFile(path.join(pluginRoot, relPath), "utf8")) to catch any error, call
fail(`Failed to read ${relPath}: ${err.message}`) (or similar friendly message
including relPath and the original error), and only proceed to trim/return text
if read succeeded.
- Around line 100-103: Add a third check that verifies CHANGELOG.md's newest
release header matches the same version as manifest.version and pkg.version:
read CHANGELOG.md, extract the topmost release version (e.g. via a regex
matching headers like /^##\s*\[?(\d+\.\d+\.\d+(?:[-+][\w.]+)?)\]?/m), assert it
exists, and compare it to manifest.version/pkg.version; if it differs call
fail("CHANGELOG.md version must match package.json and openclaw.plugin.json").
Insert this check alongside the existing assertString(manifest.version, ...) /
if (manifest.version !== pkg.version) block so all three sources are validated
and failures reference manifest.version and pkg.version.

---

Nitpick comments:
In `@nowledge-mem-openclaw-plugin/package.json`:
- Around line 39-42: Add validation in scripts/validate-plugin.mjs to enforce
the new openclaw.release flags: check that package.json (or parsed plugin
manifest) contains openclaw.release.publishToClawHub and
openclaw.release.publishToNpm and that they are booleans; if missing or not
boolean, throw or log an error and exit non‑zero so validation fails. Locate the
existing validation flow (e.g. the validatePluginConfig / validateManifest
function in scripts/validate-plugin.mjs) and insert a small check that reads
manifest.openclaw?.release and asserts typeof publishToClawHub === "boolean" and
typeof publishToNpm === "boolean", emitting a clear error message referencing
openclaw.release.publishToClawHub / openclaw.release.publishToNpm when
validation fails.

In `@nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs`:
- Around line 111-123: The validator currently only checks three defaults;
update the logic around manifest.configSchema?.properties (configSchema) to
validate the full expected schema set: ensure required property keys exist,
their schema types match expectations, and their default values/ranges match a
defined spec instead of only checking sessionContext, sessionDigest, and
corpusSupplement; implement a small expectedSpec mapping (property -> {type,
default, optional range}) and iterate over Object.entries(expectedSpec) to call
fail(...) when a property is missing, has the wrong type, or the default/value
is outside the allowed range, reusing the existing fail function for errors.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 06ab83ab-b7b9-4bf0-abaf-f383da678d29

📥 Commits

Reviewing files that changed from the base of the PR and between 60aba83 and 836c9c7.

⛔ Files ignored due to path filters (1)
  • nowledge-mem-openclaw-plugin/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (27)
  • README.md
  • integrations.json
  • nowledge-mem-claude-code-plugin/.claude-plugin/plugin.json
  • nowledge-mem-claude-code-plugin/CHANGELOG.md
  • nowledge-mem-claude-code-plugin/hooks/hooks.json
  • nowledge-mem-codex-prompts/AGENTS.md
  • nowledge-mem-cursor-plugin/.cursor-plugin/plugin.json
  • nowledge-mem-cursor-plugin/CHANGELOG.md
  • nowledge-mem-cursor-plugin/README.md
  • nowledge-mem-cursor-plugin/RELEASING.md
  • nowledge-mem-cursor-plugin/hooks/hooks.json
  • nowledge-mem-cursor-plugin/hooks/session-start.mjs
  • nowledge-mem-cursor-plugin/mcp.json
  • nowledge-mem-cursor-plugin/rules/nowledge-mem.mdc
  • nowledge-mem-cursor-plugin/scripts/validate-plugin.mjs
  • nowledge-mem-cursor-plugin/skills/read-working-memory/SKILL.md
  • nowledge-mem-hermes/CHANGELOG.md
  • nowledge-mem-hermes/README.md
  • nowledge-mem-hermes/RELEASING.md
  • nowledge-mem-hermes/plugin.yaml
  • nowledge-mem-hermes/provider.py
  • nowledge-mem-openclaw-plugin/CHANGELOG.md
  • nowledge-mem-openclaw-plugin/RELEASING.md
  • nowledge-mem-openclaw-plugin/openclaw.plugin.json
  • nowledge-mem-openclaw-plugin/package.json
  • nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs
  • nowledge-mem-openclaw-plugin/src/hooks/behavioral.js
💤 Files with no reviewable changes (1)
  • nowledge-mem-hermes/provider.py

Comment thread nowledge-mem-cursor-plugin/hooks/session-start.mjs
Comment thread nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs
Comment thread nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs
Comment thread integrations.json Outdated
Comment thread nowledge-mem-cursor-plugin/hooks/session-start.mjs Outdated
@wey-gu

wey-gu commented Apr 8, 2026

Copy link
Copy Markdown
Member Author

bugbot run

@wey-gu

wey-gu commented Apr 8, 2026

Copy link
Copy Markdown
Member Author

@codex please review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8f90c5146d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread nowledge-mem-cursor-plugin/hooks/session-start.mjs Outdated
Comment thread integrations.json Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

1 issue from previous review remains unresolved.

Fix All in Cursor

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 8f90c51. Configure here.

@wey-gu

wey-gu commented Apr 8, 2026

Copy link
Copy Markdown
Member Author

bugbot run

@wey-gu

wey-gu commented Apr 8, 2026

Copy link
Copy Markdown
Member Author

@codex please review

Comment thread integrations.json Outdated
Comment thread nowledge-mem-hermes/provider.py

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (3)
nowledge-mem-cursor-plugin/README.md (1)

49-57: Good separation of concerns, minor clarity suggestion.

This section correctly distinguishes between:

  • Cursor MCP settings (for plugin tool calls)
  • Local nmem client config (for terminal-side bootstrap and handoffs)

The nmem config client set commands are accurate and align with the learnings about remote Mem setup.

✨ Minor clarity improvement for line 56

Consider rephrasing line 56 for better clarity:

-Cursor MCP settings cover the plugin's tool calls. The local `nmem` client config covers the terminal-side bootstrap and handoff behaviors. It is separate from server-side remote-access settings on the Mem host.
+Cursor MCP settings cover the plugin's tool calls. The local `nmem` client config covers the terminal-side bootstrap and handoff behaviors. This client-side config is separate from the server-side configuration that governs remote access on the Mem host itself.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@nowledge-mem-cursor-plugin/README.md` around lines 49 - 57, Reword the
sentence that starts "Cursor MCP settings cover the plugin's tool calls..." to
make the separation clearer: state that Cursor MCP settings control only plugin
tool calls (server/plugin-side), while the local `nmem` client config controls
terminal-side bootstrap and handoff behaviors (client-side), and explicitly note
that server-side remote-access settings live on the Mem host and are configured
separately; reference the terms "Cursor MCP settings", "local `nmem` client
config", "sessionStart hook", and "save-handoff skill" so the reader knows which
behaviors each configuration affects.
nowledge-mem-hermes/client.py (1)

177-199: Consider chaining FileNotFoundError with from None.

The static analysis correctly flags that the FileNotFoundError exception should use raise ... from None to avoid misleading exception chains. The JSONDecodeError handling at line 196-199 already does this correctly with from error.

♻️ Proposed fix
         except FileNotFoundError:
-            raise RuntimeError(
+            raise RuntimeError(
                 "nmem CLI not found. Install: pip install nmem-cli, "
                 "or enable CLI in Nowledge Mem: Settings > Developer Tools"
-            )
+            ) from None
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@nowledge-mem-hermes/client.py` around lines 177 - 199, The FileNotFoundError
except block handling the subprocess.run call should suppress the original
exception chain; update the except FileNotFoundError branch that raises
RuntimeError("nmem CLI not found...") to use exception chaining suppression by
raising the RuntimeError from None (i.e., use "raise RuntimeError(...) from
None") so the misleading FileNotFoundError is not shown; locate the block around
the subprocess.run call that references self._timeout and modify that raise
accordingly.
nowledge-mem-hermes/provider.py (1)

380-404: _parse_csv and _normalize_id_list are nearly identical—consider consolidating.

Both methods have the same implementation: handle None, split strings by comma, handle iterables, and convert other types to string. Consider extracting a shared helper or having one call the other.

♻️ Proposed consolidation
     `@staticmethod`
-    def _parse_csv(value: Any) -> Optional[List[str]]:
+    def _normalize_list(value: Any) -> Optional[List[str]]:
+        """Normalize value to a list of trimmed strings, or None if empty."""
         if value is None:
             return None
         if isinstance(value, str):
             return [item.strip() for item in value.split(",") if item.strip()]
         if isinstance(value, (list, tuple, set)):
             parsed = [str(item).strip() for item in value if str(item).strip()]
             return parsed or None
-
         text = str(value).strip()
         return [text] if text else None

+    # Alias for semantic clarity in different contexts
+    _parse_csv = _normalize_list
+    _normalize_id_list = _normalize_list
+
-    `@staticmethod`
-    def _normalize_id_list(value: Any) -> Optional[List[str]]:
-        if value is None:
-            return None
-        if isinstance(value, str):
-            return [item.strip() for item in value.split(",") if item.strip()]
-        if isinstance(value, (list, tuple, set)):
-            parsed = [str(item).strip() for item in value if str(item).strip()]
-            return parsed or None
-
-        text = str(value).strip()
-        return [text] if text else None
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@nowledge-mem-hermes/provider.py` around lines 380 - 404, The two almost
identical methods _parse_csv and _normalize_id_list should be consolidated:
extract a single helper (e.g., _to_str_list or _parse_list_like) that
encapsulates the logic of handling None, splitting strings on commas,
normalizing iterables (list/tuple/set) by str().strip(), and converting other
values to a single-item list or None, then have both _parse_csv and
_normalize_id_list call that helper (or remove one and alias it) to avoid
duplication and ensure consistent behavior across parse/normalize operations.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@nowledge-mem-hermes/provider.py`:
- Line 22: The import from tools.registry (tool_error, tool_result) is invalid;
remove that import and either add local helper functions or use existing error
handling utilities inside provider.py. Specifically, replace the line "from
tools.registry import tool_error, tool_result" with local definitions for
tool_error and tool_result (e.g., small functions that return consistent
dicts/objects or raise/call the module logger) and update any callers in
provider.py (e.g., in the functions that reference tool_error/tool_result) to
use these new local helpers so imports no longer fail. Ensure the new helpers
preserve the expected shape used elsewhere in provider.py.

In `@nowledge-mem-openclaw-plugin/SKILL.md`:
- Around line 108-112: The wording "default resolver path" is ambiguous; update
the SKILL.md section that shows the two install commands
(clawhub:`@nowledge/openclaw-nowledge-mem` and `@nowledge/openclaw-nowledge-mem`) to
either (a) clearly state when to use each form (e.g., explain that "clawhub:" is
needed when using the clawhub resolver and the plain `@nowledge/`... uses the
default resolver), or (b) remove the alternate example if both are equivalent;
specifically edit the paragraph containing the examples "openclaw plugins
install clawhub:`@nowledge/openclaw-nowledge-mem`" and "openclaw plugins install
`@nowledge/openclaw-nowledge-mem`" to include the chosen clarification or removal.

---

Nitpick comments:
In `@nowledge-mem-cursor-plugin/README.md`:
- Around line 49-57: Reword the sentence that starts "Cursor MCP settings cover
the plugin's tool calls..." to make the separation clearer: state that Cursor
MCP settings control only plugin tool calls (server/plugin-side), while the
local `nmem` client config controls terminal-side bootstrap and handoff
behaviors (client-side), and explicitly note that server-side remote-access
settings live on the Mem host and are configured separately; reference the terms
"Cursor MCP settings", "local `nmem` client config", "sessionStart hook", and
"save-handoff skill" so the reader knows which behaviors each configuration
affects.

In `@nowledge-mem-hermes/client.py`:
- Around line 177-199: The FileNotFoundError except block handling the
subprocess.run call should suppress the original exception chain; update the
except FileNotFoundError branch that raises RuntimeError("nmem CLI not
found...") to use exception chaining suppression by raising the RuntimeError
from None (i.e., use "raise RuntimeError(...) from None") so the misleading
FileNotFoundError is not shown; locate the block around the subprocess.run call
that references self._timeout and modify that raise accordingly.

In `@nowledge-mem-hermes/provider.py`:
- Around line 380-404: The two almost identical methods _parse_csv and
_normalize_id_list should be consolidated: extract a single helper (e.g.,
_to_str_list or _parse_list_like) that encapsulates the logic of handling None,
splitting strings on commas, normalizing iterables (list/tuple/set) by
str().strip(), and converting other values to a single-item list or None, then
have both _parse_csv and _normalize_id_list call that helper (or remove one and
alias it) to avoid duplication and ensure consistent behavior across
parse/normalize operations.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 5db3bdaf-c03a-45c0-9c4d-ed724da5a8d4

📥 Commits

Reviewing files that changed from the base of the PR and between 8f90c51 and 2508615.

📒 Files selected for processing (26)
  • .cursor-plugin/marketplace.json
  • README.md
  • integrations.json
  • nowledge-mem-claude-code-plugin/README.md
  • nowledge-mem-claude-code-plugin/commands/status.md
  • nowledge-mem-claude-code-plugin/skills/distill-memory/SKILL.md
  • nowledge-mem-claude-code-plugin/skills/read-working-memory/SKILL.md
  • nowledge-mem-claude-code-plugin/skills/save-thread/SKILL.md
  • nowledge-mem-claude-code-plugin/skills/search-memory/SKILL.md
  • nowledge-mem-cursor-plugin/.cursor-plugin/plugin.json
  • nowledge-mem-cursor-plugin/CHANGELOG.md
  • nowledge-mem-cursor-plugin/README.md
  • nowledge-mem-cursor-plugin/RELEASING.md
  • nowledge-mem-cursor-plugin/hooks/session-start.mjs
  • nowledge-mem-cursor-plugin/scripts/validate-plugin.mjs
  • nowledge-mem-hermes/CHANGELOG.md
  • nowledge-mem-hermes/README.md
  • nowledge-mem-hermes/client.py
  • nowledge-mem-hermes/plugin.yaml
  • nowledge-mem-hermes/provider.py
  • nowledge-mem-npx-skills/skills/check-integration/SKILL.md
  • nowledge-mem-openclaw-plugin/CHANGELOG.md
  • nowledge-mem-openclaw-plugin/README.md
  • nowledge-mem-openclaw-plugin/RELEASING.md
  • nowledge-mem-openclaw-plugin/SKILL.md
  • nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs
✅ Files skipped from review due to trivial changes (15)
  • nowledge-mem-claude-code-plugin/skills/search-memory/SKILL.md
  • nowledge-mem-claude-code-plugin/skills/read-working-memory/SKILL.md
  • nowledge-mem-claude-code-plugin/commands/status.md
  • nowledge-mem-claude-code-plugin/README.md
  • nowledge-mem-hermes/plugin.yaml
  • nowledge-mem-claude-code-plugin/skills/save-thread/SKILL.md
  • .cursor-plugin/marketplace.json
  • README.md
  • nowledge-mem-npx-skills/skills/check-integration/SKILL.md
  • nowledge-mem-openclaw-plugin/CHANGELOG.md
  • nowledge-mem-hermes/CHANGELOG.md
  • nowledge-mem-openclaw-plugin/RELEASING.md
  • nowledge-mem-claude-code-plugin/skills/distill-memory/SKILL.md
  • nowledge-mem-cursor-plugin/.cursor-plugin/plugin.json
  • nowledge-mem-openclaw-plugin/README.md
🚧 Files skipped from review as they are similar to previous changes (7)
  • nowledge-mem-hermes/README.md
  • nowledge-mem-cursor-plugin/scripts/validate-plugin.mjs
  • nowledge-mem-cursor-plugin/hooks/session-start.mjs
  • nowledge-mem-openclaw-plugin/scripts/validate-plugin.mjs
  • nowledge-mem-cursor-plugin/CHANGELOG.md
  • nowledge-mem-cursor-plugin/RELEASING.md
  • integrations.json

Comment thread nowledge-mem-hermes/provider.py Outdated
Comment thread nowledge-mem-openclaw-plugin/SKILL.md Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 25086153ef

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread integrations.json Outdated
Comment thread integrations.json Outdated
@wey-gu

wey-gu commented Apr 8, 2026

Copy link
Copy Markdown
Member Author

bugbot run

@wey-gu

wey-gu commented Apr 8, 2026

Copy link
Copy Markdown
Member Author

@codex please review now

@wey-gu wey-gu changed the title ready for official marketplace submission for clawhub, hermes agent and cursor Prepare OpenClaw, Hermes, and Cursor integrations for release Apr 8, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit f821734. Configure here.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f821734be8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread nowledge-mem-hermes/provider.py Outdated
from typing import Any, Dict, List, Optional

from agent.memory_provider import MemoryProvider
from tools.registry import tool_error, tool_result

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Restore compatibility with released Hermes registry APIs

Importing tool_error and tool_result at module load time makes this provider fail to import on Hermes releases where tools.registry does not export those helpers (for example, upstream v2026.3.28 only exposes registry). That turns provider startup into an immediate ImportError, so the plugin cannot load at all despite the package claiming Hermes v0.7.0+ support. Please gate this import or fall back to local JSON serialization so older supported Hermes versions still work.

Useful? React with 👍 / 👎.

@wey-gu wey-gu merged commit 259468f into main Apr 8, 2026
1 check passed
@wey-gu wey-gu deleted the dev_0619 branch April 8, 2026 16:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant