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 agentMakes Claude Code agents proactive: anticipates needs, retains memory across context windows, self-heals, and stays aligned through security hardening and reverse prompting.
Manages AI agent memory stores on the GreenNode AgentBase platform — conversation history, semantic fact extraction, and long-term memory records with LangChain/LangGraph integration.
Scaffold an autonomous AI agent into the user's project. The agent runs on Render Background Worker, uses Anthropic Claude (Sonnet 4.6 by default) with prompt caching, has tools (http-fetch, send-email, db-query by default; more added based on the agent's job), optional Postgres KV memory, a daily/monthly cost circuit breaker (default 5 USD/day, 50 USD/month - kills runs over budget and emails the admin), and persists every invocation + every loop turn to Postgres for full traceability. Use this when the user wants an LLM-driven process that is part of the PRODUCT (serves the app or its end users), decides actions, uses tools, and optionally has memory - distinct from /add-automation which handles non-AI background processing. When the mission is actually a personal recurring task for the OPERATOR (a brief, a watch, a weekly analysis for themselves) at a cadence of 1 hour or more, the discovery short-circuits to the much lighter _create-routine (a Claude routine on the user's own account, zero infrastructure). Discovery phase asks ~5 questions about the agent's job (goal, trigger, memory needs, model, budget) then runs setup-agent.mjs to scaffold and deploy. NOT for chatbots (real-time per-user UI agents) - those need a dedicated /add-chatbot skill (not yet built). Suitable for: continuous background agents (email surveillance, monitoring), cron-driven product agents, and on-demand agents (triggered manually from a dashboard).