wyrm-mcp 8.7.1 → 8.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/setup.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{existsSync as w,readFileSync as W}from"node:fs";import{homedir as b}from"node:os";import{join as A}from"node:path";import{detectClients as I,autoConfigureAll as j,removeFromAll as z,configureSpecific as N,reconfAll as B,getStatusSummary as D,findWyrmServerPath as L,getDefaultDbPath as x,loadWyrmMeta as O,exportServerConfig as _}from"./autoconfig.js";import{c as o,icons as g,BANNER as F,MINI_BANNER as f,printSuccess as T,printError as R,printWarning as U,printSection as d}from"./cli.js";import{runWizard as H}from"./setup-wizard.js";function Y(n){const e=n.slice(2);if(e.length===0)return{command:"auto"};const s={command:"auto"};for(let l=0;l<e.length;l++)switch(e[l]){case"--check":case"-c":case"check":case"status":s.command="check";break;case"--remove":case"-r":case"remove":case"uninstall":s.command="remove";break;case"--only":case"-o":case"only":s.command="only",e[l+1]&&(s.clientIds=e[l+1].split(",").map(t=>t.trim()),l++);break;case"--reconf":case"--reconfigure":case"reconf":s.command="reconf";break;case"--list":case"-l":case"list":s.command="list";break;case"--export":case"export":{s.command="export";const t=e[l+1];(t==="stdio"||t==="vscode"||t==="mcp-json")&&(s.exportFormat=t,l++);break}case"--server":case"-s":e[l+1]&&(s.serverPath=e[l+1],l++);break;case"--db":case"-d":e[l+1]&&(s.dbPath=e[l+1],l++);break;case"--wizard":case"wizard":s.command="wizard";break;case"--no-wizard":case"--plain":s.noWizard=!0;break;case"--no-model":s.noModel=!0;break;case"--help":case"-h":case"help":s.command="help";break}return s}function k(n){console.log("");const e=n.filter(c=>c.action==="configured"),s=n.filter(c=>c.action==="updated"),l=n.filter(c=>c.action==="skipped"),t=n.filter(c=>c.action==="failed");for(const c of e)console.log(` ${g.success} ${c.client.icon} ${o.green(c.client.name)} \u2014 ${o.success("configured")}`),c.backup&&console.log(` ${o.dim(`backup \u2192 ${c.backup}`)}`);for(const c of s)console.log(` ${g.sync} ${c.client.icon} ${o.blue(c.client.name)} \u2014 ${o.cyan("updated")}`),c.backup&&console.log(` ${o.dim(`backup \u2192 ${c.backup}`)}`);for(const c of l)console.log(` ${o.dim(` \u25CB ${c.client.icon} ${c.client.name} \u2014 ${c.message}`)}`);for(const c of t)console.log(` ${g.error} ${c.client.icon} ${o.red(c.client.name)} \u2014 ${o.error(c.message)}`);console.log("");const p=e.length+s.length;p>0?(console.log(` ${o.success(`${g.dragon} Wyrm connected to ${p} AI client(s)`)}`),console.log(` ${o.dim("Switch AIs anytime \u2014 run wyrm-setup again to reconnect")}`)):t.length>0?console.log(` ${o.error("Some configurations failed. Check errors above.")}`):console.log(` ${o.dim("No AI clients detected. Install one and try again.")}`),console.log("")}function J(n){return n.split(b()).join("~")}async function v(n,e){const{bundledModelPresent:s,downloadBundledModel:l,BUNDLED_MODEL_SIZE_LABEL:t}=await import("./providers/bundled-model.js"),{resolveEmbeddingState:p,tierForResolution:c}=await import("./providers/embedding-provider.js");if(d("Enabling meaning-based search"),s())console.log(o.dim(" Local embedding model already present."));else if(n)console.log(o.dim(" Skipped (--no-model). Recall is keyword-only until: wyrm vectors download"));else{console.log(o.dim(` Downloading nomic-embed-text-v1.5 (${t}, Apache-2.0, from huggingface.co with models.ghosts.lk as fallback). Skip with --no-model.`));let r=-1;const C=await l({onProgress:($,M,E)=>{const y=Math.floor(M/E*100);y!==r&&(r=y,process.stdout.write(`\r ${$}: ${y}% `))}});if(process.stdout.write(`
3
- `),C.ok){T(`Meaning-based search is on (${t}, local, no account).`);const{runBundledBackfill:$}=await import("./reindex.js");await $()}else U(`Could not download the model (${C.error}).`),console.log(o.dim(" Keyword search works fine meanwhile. Retry later: wyrm vectors download"))}d("Health check");const u=p(),i=c(u);console.log(` ${u.resolved!=="none"?"\u2714":"\u25CB"} search: ${i.label} (${u.resolved}${u.model?` \xB7 ${u.model}`:""})`);const P=x();console.log(w(P)?` \u2714 memory file: ${J(P)}`:" \u25CB memory file: created on first run");const a=e.find(r=>r.client.id==="claude-code-hooks");let m;if(a&&(a.action==="configured"||a.action==="updated"))m=!0,console.log(` \u2714 auto-memory hooks: ${a.action==="updated"?"updated":"installed"}`);else if(a&&a.action==="skipped"&&a.client.configured)m=!0,console.log(` \u2714 auto-memory hooks: ${a.message}`);else if(a)m=!1,console.log(` \u25CB auto-memory hooks: ${a.message}`);else{const r=A(b(),".claude","hooks","wyrm-session-capture.mjs");m=w(r),console.log(m?" \u2714 auto-memory hooks: already installed":" \u25CB auto-memory hooks: not installed by this command")}const S=e.find(r=>r.client.id==="claude-code-guard");let h;if(S)h=S.client.configured===!0;else{const r=A(b(),".claude","settings.json");try{h=w(r)&&/wyrm-guard/.test(W(r,"utf-8"))}catch{h=!1}}d("What happens automatically now"),console.log(m?" \u2022 Every session is captured to memory when it ends.":" \u2022 On this client, the model handles capture per server instructions."),console.log(m?" \u2022 Every new session starts with your context restored.":" \u2022 Each session starts by priming from memory (the model calls wyrm_session_prime first)."),console.log(h?" \u2022 The failure firewall blocks repeats of recorded mistakes. Always on.":" \u2022 The failure firewall arms once hooks are installed."),console.log(` \u2022 Something off? ${o.cyan("wyrm doctor")} fails loudly with the exact fix; ${o.cyan("wyrm report")} is the shareable diagnostic.`),console.log(""),console.log(i.n>=3?`Search: tier ${i.n}/3 (${i.label}).`:i.n===2?`Search: tier ${i.n}/3 (${i.label}). ${o.cyan("wyrm upgrade")} \u2192 max recall.`:`Search: tier ${i.n}/3 (${i.label}). ${o.cyan("wyrm vectors download")} \u2192 local vectors (free, no account); then ${o.cyan("wyrm upgrade")} \u2192 max recall.`)}function K(){console.log(f()),console.log(""),console.log(`${o.bold("Usage:")} wyrm-setup ${o.dim("[command] [options]")}`),console.log(""),console.log(`${o.bold("Commands:")}`),console.log(` ${o.cyan("(no args)")} Auto-detect and configure all AI clients`),console.log(` ${o.cyan("check")} Show current configuration status`),console.log(` ${o.cyan("list")} List all supported AI clients`),console.log(` ${o.cyan("remove")} Remove Wyrm from all AI clients`),console.log(` ${o.cyan("reconf")} Re-configure previously configured clients`),console.log(` ${o.cyan("only X,Y")} Configure specific clients only`),console.log(` ${o.cyan("export [fmt]")} Print a portable config (fmt: mcp-json|vscode|stdio) for any MCP host`),console.log(` ${o.cyan("help")} Show this help message`),console.log(""),console.log(`${o.bold("Options:")}`),console.log(` ${o.cyan("--server P")} Override Wyrm MCP server path`),console.log(` ${o.cyan("--db P")} Override Wyrm database path`),console.log(` ${o.cyan("--no-model")} Skip the one-time local embedding model download (~137 MB); recall stays keyword-only`),console.log(` ${o.cyan("--plain")} Non-interactive flag flow (no wizard) \u2014 the default when not on a TTY`),console.log(""),console.log(`${o.bold("Client IDs:")}`);const n=I();for(const e of n)console.log(` ${e.icon} ${o.cyan(e.id.padEnd(18))} ${e.name}`);console.log(""),console.log(`${o.bold("Examples:")}`),console.log(` wyrm-setup ${o.dim("# Auto-configure everything")}`),console.log(` wyrm-setup check ${o.dim("# See what's configured")}`),console.log(` wyrm-setup only vscode-copilot,cursor ${o.dim("# Only VS Code + Cursor")}`),console.log(` wyrm-setup --server /path/to/wyrm/dist/index.js ${o.dim("# Custom server path")}`),console.log(` wyrm-setup remove ${o.dim("# Remove from all clients")}`),console.log(` wyrm-setup export stdio > wyrm.json ${o.dim("# Portable config for any MCP host")}`),console.log("")}function V(){console.log(f()),console.log(""),d("Supported AI Clients"),console.log("");const n=I();for(const e of n){const s=e.detected?e.configured?o.success("\u25CF connected"):o.yellow("\u25D0 available"):o.dim("\u25CB not found"),l=e.version?` ${o.dim(`v${e.version}`)}`:"";console.log(` ${e.icon} ${o.bold(e.name.padEnd(20))} ${o.cyan(e.id.padEnd(18))} ${s}${l}`),console.log(` ${o.dim(`Config: ${e.configPath}`)}`)}console.log("")}async function X(){const n=Y(process.argv);if(n.command==="wizard"||n.command==="auto"&&!n.noWizard){const e=await H({serverPath:n.serverPath,dbPath:n.dbPath});if(e===!1)n.command==="wizard"&&(n.command="auto");else if(e===null){console.log(o.dim("Setup aborted, nothing changed."));return}else{await v(n.noModel??!1,e);return}}switch(n.command){case"help":K();break;case"check":{console.log(f()),console.log(""),console.log(D());break}case"list":V();break;case"auto":{console.log(F()),d("Auto-Configure"),console.log("");const e=n.serverPath||L(),s=n.dbPath||x();console.log(` ${g.sword} Server: ${o.cyan(e)}`),console.log(` ${g.treasure} DB: ${o.cyan(s)}`),console.log(""),console.log(` ${o.dim("Scanning for AI clients...")}`);const l=j({serverPath:e,dbPath:s});k(l),await v(n.noModel??!1,l);break}case"only":{(!n.clientIds||n.clientIds.length===0)&&(R("No client IDs specified. Use: wyrm-setup only vscode-copilot,cursor"),process.exit(1)),console.log(f()),d(`Configure: ${n.clientIds.join(", ")}`);const e=N(n.clientIds,{serverPath:n.serverPath,dbPath:n.dbPath});k(e),await v(n.noModel??!1,e);break}case"remove":{console.log(f()),d("Remove Wyrm from AI Clients"),console.log(""),console.log(` ${o.warning("Removing Wyrm configuration from all AI clients...")}`);const e=z(),s=e.filter(t=>t.action==="configured"),l=e.filter(t=>t.action==="skipped");for(const t of s)console.log(` ${g.check} ${t.client.icon} ${t.client.name} \u2014 removed`),t.backup&&console.log(` ${o.dim(`backup \u2192 ${t.backup}`)}`);for(const t of l)console.log(` ${o.dim(` \u25CB ${t.client.icon} ${t.client.name} \u2014 ${t.message}`)}`);console.log(""),s.length>0&&console.log(` ${o.success(`Removed from ${s.length} client(s). Run wyrm-setup to reconnect.`)}`),console.log("");break}case"reconf":{console.log(f()),d("Re-Configure");const e=O();console.log(e?` ${o.dim(`Restoring config for: ${e.configuredClients.join(", ")}`)}`:` ${o.dim("No previous config found \u2014 running full auto-configure")}`);const s=B();k(s);break}case"export":{const e=n.exportFormat??"mcp-json",s=_(e,{serverPath:n.serverPath,dbPath:n.dbPath});process.stderr.write(`${o.dim(`# Wyrm MCP config (${e}). Paste into any MCP-compatible host.`)}
2
+ import{existsSync as w,readFileSync as D}from"node:fs";import{BUNDLED_MODEL_SIZE_LABEL as L}from"./providers/bundled-model.js";import{homedir as b}from"node:os";import{join as A}from"node:path";import{detectClients as E,autoConfigureAll as N,removeFromAll as W,configureSpecific as _,reconfAll as B,getStatusSummary as j,findWyrmServerPath as z,getDefaultDbPath as I,loadWyrmMeta as O,exportServerConfig as F}from"./autoconfig.js";import{c as o,icons as g,BANNER as U,MINI_BANNER as f,printSuccess as T,printError as x,printWarning as Y,printSection as d}from"./cli.js";import{runWizard as Z}from"./setup-wizard.js";function H(n){const e=n.slice(2);if(e.length===0)return{command:"auto"};const s={command:"auto"};for(let l=0;l<e.length;l++)switch(e[l]){case"--check":case"-c":case"check":case"status":s.command="check";break;case"--remove":case"-r":case"remove":case"uninstall":s.command="remove";break;case"--only":case"-o":case"only":s.command="only",e[l+1]&&(s.clientIds=e[l+1].split(",").map(t=>t.trim()),l++);break;case"--reconf":case"--reconfigure":case"reconf":s.command="reconf";break;case"--list":case"-l":case"list":s.command="list";break;case"--export":case"export":{s.command="export";const t=e[l+1];(t==="stdio"||t==="vscode"||t==="mcp-json")&&(s.exportFormat=t,l++);break}case"--server":case"-s":e[l+1]&&(s.serverPath=e[l+1],l++);break;case"--db":case"-d":e[l+1]&&(s.dbPath=e[l+1],l++);break;case"--wizard":case"wizard":s.command="wizard";break;case"--no-wizard":case"--plain":s.noWizard=!0;break;case"--no-model":s.noModel=!0;break;case"--help":case"-h":case"help":s.command="help";break}return s}function k(n){console.log("");const e=n.filter(c=>c.action==="configured"),s=n.filter(c=>c.action==="updated"),l=n.filter(c=>c.action==="skipped"),t=n.filter(c=>c.action==="failed");for(const c of e)console.log(` ${g.success} ${c.client.icon} ${o.green(c.client.name)} \u2014 ${o.success("configured")}`),c.backup&&console.log(` ${o.dim(`backup \u2192 ${c.backup}`)}`);for(const c of s)console.log(` ${g.sync} ${c.client.icon} ${o.blue(c.client.name)} \u2014 ${o.cyan("updated")}`),c.backup&&console.log(` ${o.dim(`backup \u2192 ${c.backup}`)}`);for(const c of l)console.log(` ${o.dim(` \u25CB ${c.client.icon} ${c.client.name} \u2014 ${c.message}`)}`);for(const c of t)console.log(` ${g.error} ${c.client.icon} ${o.red(c.client.name)} \u2014 ${o.error(c.message)}`);console.log("");const p=e.length+s.length;p>0?(console.log(` ${o.success(`${g.dragon} Wyrm connected to ${p} AI client(s)`)}`),console.log(` ${o.dim("Switch AIs anytime \u2014 run wyrm-setup again to reconnect")}`)):t.length>0?console.log(` ${o.error("Some configurations failed. Check errors above.")}`):console.log(` ${o.dim("No AI clients detected. Install one and try again.")}`),console.log("")}function J(n){return n.split(b()).join("~")}async function v(n,e){const{bundledModelPresent:s,downloadBundledModel:l,BUNDLED_MODEL_SIZE_LABEL:t}=await import("./providers/bundled-model.js"),{resolveEmbeddingState:p,tierForResolution:c}=await import("./providers/embedding-provider.js");if(d("Enabling meaning-based search"),s())console.log(o.dim(" Local embedding model already present."));else if(n)console.log(o.dim(" Skipped (--no-model). Recall is keyword-only until: wyrm vectors download"));else{console.log(o.dim(` Downloading nomic-embed-text-v1.5 (${t}, Apache-2.0, from huggingface.co with models.ghosts.lk as fallback). Skip with --no-model.`));let r=-1;const C=await l({onProgress:($,M,R)=>{const y=Math.floor(M/R*100);y!==r&&(r=y,process.stdout.write(`\r ${$}: ${y}% `))}});if(process.stdout.write(`
3
+ `),C.ok){T(`Meaning-based search is on (${t}, local, no account).`);const{runBundledBackfill:$}=await import("./reindex.js");await $()}else Y(`Could not download the model (${C.error}).`),console.log(o.dim(" Keyword search works fine meanwhile. Retry later: wyrm vectors download"))}d("Health check");const u=p(),i=c(u);console.log(` ${u.resolved!=="none"?"\u2714":"\u25CB"} search: ${i.label} (${u.resolved}${u.model?` \xB7 ${u.model}`:""})`);const P=I();console.log(w(P)?` \u2714 memory file: ${J(P)}`:" \u25CB memory file: created on first run");const a=e.find(r=>r.client.id==="claude-code-hooks");let m;if(a&&(a.action==="configured"||a.action==="updated"))m=!0,console.log(` \u2714 auto-memory hooks: ${a.action==="updated"?"updated":"installed"}`);else if(a&&a.action==="skipped"&&a.client.configured)m=!0,console.log(` \u2714 auto-memory hooks: ${a.message}`);else if(a)m=!1,console.log(` \u25CB auto-memory hooks: ${a.message}`);else{const r=A(b(),".claude","hooks","wyrm-session-capture.mjs");m=w(r),console.log(m?" \u2714 auto-memory hooks: already installed":" \u25CB auto-memory hooks: not installed by this command")}const S=e.find(r=>r.client.id==="claude-code-guard");let h;if(S)h=S.client.configured===!0;else{const r=A(b(),".claude","settings.json");try{h=w(r)&&/wyrm-guard/.test(D(r,"utf-8"))}catch{h=!1}}d("What happens automatically now"),console.log(m?" \u2022 Every session is captured to memory when it ends.":" \u2022 On this client, the model handles capture per server instructions."),console.log(m?" \u2022 Every new session starts with your context restored.":" \u2022 Each session starts by priming from memory (the model calls wyrm_session_prime first)."),console.log(h?" \u2022 The failure firewall blocks repeats of recorded mistakes. Always on.":" \u2022 The failure firewall arms once hooks are installed."),console.log(` \u2022 Something off? ${o.cyan("wyrm doctor")} fails loudly with the exact fix; ${o.cyan("wyrm report")} is the shareable diagnostic.`),console.log(""),console.log(i.n>=3?`Search: tier ${i.n}/3 (${i.label}).`:i.n===2?`Search: tier ${i.n}/3 (${i.label}). ${o.cyan("wyrm upgrade")} \u2192 max recall.`:`Search: tier ${i.n}/3 (${i.label}). ${o.cyan("wyrm vectors download")} \u2192 local vectors (free, no account); then ${o.cyan("wyrm upgrade")} \u2192 max recall.`)}function K(){console.log(f()),console.log(""),console.log(`${o.bold("Usage:")} wyrm-setup ${o.dim("[command] [options]")}`),console.log(""),console.log(`${o.bold("Commands:")}`),console.log(` ${o.cyan("(no args)")} Auto-detect and configure all AI clients`),console.log(` ${o.cyan("check")} Show current configuration status`),console.log(` ${o.cyan("list")} List all supported AI clients`),console.log(` ${o.cyan("remove")} Remove Wyrm from all AI clients`),console.log(` ${o.cyan("reconf")} Re-configure previously configured clients`),console.log(` ${o.cyan("only X,Y")} Configure specific clients only`),console.log(` ${o.cyan("export [fmt]")} Print a portable config (fmt: mcp-json|vscode|stdio) for any MCP host`),console.log(` ${o.cyan("help")} Show this help message`),console.log(""),console.log(`${o.bold("Options:")}`),console.log(` ${o.cyan("--server P")} Override Wyrm MCP server path`),console.log(` ${o.cyan("--db P")} Override Wyrm database path`),console.log(` ${o.cyan("--no-model")} Skip the one-time local embedding model download (${L}); recall stays keyword-only`),console.log(` ${o.cyan("--plain")} Non-interactive flag flow (no wizard) \u2014 the default when not on a TTY`),console.log(""),console.log(`${o.bold("Client IDs:")}`);const n=E();for(const e of n)console.log(` ${e.icon} ${o.cyan(e.id.padEnd(18))} ${e.name}`);console.log(""),console.log(`${o.bold("Examples:")}`),console.log(` wyrm-setup ${o.dim("# Auto-configure everything")}`),console.log(` wyrm-setup check ${o.dim("# See what's configured")}`),console.log(` wyrm-setup only vscode-copilot,cursor ${o.dim("# Only VS Code + Cursor")}`),console.log(` wyrm-setup --server /path/to/wyrm/dist/index.js ${o.dim("# Custom server path")}`),console.log(` wyrm-setup remove ${o.dim("# Remove from all clients")}`),console.log(` wyrm-setup export stdio > wyrm.json ${o.dim("# Portable config for any MCP host")}`),console.log("")}function V(){console.log(f()),console.log(""),d("Supported AI Clients"),console.log("");const n=E();for(const e of n){const s=e.detected?e.configured?o.success("\u25CF connected"):o.yellow("\u25D0 available"):o.dim("\u25CB not found"),l=e.version?` ${o.dim(`v${e.version}`)}`:"";console.log(` ${e.icon} ${o.bold(e.name.padEnd(20))} ${o.cyan(e.id.padEnd(18))} ${s}${l}`),console.log(` ${o.dim(`Config: ${e.configPath}`)}`)}console.log("")}async function X(){const n=H(process.argv);if(n.command==="wizard"||n.command==="auto"&&!n.noWizard){const e=await Z({serverPath:n.serverPath,dbPath:n.dbPath});if(e===!1)n.command==="wizard"&&(n.command="auto");else if(e===null){console.log(o.dim("Setup aborted, nothing changed."));return}else{await v(n.noModel??!1,e);return}}switch(n.command){case"help":K();break;case"check":{console.log(f()),console.log(""),console.log(j());break}case"list":V();break;case"auto":{console.log(U()),d("Auto-Configure"),console.log("");const e=n.serverPath||z(),s=n.dbPath||I();console.log(` ${g.sword} Server: ${o.cyan(e)}`),console.log(` ${g.treasure} DB: ${o.cyan(s)}`),console.log(""),console.log(` ${o.dim("Scanning for AI clients...")}`);const l=N({serverPath:e,dbPath:s});k(l),await v(n.noModel??!1,l);break}case"only":{(!n.clientIds||n.clientIds.length===0)&&(x("No client IDs specified. Use: wyrm-setup only vscode-copilot,cursor"),process.exit(1)),console.log(f()),d(`Configure: ${n.clientIds.join(", ")}`);const e=_(n.clientIds,{serverPath:n.serverPath,dbPath:n.dbPath});k(e),await v(n.noModel??!1,e);break}case"remove":{console.log(f()),d("Remove Wyrm from AI Clients"),console.log(""),console.log(` ${o.warning("Removing Wyrm configuration from all AI clients...")}`);const e=W(),s=e.filter(t=>t.action==="configured"),l=e.filter(t=>t.action==="skipped");for(const t of s)console.log(` ${g.check} ${t.client.icon} ${t.client.name} \u2014 removed`),t.backup&&console.log(` ${o.dim(`backup \u2192 ${t.backup}`)}`);for(const t of l)console.log(` ${o.dim(` \u25CB ${t.client.icon} ${t.client.name} \u2014 ${t.message}`)}`);console.log(""),s.length>0&&console.log(` ${o.success(`Removed from ${s.length} client(s). Run wyrm-setup to reconnect.`)}`),console.log("");break}case"reconf":{console.log(f()),d("Re-Configure");const e=O();console.log(e?` ${o.dim(`Restoring config for: ${e.configuredClients.join(", ")}`)}`:` ${o.dim("No previous config found \u2014 running full auto-configure")}`);const s=B();k(s);break}case"export":{const e=n.exportFormat??"mcp-json",s=F(e,{serverPath:n.serverPath,dbPath:n.dbPath});process.stderr.write(`${o.dim(`# Wyrm MCP config (${e}). Paste into any MCP-compatible host.`)}
4
4
  `),process.stdout.write(JSON.stringify(s,null,2)+`
5
- `);break}}}X().catch(n=>{R(`Setup failed: ${n}`),process.exit(1)});
5
+ `);break}}}X().catch(n=>{x(`Setup failed: ${n}`),process.exit(1)});
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "contract": "wyrm-cloud-memory-v2",
3
- "version": "8.7.1",
3
+ "version": "8.7.2",
4
4
  "derivedFrom": "standard tier MINUS device-local/egress/subprocess (src/cloud-profile.ts)",
5
5
  "count": 20,
6
6
  "tools": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "contract": "wyrm-cloud-memory-v1",
3
- "version": "8.7.1",
3
+ "version": "8.7.2",
4
4
  "tools": [
5
5
  {
6
6
  "name": "wyrm_recall",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "contract": "wyrm-cloud-memory-v1",
3
- "version": "8.7.1",
3
+ "version": "8.7.2",
4
4
  "generatedBy": "scripts/gen-tool-manifest.mjs (from the dist/ registry modules — never hand-edited)",
5
5
  "tiers": {
6
6
  "core": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wyrm-mcp",
3
- "version": "8.7.1",
3
+ "version": "8.7.2",
4
4
  "mcpName": "lk.ghosts/wyrm",
5
5
  "description": "Local-first persistent memory for AI agents over MCP. Ground truths, negative learning (recorded failures block repeats), decision causality, hybrid recall, negotiated recall (clean-mode injection you steer), live memory streams, run-attributed fleet memory — a structured SQLite memory on your machine, no cloud or LLM required. Claude / Copilot / Cursor / Windsurf / Codex.",
6
6
  "type": "module",