context-mode 1.0.74 → 1.0.75

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.
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Claude Code plugins by Mert Koseoğlu",
9
- "version": "1.0.74"
9
+ "version": "1.0.75"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "context-mode",
14
14
  "source": "./",
15
15
  "description": "Claude Code MCP plugin that saves 98% of your context window. Sandboxed code execution in 11 languages, FTS5 knowledge base with BM25 ranking, and intent-driven search.",
16
- "version": "1.0.74",
16
+ "version": "1.0.75",
17
17
  "author": {
18
18
  "name": "Mert Koseoğlu"
19
19
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "context-mode",
3
- "version": "1.0.74",
3
+ "version": "1.0.75",
4
4
  "description": "MCP server that saves 98% of your context window with session continuity. Sandboxed code execution in 11 languages, FTS5 knowledge base with BM25 ranking, and automatic state restore across compactions.",
5
5
  "author": {
6
6
  "name": "Mert Koseoğlu",
@@ -3,7 +3,7 @@
3
3
  "name": "Context Mode",
4
4
  "kind": "tool",
5
5
  "description": "OpenClaw plugin that saves 98% of your context window. Sandboxed code execution in 11 languages, FTS5 knowledge base with BM25 ranking, and intent-driven search.",
6
- "version": "1.0.74",
6
+ "version": "1.0.75",
7
7
  "sandbox": {
8
8
  "mode": "permissive",
9
9
  "filesystem_access": "full",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "context-mode",
3
- "version": "1.0.74",
3
+ "version": "1.0.75",
4
4
  "description": "OpenClaw plugin that saves 98% of your context window. Sandboxed code execution in 11 languages, FTS5 knowledge base with BM25 ranking, and intent-driven search.",
5
5
  "author": {
6
6
  "name": "Mert Koseoğlu",
package/build/cli.js CHANGED
@@ -49,6 +49,7 @@ const HOOK_MAP = {
49
49
  pretooluse: "hooks/cursor/pretooluse.mjs",
50
50
  posttooluse: "hooks/cursor/posttooluse.mjs",
51
51
  sessionstart: "hooks/cursor/sessionstart.mjs",
52
+ stop: "hooks/cursor/stop.mjs",
52
53
  },
53
54
  "codex": {
54
55
  pretooluse: "hooks/codex/pretooluse.mjs",
package/cli.bundle.mjs CHANGED
@@ -571,7 +571,7 @@ ${Se("gray",d+Yh.repeat(c+2)+y$)}
571
571
  `);be.length>1&&r.write(Fo.cursor.up(be.length-1)),r.write(Fo.cursor.to(0)),r.write(Fo.erase.down())},Pe=be=>be.replace(/\.+$/,""),de=be=>{let ht=(performance.now()-be)/1e3,sr=Math.floor(ht/60),ir=Math.floor(ht%60);return sr>0?`[${sr}m ${ir}s]`:`[${ir}s]`},dt=c.withGuide??Ht.withGuide,di=(be="")=>{m=!0,l=Jh({output:r}),p=Pe(be),g=performance.now(),dt&&r.write(`${Se("gray",br)}
572
572
  `);let ht=0,sr=0;Q(),d=setInterval(()=>{if(u&&p===h)return;z(),h=p;let ir=y(s[ht]),pi;if(u)pi=`${ir} ${p}...`;else if(t==="timer")pi=`${ir} ${p} ${de(g)}`;else{let Fk=".".repeat(Math.floor(sr)).slice(0,3);pi=`${ir} ${p}${Fk}`}let Lk=Ln(pi,_,{hard:!0,trim:!1});r.write(Lk),ht=ht+1<s.length?ht+1:0,sr=sr<4?sr+.125:0},i)},vr=(be="",ht=0,sr=!1)=>{if(!m)return;m=!1,clearInterval(d),z();let ir=ht===0?Se("green",nu):ht===1?Se("red",p$):Se("red",m$);p=be??p,sr||(t==="timer"?r.write(`${ir} ${p} ${de(g)}
573
573
  `):r.write(`${ir} ${p}
574
- `)),q(),l()};return{start:di,stop:(be="")=>vr(be,0),message:(be="")=>{p=Pe(be??p)},cancel:(be="")=>vr(be,1),error:(be="")=>vr(be,2),clear:()=>vr("",0,!0),get isCancelled(){return f}}},CM={light:ce("\u2500","-"),heavy:ce("\u2501","="),block:ce("\u2588","#")};var IM=`${Se("gray",br)} `;var E=Do(eg(),1);Si();Hu();import{execFileSync as Dn}from"node:child_process";import{readFileSync as Ah,writeFileSync as Tj,cpSync as zk,accessSync as Nk,existsSync as qc,rmSync as Bc,closeSync as Pj,openSync as Rj,chmodSync as Oj,constants as jk}from"node:fs";import{request as Cj}from"node:https";import{resolve as je,dirname as Ij,join as Mk}from"node:path";import{tmpdir as Aj,devNull as zj,homedir as zh}from"node:os";import{fileURLToPath as Nj,pathToFileURL as jj}from"node:url";var Mj={"claude-code":{pretooluse:"hooks/pretooluse.mjs",posttooluse:"hooks/posttooluse.mjs",precompact:"hooks/precompact.mjs",sessionstart:"hooks/sessionstart.mjs",userpromptsubmit:"hooks/userpromptsubmit.mjs"},"gemini-cli":{beforetool:"hooks/gemini-cli/beforetool.mjs",aftertool:"hooks/gemini-cli/aftertool.mjs",precompress:"hooks/gemini-cli/precompress.mjs",sessionstart:"hooks/gemini-cli/sessionstart.mjs"},"vscode-copilot":{pretooluse:"hooks/vscode-copilot/pretooluse.mjs",posttooluse:"hooks/vscode-copilot/posttooluse.mjs",precompact:"hooks/vscode-copilot/precompact.mjs",sessionstart:"hooks/vscode-copilot/sessionstart.mjs"},cursor:{pretooluse:"hooks/cursor/pretooluse.mjs",posttooluse:"hooks/cursor/posttooluse.mjs",sessionstart:"hooks/cursor/sessionstart.mjs"},codex:{pretooluse:"hooks/codex/pretooluse.mjs",posttooluse:"hooks/codex/posttooluse.mjs",sessionstart:"hooks/codex/sessionstart.mjs"},kiro:{pretooluse:"hooks/kiro/pretooluse.mjs",posttooluse:"hooks/kiro/posttooluse.mjs"}};async function Dj(t,e){try{Pj(2),Rj(zj,"w")}catch{process.stderr.write=(()=>!0)}let r=Mj[t]?.[e];r||process.exit(1);let n=Vc();await import(jj(Mk(n,r)).href)}var li=process.argv.slice(2);li[0]==="doctor"?Uj().then(t=>process.exit(t)):li[0]==="upgrade"?Hj():li[0]==="hook"?Dj(li[1],li[2]):Promise.resolve().then(()=>(Ak(),Ik));function a9(t){return t.replace(/\\/g,"/")}function Lj(){let t=Nj(import.meta.url),e=Ij(t);return e.endsWith("/build")||e.endsWith("\\build")||e.endsWith("/src")||e.endsWith("\\src")?je(e,".."):e}function Fj(t){if(process.platform==="win32"){let e=process.env.LOCALAPPDATA;return e?je(e,t,"node_modules","context-mode"):je(zh(),"AppData","Local",t,"node_modules","context-mode")}return je(zh(),".cache",t,"node_modules","context-mode")}function Vc(){let t=Gn().platform;return t==="opencode"||t==="kilo"?Fj(t):Lj()}function Dk(){try{return JSON.parse(Ah(je(Vc(),"package.json"),"utf-8")).version??"unknown"}catch{return"unknown"}}async function Zj(){return new Promise(t=>{let e=Cj("https://registry.npmjs.org/context-mode/latest",{headers:{Connection:"close"}},r=>{let n="";r.on("data",o=>{n+=o}),r.on("end",()=>{try{let o=JSON.parse(n);t(o.version??"unknown")}catch{t("unknown")}})});e.on("error",()=>t("unknown")),e.setTimeout(5e3,()=>{e.destroy(),t("unknown")}),e.end()})}async function Uj(){process.stdout.isTTY&&console.clear();let t=Gn(),e=await Ci(t.platform);ou(E.default.bgMagenta(E.default.white(" context-mode doctor "))),I.info(`Platform: ${E.default.cyan(e.name)}`+E.default.dim(` (${t.confidence} confidence \u2014 ${t.reason})`));let r=0,n=iu();n.start("Running diagnostics");let o,s;try{o=Fn(),s=bi(o)}catch{return n.stop("Diagnostics partial"),I.warn(E.default.yellow("Could not detect runtimes")+E.default.dim(" \u2014 module may be missing, restart session after upgrade")),_i(E.default.yellow("Doctor could not fully run \u2014 try again after restarting")),1}n.stop("Diagnostics complete"),su(xi(o),"Runtimes"),Zn()?I.success(E.default.green("Performance: FAST")+" \u2014 Bun detected for JS/TS execution"):I.warn(E.default.yellow("Performance: NORMAL")+" \u2014 Using Node.js (install Bun for 3-5x speed boost)");let i=11,a=(s.length/i*100).toFixed(0);s.length<2?(r++,I.error(E.default.red(`Language coverage: ${s.length}/${i} (${a}%)`)+" \u2014 too few runtimes detected"+E.default.dim(` \u2014 ${s.join(", ")||"none"}`))):I.info(`Language coverage: ${s.length}/${i} (${a}%)`+E.default.dim(` \u2014 ${s.join(", ")}`)),I.step("Testing server initialization...");try{let{PolyglotExecutor:h}=await Promise.resolve().then(()=>(ph(),YS)),_=await new h({runtimes:o}).execute({language:"javascript",code:'console.log("ok");',timeout:5e3});if(_.exitCode===0&&_.stdout.trim()==="ok")I.success(E.default.green("Server test: PASS"));else{r++;let y=_.stderr?.trim()?` (${_.stderr.trim().slice(0,200)})`:"";I.error(E.default.red("Server test: FAIL")+` \u2014 exit ${_.exitCode}${y}`)}}catch(h){let g=h instanceof Error?h.message:String(h);g.includes("Cannot find module")||g.includes("MODULE_NOT_FOUND")?I.warn(E.default.yellow("Server test: SKIP")+E.default.dim(" \u2014 module not available (restart session after upgrade)")):(r++,I.error(E.default.red("Server test: FAIL")+` \u2014 ${g}`))}I.step(`Checking ${e.name} hooks configuration...`);let c=Vc(),u=e.validateHooks(c);for(let h of u)h.status==="pass"?I.success(E.default.green(`${h.check}: PASS`)+` \u2014 ${h.message}`):I.error(E.default.red(`${h.check}: FAIL`)+` \u2014 ${h.message}`+(h.fix?E.default.dim(`
574
+ `)),q(),l()};return{start:di,stop:(be="")=>vr(be,0),message:(be="")=>{p=Pe(be??p)},cancel:(be="")=>vr(be,1),error:(be="")=>vr(be,2),clear:()=>vr("",0,!0),get isCancelled(){return f}}},CM={light:ce("\u2500","-"),heavy:ce("\u2501","="),block:ce("\u2588","#")};var IM=`${Se("gray",br)} `;var E=Do(eg(),1);Si();Hu();import{execFileSync as Dn}from"node:child_process";import{readFileSync as Ah,writeFileSync as Tj,cpSync as zk,accessSync as Nk,existsSync as qc,rmSync as Bc,closeSync as Pj,openSync as Rj,chmodSync as Oj,constants as jk}from"node:fs";import{request as Cj}from"node:https";import{resolve as je,dirname as Ij,join as Mk}from"node:path";import{tmpdir as Aj,devNull as zj,homedir as zh}from"node:os";import{fileURLToPath as Nj,pathToFileURL as jj}from"node:url";var Mj={"claude-code":{pretooluse:"hooks/pretooluse.mjs",posttooluse:"hooks/posttooluse.mjs",precompact:"hooks/precompact.mjs",sessionstart:"hooks/sessionstart.mjs",userpromptsubmit:"hooks/userpromptsubmit.mjs"},"gemini-cli":{beforetool:"hooks/gemini-cli/beforetool.mjs",aftertool:"hooks/gemini-cli/aftertool.mjs",precompress:"hooks/gemini-cli/precompress.mjs",sessionstart:"hooks/gemini-cli/sessionstart.mjs"},"vscode-copilot":{pretooluse:"hooks/vscode-copilot/pretooluse.mjs",posttooluse:"hooks/vscode-copilot/posttooluse.mjs",precompact:"hooks/vscode-copilot/precompact.mjs",sessionstart:"hooks/vscode-copilot/sessionstart.mjs"},cursor:{pretooluse:"hooks/cursor/pretooluse.mjs",posttooluse:"hooks/cursor/posttooluse.mjs",sessionstart:"hooks/cursor/sessionstart.mjs",stop:"hooks/cursor/stop.mjs"},codex:{pretooluse:"hooks/codex/pretooluse.mjs",posttooluse:"hooks/codex/posttooluse.mjs",sessionstart:"hooks/codex/sessionstart.mjs"},kiro:{pretooluse:"hooks/kiro/pretooluse.mjs",posttooluse:"hooks/kiro/posttooluse.mjs"}};async function Dj(t,e){try{Pj(2),Rj(zj,"w")}catch{process.stderr.write=(()=>!0)}let r=Mj[t]?.[e];r||process.exit(1);let n=Vc();await import(jj(Mk(n,r)).href)}var li=process.argv.slice(2);li[0]==="doctor"?Uj().then(t=>process.exit(t)):li[0]==="upgrade"?Hj():li[0]==="hook"?Dj(li[1],li[2]):Promise.resolve().then(()=>(Ak(),Ik));function a9(t){return t.replace(/\\/g,"/")}function Lj(){let t=Nj(import.meta.url),e=Ij(t);return e.endsWith("/build")||e.endsWith("\\build")||e.endsWith("/src")||e.endsWith("\\src")?je(e,".."):e}function Fj(t){if(process.platform==="win32"){let e=process.env.LOCALAPPDATA;return e?je(e,t,"node_modules","context-mode"):je(zh(),"AppData","Local",t,"node_modules","context-mode")}return je(zh(),".cache",t,"node_modules","context-mode")}function Vc(){let t=Gn().platform;return t==="opencode"||t==="kilo"?Fj(t):Lj()}function Dk(){try{return JSON.parse(Ah(je(Vc(),"package.json"),"utf-8")).version??"unknown"}catch{return"unknown"}}async function Zj(){return new Promise(t=>{let e=Cj("https://registry.npmjs.org/context-mode/latest",{headers:{Connection:"close"}},r=>{let n="";r.on("data",o=>{n+=o}),r.on("end",()=>{try{let o=JSON.parse(n);t(o.version??"unknown")}catch{t("unknown")}})});e.on("error",()=>t("unknown")),e.setTimeout(5e3,()=>{e.destroy(),t("unknown")}),e.end()})}async function Uj(){process.stdout.isTTY&&console.clear();let t=Gn(),e=await Ci(t.platform);ou(E.default.bgMagenta(E.default.white(" context-mode doctor "))),I.info(`Platform: ${E.default.cyan(e.name)}`+E.default.dim(` (${t.confidence} confidence \u2014 ${t.reason})`));let r=0,n=iu();n.start("Running diagnostics");let o,s;try{o=Fn(),s=bi(o)}catch{return n.stop("Diagnostics partial"),I.warn(E.default.yellow("Could not detect runtimes")+E.default.dim(" \u2014 module may be missing, restart session after upgrade")),_i(E.default.yellow("Doctor could not fully run \u2014 try again after restarting")),1}n.stop("Diagnostics complete"),su(xi(o),"Runtimes"),Zn()?I.success(E.default.green("Performance: FAST")+" \u2014 Bun detected for JS/TS execution"):I.warn(E.default.yellow("Performance: NORMAL")+" \u2014 Using Node.js (install Bun for 3-5x speed boost)");let i=11,a=(s.length/i*100).toFixed(0);s.length<2?(r++,I.error(E.default.red(`Language coverage: ${s.length}/${i} (${a}%)`)+" \u2014 too few runtimes detected"+E.default.dim(` \u2014 ${s.join(", ")||"none"}`))):I.info(`Language coverage: ${s.length}/${i} (${a}%)`+E.default.dim(` \u2014 ${s.join(", ")}`)),I.step("Testing server initialization...");try{let{PolyglotExecutor:h}=await Promise.resolve().then(()=>(ph(),YS)),_=await new h({runtimes:o}).execute({language:"javascript",code:'console.log("ok");',timeout:5e3});if(_.exitCode===0&&_.stdout.trim()==="ok")I.success(E.default.green("Server test: PASS"));else{r++;let y=_.stderr?.trim()?` (${_.stderr.trim().slice(0,200)})`:"";I.error(E.default.red("Server test: FAIL")+` \u2014 exit ${_.exitCode}${y}`)}}catch(h){let g=h instanceof Error?h.message:String(h);g.includes("Cannot find module")||g.includes("MODULE_NOT_FOUND")?I.warn(E.default.yellow("Server test: SKIP")+E.default.dim(" \u2014 module not available (restart session after upgrade)")):(r++,I.error(E.default.red("Server test: FAIL")+` \u2014 ${g}`))}I.step(`Checking ${e.name} hooks configuration...`);let c=Vc(),u=e.validateHooks(c);for(let h of u)h.status==="pass"?I.success(E.default.green(`${h.check}: PASS`)+` \u2014 ${h.message}`):I.error(E.default.red(`${h.check}: FAIL`)+` \u2014 ${h.message}`+(h.fix?E.default.dim(`
575
575
  Run: ${h.fix}`):""));I.step("Checking hook script...");let l=je(c,"hooks","pretooluse.mjs");try{Nk(l,jk.R_OK),I.success(E.default.green("Hook script exists: PASS")+E.default.dim(` \u2014 ${l}`))}catch{I.error(E.default.red("Hook script exists: FAIL")+E.default.dim(` \u2014 not found at ${l}`))}I.step(`Checking ${e.name} plugin registration...`);let d=e.checkPluginRegistration();d.status==="pass"?I.success(E.default.green("Plugin enabled: PASS")+E.default.dim(` \u2014 ${d.message}`)):I.warn(E.default.yellow("Plugin enabled: WARN")+` \u2014 ${d.message}`),I.step("Checking FTS5 / SQLite...");try{let h=(await Promise.resolve().then(()=>(ii(),ek))).loadDatabase(),g=new h(":memory:");g.exec("CREATE VIRTUAL TABLE fts_test USING fts5(content)"),g.exec("INSERT INTO fts_test(content) VALUES ('hello world')");let _=g.prepare("SELECT * FROM fts_test WHERE fts_test MATCH 'hello'").get();g.close(),_&&_.content==="hello world"?I.success(E.default.green("FTS5 / SQLite: PASS")+" \u2014 native module works"):(r++,I.error(E.default.red("FTS5 / SQLite: FAIL")+" \u2014 query returned unexpected result"))}catch(h){let g=h instanceof Error?h.message:String(h);g.includes("Cannot find module")||g.includes("MODULE_NOT_FOUND")?I.warn(E.default.yellow("FTS5 / better-sqlite3: SKIP")+E.default.dim(" \u2014 module not available (restart session after upgrade)")):(r++,I.error(E.default.red("FTS5 / better-sqlite3: FAIL")+` \u2014 ${g}`+E.default.dim(`
576
576
  Try: npm rebuild better-sqlite3`)))}I.step("Checking versions...");let m=Dk(),f=await Zj(),p=e.getInstalledVersion();return f==="unknown"?I.warn(E.default.yellow("npm (MCP): WARN")+` \u2014 local v${m}, could not reach npm registry`):m===f?I.success(E.default.green("npm (MCP): PASS")+` \u2014 v${m}`):I.warn(E.default.yellow("npm (MCP): WARN")+` \u2014 local v${m}, latest v${f}`+E.default.dim(`
577
577
  Run: /context-mode:ctx-upgrade`)),p==="not installed"?I.info(E.default.dim(`${e.name}: not installed`)+" \u2014 using standalone MCP mode"):f!=="unknown"&&p===f?I.success(E.default.green(`${e.name}: PASS`)+` \u2014 v${p}`):f!=="unknown"?I.warn(E.default.yellow(`${e.name}: WARN`)+` \u2014 v${p}, latest v${f}`+E.default.dim(`
@@ -117,5 +117,9 @@ try {
117
117
  } catch { /* ignore logging failure */ }
118
118
  }
119
119
 
120
- const output = `SessionStart:compact hook success: Success\nSessionStart hook additional context: \n${additionalContext}`;
121
- process.stdout.write(output);
120
+ console.log(JSON.stringify({
121
+ hookSpecificOutput: {
122
+ hookEventName: "SessionStart",
123
+ additionalContext,
124
+ },
125
+ }));
@@ -3,7 +3,7 @@
3
3
  "name": "Context Mode",
4
4
  "kind": "tool",
5
5
  "description": "OpenClaw plugin that saves 98% of your context window. Sandboxed code execution in 11 languages, FTS5 knowledge base with BM25 ranking, and intent-driven search.",
6
- "version": "1.0.74",
6
+ "version": "1.0.75",
7
7
  "sandbox": {
8
8
  "mode": "permissive",
9
9
  "filesystem_access": "full",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "context-mode",
3
- "version": "1.0.74",
3
+ "version": "1.0.75",
4
4
  "type": "module",
5
5
  "description": "MCP plugin that saves 98% of your context window. Works with Claude Code, Gemini CLI, VS Code Copilot, OpenCode, and Codex CLI. Sandboxed code execution, FTS5 knowledge base, and intent-driven search.",
6
6
  "author": "Mert Koseoğlu",