From agent
Configures agent settings — memory backend (builtin/QMD), search mode, temporal decay, citations. Invoked via /agent:settings or user phrases.
How this skill is triggered — by the user, by Claude, or both
Slash command
/agent:settingsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
View and modify the agent's configuration stored in `agent-config.json`.
View and modify the agent's configuration stored in agent-config.json.
If no argument given, read and display agent-config.json:
cat ${CLAUDE_PLUGIN_ROOT}/agent-config.json 2>/dev/null || echo '(no config — using defaults)'
Show defaults:
builtin or qmdbuiltin (default):
qmd (enhanced):
qmd binary installedCheck if qmd is installed:
qmd --version 2>/dev/null && echo "QMD available" || echo "QMD not found"
If not installed, guide the user:
Install QMD (local-first search tool, no API keys needed):
bun install -g qmd
# or download from https://github.com/tobi/qmd/releases
Configure the backend:
Write agent-config.json via Bash (NOT the Write tool — agent-config.json is on the always-on protected-paths list; direct Write is refused with exec-gate: write to protected path refused (workspace-agent-config)).
Step 3a — Read current config with the Read tool: Read("agent-config.json"). If it doesn't exist, treat as {}.
Step 3b — Merge in-memory in your reasoning: take the existing object, replace the memory key with the QMD block:
{
"memory": {
"backend": "qmd",
"citations": "auto",
"qmd": {
"searchMode": "vsearch",
"includeDefaultMemory": true,
"limits": { "maxResults": 6, "timeoutMs": 15000 }
}
}
}
Preserve every other top-level key from the existing config.
Step 3c — Write the full merged object via Bash heredoc with validate + atomic mv (substitute <FULL_MERGED_JSON> with the JSON literal from your reasoning):
Bash('cat > agent-config.json.tmp << "JSON_EOF" &&
<FULL_MERGED_JSON>
JSON_EOF
node -e \'JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"))\' agent-config.json.tmp \
&& mv agent-config.json.tmp agent-config.json \
&& echo "wrote agent-config.json" \
|| { rm -f agent-config.json.tmp; echo "ABORTED: invalid JSON or filesystem error"; exit 1; }')
The user gets ONE Bash permission prompt. By design — agent-config.json controls security-sensitive settings, so writes go through deliberate user consent. The "JSON_EOF" (double-quoted delimiter) form disables shell expansion inside the body, so any literal $ or backtick in the JSON stays untouched. cat > ... << "JSON_EOF" && puts the heredoc write itself in the && chain so a cat failure short-circuits the rest (otherwise a cat that fails to open the tmp file would leave any pre-existing tmp content intact, node would validate stale content, and mv would clobber the destination with old data). The node -e 'JSON.parse(...)' step rejects malformed JSON before the atomic mv — your existing config can never be clobbered by a truncated or syntactically broken write.
If qmd is in a non-standard path, set the command:
"qmd": {
"command": "/path/to/qmd",
...
}
Reload the MCP server:
/mcp
| Mode | Description | Speed | Quality |
|---|---|---|---|
search | Basic vector + BM25 hybrid | Fast | Good |
vsearch | Vector search with reranking | Medium | Excellent |
query | Full query expansion + rerank | Slow | Best |
Default: vsearch (recommended).
Controls how dated files (memory/YYYY-MM-DD.md) lose relevance over time:
halfLifeDays: 30 — a 30-day-old file scores at 50% of a today's filetemporalDecay: false to disableauto — show citations in direct chats, suppress in groupson — always showoff — never showTo change a setting:
agent-config.json with the Read tool (or treat as {} if it doesn't exist).Write tool — agent-config.json is on the always-on protected-paths list; direct Write is refused). Substitute <FULL_UPDATED_JSON> with your computed object:
Bash('cat > agent-config.json.tmp << "JSON_EOF" &&
<FULL_UPDATED_JSON>
JSON_EOF
node -e \'JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"))\' agent-config.json.tmp \
&& mv agent-config.json.tmp agent-config.json \
&& echo "wrote agent-config.json" \
|| { rm -f agent-config.json.tmp; echo "ABORTED: invalid JSON or filesystem error"; exit 1; }')
The double-quoted "JSON_EOF" delimiter disables shell expansion in the body — JSON literals pass through verbatim, no escaping needed. cat > ... << "JSON_EOF" && puts the heredoc write itself in the && chain so a cat failure short-circuits the rest. The node -e 'JSON.parse(...)' step rejects malformed JSON BEFORE the atomic mv, so a truncated or syntactically broken write can never clobber your config./mcp to apply.Restrict heartbeat to the user's active window:
{
"heartbeat": {
"schedule": "*/30 * * * *",
"activeHours": {
"start": "08:00",
"end": "23:00",
"timezone": "America/Santiago"
}
}
}
Outside these hours, the heartbeat cron still fires but the agent should skip silently.
{
"dreaming": {
"schedule": "0 3 * * *",
"timezone": "America/Santiago"
}
}
The HTTP bridge is an optional local server that exposes the agent over HTTP — for webhooks, status checks, and a browser-based chat UI (WebChat).
Off by default. Enable with:
{
"http": {
"enabled": true,
"port": 18790,
"host": "127.0.0.1",
"token": ""
}
}
Settings:
enabled — turn the server on/off (default: false)port — port to listen on (default: 18790)host — bind address (default: 127.0.0.1 — localhost only; change only if you know what you're doing)token — Bearer token for authenticated endpoints. Empty = no auth (fine for localhost-only). Set a value when exposing via tunnel (ngrok, Cloudflare, Tailscale)./mcp to reload.http://localhost:18790 in a browser.Endpoints exposed when http.enabled: true:
GET / — WebChat UIGET /health — liveness (no auth)GET /v1/status — agent statusGET /v1/skills — installed skillsPOST /v1/webhook — ingest webhooksGET /v1/webhooks — drain webhook queuePOST /v1/chat/send — send a chat messageGET /v1/chat/history — chat historyGET /v1/chat/stream — real-time replies (SSE)To turn WebChat off without losing other HTTP features, just close the browser tab. To turn the whole bridge off, set http.enabled: false and run /mcp.
Bind to 127.0.0.1 unless you know your network is safe. If you must expose the port (LAN, tunnel), always set a token — otherwise anyone who can reach the port can chat as you.
scope.*) — secondary access pointThe full UX for channel-scope is /agent:scope wizard (interactive). /agent:settings provides a read-only secondary view of the current scope.* config and pointers to the wizard for changes.
To inspect:
node -e "const c=JSON.parse(require('fs').readFileSync('agent-config.json','utf-8'));console.log(JSON.stringify(c.scope||{},null,2));"
Display each configured channel:
mode: off (default — no filter) / shadow (log only) / enforce (filter)identity: auto (default ceiling) / owner (sees all — requires out-of-band trust file) / guest (sees nothing channel-derived)background.identity: deny (default — dreams don't see scoped chunks) / system-owner (dreams see as owner)Cannot modify scope. via agent_config(action='set')* — any key starting with scope. is on the security-sensitive blocklist. Use /agent:scope wizard or /agent:scope enable <channel> [shadow|enforce] instead — those routes go through Bash so the user gets a permission prompt for every scope-policy change.
Full feature description: docs/channel-scope-compat.md · PRIVACY.md#channel-scope-per-channel-opt-in.
/mcp to reloadscope.*) keys are read-only via agent_config — use /agent:scope wizard for any changes (security-sensitive blocklist routes scope-policy changes through Bash for explicit user consent)npx claudepluginhub crisandrews/clawcode --plugin agentCross-host durable memory for AI agents using the ling-mem CLI. Maintains a three-tier model of who the user is across sessions and hosts (Claude Code, Codex, OpenClaw).
Runs diagnostic checks on agent workspace: config, identity, memory, SQLite index, crons, hooks, HTTP bridge, messaging plugins, and dreaming. Supports --fix for safe auto-repairs. Use after agent create/import or when something feels off.
Guides bootstrapping, updating, and reviewing AGENTS.md for effective agent memory: structure sections, signal vs noise filtering, prune stale entries.