memoryai-claude 0.1.4 → 0.1.5
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/cli.js +14 -14
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var l=require("node:fs"),g=require("node:path"),ne=require("node:os");var G=require("node:readline/promises"),A=require("node:process");async function w(e,o){let t=(0,G.createInterface)({input:A.stdin,output:A.stdout});try{let n=o?` [${o}]`:"";return(await t.question(`${e}${n}: `)).trim()||o||""}finally{t.close()}}async function
|
|
3
|
-
`,"utf-8"),J(e,384)}function T(e){if(!(0,f.existsSync)(e))return null;let o=new Date().toISOString().replace(/[:.]/g,"-"),t=`${e}.bak-${o}`;return(0,f.copyFileSync)(e,t),J(t,384),t}var ae="/v1/hooks/claude/",le="memoryai/session-start-runner";function H(e,o,t){return{type:"http",url:e,timeout:t,headers:{Authorization:`Bearer ${o}`},allowedEnvVars:[]}}function Y(e,o,t){return{type:"command",command:e,args:[o],timeout:t}}function V(e){if(!e)return!1;if(typeof e.url=="string"&&e.url.includes(ae))return!0;if(typeof e.command=="string"){let o=Array.isArray(e.args)?e.args.join(" "):"",t=`${e.command} ${o}`;if(t.includes(le)||t.includes("session-start-runner"))return!0}return!1}function z(e){return(e&&e.hooks||[]).some(V)}function P(e,o,t){return e.hooks=e.hooks||{},e.hooks[o]=e.hooks[o]||[],e.hooks[o].some(z)?!1:(e.hooks[o].push({hooks:[t]}),!0)}function B(e){if(!e.hooks)return 0;let o=0;for(let t of Object.keys(e.hooks)){let n=(e.hooks[t]||[]).length;e.hooks[t]=(e.hooks[t]||[]).filter(r=>!z(r)),o+=n-e.hooks[t].length,e.hooks[t].length===0&&delete e.hooks[t]}return Object.keys(e.hooks).length===0&&delete e.hooks,o}function C(e){let o={SessionStart:{present:!1},UserPromptSubmit:{present:!1},Stop:{present:!1}};for(let t of Object.keys(o)){let n=e?.hooks?.[t]||[];for(let r of n){let s=(r.hooks||[]).find(V);if(s){o[t]={present:!0,url:s.url,command:s.command?`${s.command} ${(s.args||[]).join(" ")}`.trim():void 0,timeout:s.timeout};break}}}return o}var
|
|
2
|
+
"use strict";var l=require("node:fs"),g=require("node:path"),ne=require("node:os");var G=require("node:readline/promises"),A=require("node:process");async function w(e,o){let t=(0,G.createInterface)({input:A.stdin,output:A.stdout});try{let n=o?` [${o}]`:"";return(await t.question(`${e}${n}: `)).trim()||o||""}finally{t.close()}}async function N(e,o=!0){return(await w(`${e} (${o?"Y/n":"y/N"})`,o?"y":"n")).toLowerCase().startsWith("y")}function $(){return process.env.MEMORYAI_NONINTERACTIVE==="1"||process.env.CI==="true"||!process.stdin.isTTY}var f=require("node:fs"),b=require("node:path"),R=require("node:os");function S(e){return e==="project"?(0,b.join)(process.cwd(),".claude","settings.json"):(0,b.join)((0,R.homedir)(),".claude","settings.json")}function I(e){return e==="project"?(0,b.join)(process.cwd(),"CLAUDE.md"):(0,b.join)((0,R.homedir)(),".claude","CLAUDE.md")}function _(e){if(!(0,f.existsSync)(e))return{};try{return JSON.parse((0,f.readFileSync)(e,"utf-8"))||{}}catch{throw new Error(`${e} is not valid JSON. Fix it manually before re-running.`)}}function J(e,o){try{(0,f.chmodSync)(e,o)}catch{}}function O(e,o){(0,f.mkdirSync)((0,b.dirname)(e),{recursive:!0}),(0,f.writeFileSync)(e,JSON.stringify(o,null,2)+`
|
|
3
|
+
`,"utf-8"),J(e,384)}function T(e){if(!(0,f.existsSync)(e))return null;let o=new Date().toISOString().replace(/[:.]/g,"-"),t=`${e}.bak-${o}`;return(0,f.copyFileSync)(e,t),J(t,384),t}var ae="/v1/hooks/claude/",le="memoryai/session-start-runner";function H(e,o,t){return{type:"http",url:e,timeout:t,headers:{Authorization:`Bearer ${o}`},allowedEnvVars:[]}}function Y(e,o,t){return{type:"command",command:e,args:[o],timeout:t}}function V(e){if(!e)return!1;if(typeof e.url=="string"&&e.url.includes(ae))return!0;if(typeof e.command=="string"){let o=Array.isArray(e.args)?e.args.join(" "):"",t=`${e.command} ${o}`;if(t.includes(le)||t.includes("session-start-runner"))return!0}return!1}function z(e){return(e&&e.hooks||[]).some(V)}function P(e,o,t){return e.hooks=e.hooks||{},e.hooks[o]=e.hooks[o]||[],e.hooks[o].some(z)?!1:(e.hooks[o].push({hooks:[t]}),!0)}function B(e){if(!e.hooks)return 0;let o=0;for(let t of Object.keys(e.hooks)){let n=(e.hooks[t]||[]).length;e.hooks[t]=(e.hooks[t]||[]).filter(r=>!z(r)),o+=n-e.hooks[t].length,e.hooks[t].length===0&&delete e.hooks[t]}return Object.keys(e.hooks).length===0&&delete e.hooks,o}function C(e){let o={SessionStart:{present:!1},UserPromptSubmit:{present:!1},Stop:{present:!1}};for(let t of Object.keys(o)){let n=e?.hooks?.[t]||[];for(let r of n){let s=(r.hooks||[]).find(V);if(s){o[t]={present:!0,url:s.url,command:s.command?`${s.command} ${(s.args||[]).join(" ")}`.trim():void 0,timeout:s.timeout};break}}}return o}var h=require("node:fs"),E="<!-- memoryai:auto-note -->",W=`
|
|
4
4
|
${E}
|
|
5
5
|
## MemoryAI
|
|
6
6
|
|
|
7
7
|
Memory works automatically here. Past decisions, preferences, and recent project
|
|
8
8
|
context are recalled before each prompt and saved when each turn ends. Nothing
|
|
9
9
|
to call by hand \u2014 just work normally.
|
|
10
|
-
`;function q(e){let o=(0,
|
|
11
|
-
${W}`:W;return(0,
|
|
12
|
-
`);return(0,
|
|
10
|
+
`;function q(e){let o=(0,h.existsSync)(e)?(0,h.readFileSync)(e,"utf-8"):"";if(o.includes(E))return"skipped";let t=o?`${o.replace(/\s*$/,"")}
|
|
11
|
+
${W}`:W;return(0,h.writeFileSync)(e,t,"utf-8"),o?"appended":"created"}function X(e){if(!(0,h.existsSync)(e))return!1;let o=(0,h.readFileSync)(e,"utf-8");if(!o.includes(E))return!1;let t=o.replace(new RegExp(`\\n*${E}[\\s\\S]*$`,"m"),"").replace(/\s*$/,`
|
|
12
|
+
`);return(0,h.writeFileSync)(e,t,"utf-8"),!0}async function Q(e,o){let t=e.replace(/\/+$/,"");try{return(await fetch(`${t}/v1/stats`,{method:"GET",headers:{Authorization:`Bearer ${o}`}})).ok}catch{return!1}}async function Z(e,o){let t=e.replace(/\/+$/,"");try{let n=await fetch(`${t}/v1/admin/provision`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:o||"claude-code",tos_accepted:!0})});if(!n.ok)return null;let r=await n.json();return r&&typeof r.api_key=="string"?{api_key:r.api_key,plan:r.plan}:null}catch{return null}}async function ee(e,o){let t=e.replace(/\/+$/,""),n=[{event:"SessionStart",path:"/v1/ide/guard/bootstrap",body:{task:"",limit:1,source:"doctor-probe"}},{event:"UserPromptSubmit",path:"/v1/hooks/claude/user-prompt",body:{prompt:""}},{event:"Stop",path:"/v1/hooks/claude/stop",body:{last_assistant_message:""}}],r=async({event:a,path:p,body:d})=>{try{let i=await fetch(`${t}${p}`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`,"X-MemoryAI-Probe":"1"},body:JSON.stringify(d)});return[a,i.ok]}catch{return[a,!1]}},s=await Promise.all(n.map(r));return Object.fromEntries(s)}async function oe(e,o){let t=e.replace(/\/+$/,"");try{let n=await fetch(`${t}/v1/context/guard/settings`,{method:"GET",headers:{Authorization:`Bearer ${o}`}});return n.ok?await n.json():null}catch{return null}}async function x(e,o,t){let n=e.replace(/\/+$/,""),r={};t.compactAtTokens!==void 0&&(r.compact_at_tokens=t.compactAtTokens),t.criticalAtTokens!==void 0&&(r.critical_at_tokens=t.criticalAtTokens);try{let s=await fetch(`${n}/v1/context/guard/settings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`},body:JSON.stringify(r)});if(!s.ok)try{let a=await s.json();return{ok:!1,settings:null,errors:a?.errors||(a?.error?[a.error]:[`HTTP ${s.status}`])}}catch{return{ok:!1,settings:null,errors:[`HTTP ${s.status}`]}}return{ok:!0,settings:await s.json()}}catch(s){return{ok:!1,settings:null,errors:[s.message]}}}var re=(()=>{try{let e=require((0,g.join)(__dirname,"..","package.json"));if(e&&typeof e.version=="string")return e.version}catch{}return"0.0.0-dev"})(),U="https://memoryai.dev",j=(0,g.join)((0,ne.homedir)(),".memoryai"),m=(0,g.join)(j,"claude.json"),L=(0,g.join)(j,"session-start-runner.js");function ue(e){let o={command:e[0]||"help"};o.command==="config"&&e[1]&&!e[1].startsWith("-")&&(o.configSub=e[1],e[2]&&!e[2].startsWith("-")&&(o.configValue=e[2]));for(let t=1;t<e.length;t++){let n=e[t];n==="--user"?o.scope="user":n==="--project"?o.scope="project":n==="--endpoint"?o.endpoint=e[++t]:n==="--key"?o.key=e[++t]:n==="--model"?o.model=e[++t]:(n==="--yes"||n==="-y")&&(o.yes=!0)}return o}function v(){console.log(`MemoryAI for Claude Code v${re}`),console.log("One brain. Every AI you use. Forever."),console.log("")}function te(){v(),console.log(`Usage:
|
|
13
13
|
memoryai-claude install [--user|--project] [--endpoint URL] [--key KEY] [--model NAME] [--yes]
|
|
14
14
|
memoryai-claude doctor
|
|
15
15
|
memoryai-claude status
|
|
16
16
|
memoryai-claude config (show current compact thresholds)
|
|
17
|
-
memoryai-claude config
|
|
18
|
-
|
|
19
|
-
memoryai-claude config
|
|
20
|
-
memoryai-claude config
|
|
21
|
-
memoryai-claude config reset (clear both overrides \u2192 defaults)
|
|
17
|
+
memoryai-claude config critical <N> (set the hard ceiling in tokens; the soft
|
|
18
|
+
warning is derived automatically at 80%)
|
|
19
|
+
memoryai-claude config critical reset (clear the override \u2192 defaults)
|
|
20
|
+
memoryai-claude config reset (clear all overrides \u2192 defaults)
|
|
22
21
|
memoryai-claude logs
|
|
23
22
|
memoryai-claude uninstall [--user|--project]
|
|
24
23
|
memoryai-claude help
|
|
@@ -29,10 +28,11 @@ nothing to call by hand.
|
|
|
29
28
|
|
|
30
29
|
Threshold settings live on the SERVER per tenant \u2014 once set here, they apply
|
|
31
30
|
across every IDE / host you connect from (Kiro, Cursor, Claude Code, ...).
|
|
32
|
-
|
|
31
|
+
You only choose one number: the critical ceiling. The soft compact warning is
|
|
32
|
+
set automatically to 80% of it. Defaults: critical 200,000 (\u2192 compact 160,000).
|
|
33
33
|
|
|
34
34
|
Get a free key at https://memoryai.dev (or leave it blank during install and a
|
|
35
35
|
key will be created for you).
|
|
36
|
-
`)}async function se(e){return e.scope?e.scope:$()?"user":(await w("Apply to (u)ser globally or this (p)roject?","u")).toLowerCase().startsWith("p")?"project":"user"}async function de(e){if(e.endpoint)return e.endpoint;let o=process.env.HM_ENDPOINT||process.env.MEMORYAI_ENDPOINT;return o||($()?U:await w("Endpoint",U))}async function pe(e,o){if(e.key)return e.key;let t=process.env.HM_API_KEY||process.env.MEMORYAI_API_KEY;if(t)return t;let n="";if($()||(n=(await w("API key (leave blank to auto-create a free one")).trim()),!n){process.stdout.write(" ... creating a free key for you ...");let r=await Z(o,"claude-code");if(r)return console.log(` ok (plan=${r.plan||"free"})`),r.api_key;throw console.log(" failed"),new Error("Could not create a key automatically. Get one from https://memoryai.dev/connect and rerun with --key.")}return n}function fe(e){try{let o=new URL(e);return`${o.origin}${o.pathname}`}catch{return e}}async function me(e){v();let o=await se(e),t=await de(e),n=await pe(e,t),r=(e.model||process.env.MEMORYAI_MODEL||"").trim()||void 0;if(process.stdout.write(" ... verifying key ..."),await Q(t,n))console.log(" ok");else if(console.log(" failed"),!e.yes&&!$()&&!await
|
|
37
|
-
`,"utf-8");try{require("node:fs").chmodSync(m,384)}catch{}let
|
|
38
|
-
`);v(),console.log(`SessionStart runner log (${e}):`),console.log(""),console.log(n)}async function ve(){v();for(let e of["user","project"]){let o=S(e);if(!(0,l.existsSync)(o)){console.log(` ${e}: not present`);continue}let t=_(o),n=C(t),r=Object.values(n).filter(s=>s.present).length;console.log(` ${e}: ${r}/3 hooks wired (${o})`)}ie()}function ie(){if((0,l.existsSync)(m))try{let e=JSON.parse((0,l.readFileSync)(m,"utf-8")),o=typeof e.first_met_at=="string"?e.first_met_at:"",t=typeof e.total_sessions=="number"?e.total_sessions:0;if(!o&&t===0)return;let n=o?Date.parse(o):NaN,r="";if(!isNaN(n)){let a=Math.floor((Date.now()-n)/864e5);r=a===0?"today":a===1?"yesterday":`${a} days ago`}let s=t===1?"1 session":`${t} sessions`;console.log(r?` brain: met ${r} \xB7 ${s}`:` brain: ${s}`)}catch{}}async function be(e){v(),(0,l.existsSync)(m)||(console.error("MemoryAI not installed yet. Run `memoryai-claude install` first."),process.exit(2));let o=U,t="";try{let i=JSON.parse((0,l.readFileSync)(m,"utf-8"));typeof i.endpoint=="string"&&i.endpoint&&(o=i.endpoint),typeof i.key=="string"&&i.key&&(t=i.key)}catch(i){console.error(`Could not read runtime config: ${i.message}`),process.exit(2)}t||(console.error("No API key found. Run `memoryai-claude install` again."),process.exit(2));let n=(e.configSub||"").toLowerCase(),r=e.configValue;if(!n){let i=await oe(o,t);i||(console.error("Could not reach MemoryAI server. Check connectivity and key."),process.exit(2)),console.log(` plan: ${i.plan}`),console.log(` defaults: compact ${i.defaults.compact_at_tokens.toLocaleString()} / critical ${i.defaults.critical_at_tokens.toLocaleString()}`);let c=i.user_overrides.compact_at_tokens,u=i.user_overrides.critical_at_tokens,
|
|
36
|
+
`)}async function se(e){return e.scope?e.scope:$()?"user":(await w("Apply to (u)ser globally or this (p)roject?","u")).toLowerCase().startsWith("p")?"project":"user"}async function de(e){if(e.endpoint)return e.endpoint;let o=process.env.HM_ENDPOINT||process.env.MEMORYAI_ENDPOINT;return o||($()?U:await w("Endpoint",U))}async function pe(e,o){if(e.key)return e.key;let t=process.env.HM_API_KEY||process.env.MEMORYAI_API_KEY;if(t)return t;let n="";if($()||(n=(await w("API key (leave blank to auto-create a free one")).trim()),!n){process.stdout.write(" ... creating a free key for you ...");let r=await Z(o,"claude-code");if(r)return console.log(` ok (plan=${r.plan||"free"})`),r.api_key;throw console.log(" failed"),new Error("Could not create a key automatically. Get one from https://memoryai.dev/connect and rerun with --key.")}return n}function fe(e){try{let o=new URL(e);return`${o.origin}${o.pathname}`}catch{return e}}async function me(e){v();let o=await se(e),t=await de(e),n=await pe(e,t),r=(e.model||process.env.MEMORYAI_MODEL||"").trim()||void 0;if(process.stdout.write(" ... verifying key ..."),await Q(t,n))console.log(" ok");else if(console.log(" failed"),!e.yes&&!$()&&!await N("Server did not accept the key (or is offline). Continue anyway?",!1))throw new Error("Aborted by user.");let a=S(o),p=I(o),d=_(a),i=T(a);i&&console.log(` back ${i}`),(0,l.mkdirSync)(j,{recursive:!0});let c,u;try{if((0,l.existsSync)(m)){let y=JSON.parse((0,l.readFileSync)(m,"utf-8"));y&&typeof y.first_met_at=="string"&&(c=y.first_met_at),y&&typeof y.total_sessions=="number"&&(u=y.total_sessions)}}catch{}c||(c=new Date().toISOString()),typeof u!="number"&&(u=0),(0,l.writeFileSync)(m,JSON.stringify({endpoint:t,apiKey:n,...r?{model:r}:{},first_met_at:c,total_sessions:u},null,2)+`
|
|
37
|
+
`,"utf-8");try{require("node:fs").chmodSync(m,384)}catch{}let k=ge();if(!k)throw new Error("session-start-runner.js not found alongside the CLI. If running from source, run `npm run build` first.");(0,l.copyFileSync)(k,L),console.log(` setup ${L}`);let M=process.execPath,D=t.replace(/\/+$/,""),ce={SessionStart:P(d,"SessionStart",Y(M,L,12)),UserPromptSubmit:P(d,"UserPromptSubmit",H(`${D}/v1/hooks/claude/user-prompt`,n,10)),Stop:P(d,"Stop",H(`${D}/v1/hooks/claude/stop`,n,15))};for(let[y,F]of Object.entries(ce))console.log(` ${F?"add ":"skip "} hook ${y}${F?"":" (already present)"}`);O(a,d),console.log(` write ${a}`);let K=q(p);console.log(K==="created"?` create ${p}`:K==="appended"?` append ${p}`:` skip ${p} (note already present)`),console.log(""),console.log("Installed. Restart Claude Code once, then just work."),console.log(" - Past context returns at the start of each prompt."),console.log(" - Important moments save when each turn ends."),console.log(" - Run `memoryai-claude doctor` any time to verify health.")}function ge(){let e=[(0,g.join)((0,g.dirname)(process.argv[1]||""),"session-start-runner.js"),(0,g.join)(__dirname,"session-start-runner.js")];for(let o of e)if(o&&(0,l.existsSync)(o))return o;return null}async function ye(){v(),console.log("Diagnostics:");let e=S("user"),o=S("project"),t=!1;for(let[n,r]of[["user",e],["project",o]]){if(!(0,l.existsSync)(r)){console.log(` -- ${n}: ${r} (not present)`);continue}let s=_(r),a=C(s);if(Object.values(a).filter(c=>c.present).length===0){console.log(` -- ${n}: ${r} (no MemoryAI hooks)`);continue}t=!0,console.log(` ok ${n}: ${r}`);for(let[c,u]of Object.entries(a)){let k=u.url?` ${fe(u.url)}`:u.command?` command: ${u.command}`:"";console.log(` ${u.present?"present":"MISSING"} ${c}${k}`)}let d="",i="";if((0,l.existsSync)(m))try{let c=JSON.parse((0,l.readFileSync)(m,"utf-8"));c&&typeof c.endpoint=="string"&&(d=c.endpoint),c&&typeof c.apiKey=="string"&&(i=c.apiKey)}catch{}if(!d||!i){let c=he(s);c?.url&&(d=new URL(c.url).origin,i=(c.headers?.Authorization||"").replace(/^Bearer\s+/i,""))}if(d&&i){process.stdout.write(" ... ping endpoints ...");let c=await ee(d,i);console.log("");for(let[u,k]of Object.entries(c))console.log(` ${k?"ok":"FAIL"} ${u}`)}}t||(console.log(""),console.log("No MemoryAI hooks found in either user or project settings."),console.log("Run `memoryai-claude install` to wire them up.")),ie()}function he(e){let o=e?.hooks||{};for(let t of Object.keys(o))for(let n of o[t]||[])for(let r of n.hooks||[])if(typeof r?.url=="string"&&r.url.includes("/v1/hooks/claude/"))return r;return null}async function ke(){let e=(0,g.join)(j,"runner.log");if(!(0,l.existsSync)(e)){v(),console.log(`No SessionStart hook activity yet (${e} does not exist).`),console.log("This means Claude Code has not fired SessionStart since install."),console.log("Open a fresh terminal and run `claude` to trigger it.");return}let n=(0,l.readFileSync)(e,"utf-8").trim().split(/\r?\n/).slice(-20).join(`
|
|
38
|
+
`);v(),console.log(`SessionStart runner log (${e}):`),console.log(""),console.log(n)}async function ve(){v();for(let e of["user","project"]){let o=S(e);if(!(0,l.existsSync)(o)){console.log(` ${e}: not present`);continue}let t=_(o),n=C(t),r=Object.values(n).filter(s=>s.present).length;console.log(` ${e}: ${r}/3 hooks wired (${o})`)}ie()}function ie(){if((0,l.existsSync)(m))try{let e=JSON.parse((0,l.readFileSync)(m,"utf-8")),o=typeof e.first_met_at=="string"?e.first_met_at:"",t=typeof e.total_sessions=="number"?e.total_sessions:0;if(!o&&t===0)return;let n=o?Date.parse(o):NaN,r="";if(!isNaN(n)){let a=Math.floor((Date.now()-n)/864e5);r=a===0?"today":a===1?"yesterday":`${a} days ago`}let s=t===1?"1 session":`${t} sessions`;console.log(r?` brain: met ${r} \xB7 ${s}`:` brain: ${s}`)}catch{}}async function be(e){v(),(0,l.existsSync)(m)||(console.error("MemoryAI not installed yet. Run `memoryai-claude install` first."),process.exit(2));let o=U,t="";try{let i=JSON.parse((0,l.readFileSync)(m,"utf-8"));typeof i.endpoint=="string"&&i.endpoint&&(o=i.endpoint),typeof i.key=="string"&&i.key&&(t=i.key)}catch(i){console.error(`Could not read runtime config: ${i.message}`),process.exit(2)}t||(console.error("No API key found. Run `memoryai-claude install` again."),process.exit(2));let n=(e.configSub||"").toLowerCase(),r=e.configValue;if(!n){let i=await oe(o,t);i||(console.error("Could not reach MemoryAI server. Check connectivity and key."),process.exit(2)),console.log(` plan: ${i.plan}`),console.log(` defaults: compact ${i.defaults.compact_at_tokens.toLocaleString()} / critical ${i.defaults.critical_at_tokens.toLocaleString()}`);let c=i.user_overrides.compact_at_tokens,u=i.user_overrides.critical_at_tokens,k=c!=null?c.toLocaleString():"(default)",M=u!=null?u.toLocaleString():"(default)";console.log(` your overrides: compact ${k} / critical ${M}`),console.log(` effective: compact ${i.effective.compact_at_tokens.toLocaleString()} / critical ${i.effective.critical_at_tokens.toLocaleString()}`),console.log(""),console.log(" Set with: memoryai-claude config critical <tokens> (compact auto = 80%)");return}if(n==="reset"){let i=await x(o,t,{compactAtTokens:null,criticalAtTokens:null});i.ok||(console.error(`Reset rejected: ${(i.errors||["unknown"]).join("; ")}`),process.exit(2));let c=i.settings.effective;console.log(` Reset both. Effective: compact ${c.compact_at_tokens.toLocaleString()} / critical ${c.critical_at_tokens.toLocaleString()} tokens (defaults).`);return}if(n!=="compact"&&n!=="critical"&&(console.error(`Unknown config sub-command: ${n}. Use 'compact', 'critical', or 'reset'.`),process.exit(2)),(r||"").toLowerCase()==="reset"){let c=await x(o,t,n==="compact"?{compactAtTokens:null}:{criticalAtTokens:null,compactAtTokens:null});c.ok||(console.error(`Reset rejected: ${(c.errors||["unknown"]).join("; ")}`),process.exit(2));let u=c.settings.effective;console.log(` Reset ${n}. Effective: compact ${u.compact_at_tokens.toLocaleString()} / critical ${u.critical_at_tokens.toLocaleString()} tokens.`);return}let s=Number(r);(!Number.isFinite(s)||s<1e3)&&(console.error(`Invalid value '${r??""}'. Must be an integer >= 1000, or 'reset'.`),process.exit(2));let a=n==="compact"?{compactAtTokens:Math.round(s)}:{criticalAtTokens:Math.round(s),compactAtTokens:Math.round(s*.8)},p=await x(o,t,a);p.ok||(console.error(`Update rejected: ${(p.errors||["unknown"]).join("; ")}`),process.exit(2));let d=p.settings.effective;console.log(` Updated. Effective: compact ${d.compact_at_tokens.toLocaleString()} / critical ${d.critical_at_tokens.toLocaleString()} tokens.`),console.log(" Applies across every IDE/host that uses this MemoryAI key.")}async function $e(e){v();let o=await se(e),t=S(o),n=I(o);if(!(0,l.existsSync)(t)){console.log(` Nothing to do \u2014 ${t} does not exist.`);return}if(!e.yes&&!$()&&!await N(`Remove MemoryAI hooks from ${t}?`,!0))return;let r=_(t),s=T(t);s&&console.log(` back ${s}`);let a=B(r);O(t,r),console.log(` removed ${a} hook${a===1?"":"s"} from ${t}`),X(n)&&console.log(` cleaned ${n}`),console.log(""),console.log("Uninstalled. Restart Claude Code once. Memory still lives on the server until you delete it.")}async function Se(){let e=ue(process.argv.slice(2));try{switch(e.command){case"install":await me(e);break;case"doctor":await ye();break;case"status":await ve();break;case"logs":await ke();break;case"config":await be(e);break;case"uninstall":await $e(e);break;case"-v":case"--version":console.log(re);break;case"help":case"--help":case"-h":case void 0:case"":te();break;default:console.error(`Unknown command: ${e.command}`),te(),process.exit(2)}}catch(o){console.error(""),console.error(`Error: ${o.message}`),process.exit(1)}}Se();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memoryai-claude",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Your AI keeps forgetting you. MemoryAI gives Claude Code a real long-term memory — one that follows you across every model.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://memoryai.dev",
|