@cachly-dev/mcp-server 0.10.183 → 0.10.185

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.
@@ -1,16 +1,17 @@
1
- import{execFile as A}from"node:child_process";import{homedir as I}from"node:os";import{basename as R,isAbsolute as T,relative as k,resolve as g}from"node:path";import{safeJsonParse as _,scanKeys as m}from"./utils.js";import{STARTER_CORPUS_SIZE as N}from"./starter-corpus.js";import{NAME_VEKTOR_PRAEFIX as z,VEKTOR_NACHTRAG as O,VEKTOR_PRAEFIX as C,packe as x,textFuerNamensVektor as D,textFuerVektor as P}from"./bedeutung.js";const u="cachly:startwissen:git",S=30,L=1500,M=1e3,F=3,b=90*86400,K=N;function B(t=process.env){return!/^(0|false|off|no|nein)$/i.test((t.CACHLY_STARTVORRAT??"").trim())}const v=t=>new Promise(e=>setTimeout(e,t));function rt(t){for(const r of t.wurzeln??[])if(r.uri.startsWith("file:"))try{return t.dateiPfad(r.uri)}catch{}const e=t.env??{};for(const r of["CLAUDE_PROJECT_DIR","CACHLY_WORKSPACE"]){const n=(e[r]??"").trim();if(n&&!n.includes("${"))return n}return t.cwd}function G(t,e){const r=k(e,t);return r===""||!r.startsWith("..")&&!T(r)}function J(t,e){return process.platform==="win32"?t.toLowerCase()===e.toLowerCase():t===e}function U(t,e=process.env){const r=g(t),n=(e.CLAUDE_PLUGIN_ROOT??"").trim();if(n&&!n.includes("${")&&G(r,g(n)))return"plugin-ordner";if(r.split(/[\\/]+/).some(c=>c==="node_modules"||c==="_npx"))return"paketordner";const s=e.HOME||e.USERPROFILE||I();return s&&J(r,g(s))?"heimordner":""}function j(t){return new Promise(e=>{try{A("git",["rev-parse","--show-toplevel"],{cwd:t,timeout:5e3,windowsHide:!0},(r,n)=>{const s=String(n??"").trim();e(r||!s?"":g(s))})}catch{e("")}})}function H(t,e){return["","","---",`\u2139\uFE0F **cachly:** this new Brain just learned ${t} lesson${t===1?"":"s"} from the git history of \`${R(e)}\` (last ${S} commits at most). \`smart_recall\` finds them now. Tell the user once.`].join(`
2
- `)}let d="";function st(){const t=d;return d="",t}async function V(t){const e=t.protokoll??(n=>{process.stderr.write(n)}),r=t.env??process.env;try{const n=g(await t.projektOrdner()),s=await(t.gitWurzel??j)(n);if(!s)return e(`cachly: ${n} is not a git repository \u2014 the new Brain starts without git history.
3
- `),t.startvorrat&&B(r)?await X(t,n,e):{art:"kein-repo",ordner:n};const c=U(s,r);if(c)return e(`cachly: ${s} is not a user project (${c}) \u2014 no import from git history.
1
+ import{execFile as A}from"node:child_process";import{homedir as T}from"node:os";import{basename as k,isAbsolute as N,relative as z,resolve as d}from"node:path";import{safeJsonParse as v,scanKeys as m}from"./utils.js";import{STARTER_CORPUS_SIZE as P}from"./starter-corpus.js";import{NAME_VEKTOR_PRAEFIX as C,VEKTOR_NACHTRAG as $,VEKTOR_PRAEFIX as D,ZWEIT_VEKTOR_PRAEFIX as L,packe as S,textFuerNamensVektor as M,textFuerVektor as x}from"./bedeutung.js";const u="cachly:startwissen:git",E=30,I=1500,F=1e3,K=3,_=90*86400,B=P;function G(t=process.env){return!/^(0|false|off|no|nein)$/i.test((t.CACHLY_STARTVORRAT??"").trim())}const b=t=>new Promise(e=>setTimeout(e,t));function at(t){for(const n of t.wurzeln??[])if(n.uri.startsWith("file:"))try{return t.dateiPfad(n.uri)}catch{}const e=t.env??{};for(const n of["CLAUDE_PROJECT_DIR","CACHLY_WORKSPACE"]){const r=(e[n]??"").trim();if(r&&!r.includes("${"))return r}return t.cwd}function J(t,e){const n=z(e,t);return n===""||!n.startsWith("..")&&!N(n)}function X(t,e){return process.platform==="win32"?t.toLowerCase()===e.toLowerCase():t===e}function U(t,e=process.env){const n=d(t),r=(e.CLAUDE_PLUGIN_ROOT??"").trim();if(r&&!r.includes("${")&&J(n,d(r)))return"plugin-ordner";if(n.split(/[\\/]+/).some(c=>c==="node_modules"||c==="_npx"))return"paketordner";const s=e.HOME||e.USERPROFILE||T();return s&&X(n,d(s))?"heimordner":""}function V(t){return new Promise(e=>{try{A("git",["rev-parse","--show-toplevel"],{cwd:t,timeout:5e3,windowsHide:!0},(n,r)=>{const s=String(r??"").trim();e(n||!s?"":d(s))})}catch{e("")}})}function W(t,e){return["","","---",`\u2139\uFE0F **cachly:** this new Brain just learned ${t} lesson${t===1?"":"s"} from the git history of \`${k(e)}\` (last ${E} commits at most). \`smart_recall\` finds them now. Tell the user once.`].join(`
2
+ `)}let w="";function ot(){const t=w;return w="",t}async function j(t){const e=t.protokoll??(r=>{process.stderr.write(r)}),n=t.env??process.env;try{const r=d(await t.projektOrdner()),s=await(t.gitWurzel??V)(r);if(!s)return e(`cachly: ${r} is not a git repository \u2014 the new Brain starts without git history.
3
+ `),t.startvorrat&&G(n)?await Z(t,r,e):{art:"kein-repo",ordner:r};const c=U(s,n);if(c)return e(`cachly: ${s} is not a user project (${c}) \u2014 no import from git history.
4
4
  `),{art:"ausgeschlossen",ordner:s,grund:c};const o=await t.verbindung(t.instanzId);if((await m(o,"cachly:lesson:best:*",{max:1})).length>0)return e(`cachly: this Brain already has lessons \u2014 no import from git history.
5
- `),{art:"hat-lektionen"};if(await o.set(u,JSON.stringify({stand:"laeuft",seit:new Date().toISOString(),ordner:s}),"NX")!=="OK")return{art:"schon-erledigt"};e(`cachly: new Brain \u2014 learning from the last ${S} commits of ${s} in the background.
6
- `);const i=Date.now();try{await t.ausGit({instance_id:t.instanzId,repo_path:s,limit:S})}catch(l){const f=l instanceof Error?l.message:String(l);return await o.set(u,JSON.stringify({stand:"abgebrochen",am:new Date().toISOString(),grund:f.slice(0,200)})).catch(()=>{}),e(`cachly: import from git history failed: ${f}
7
- `),{art:"fehler",grund:f}}const a=[];for(const l of await m(o,"cachly:lesson:best:*",{max:1e3})){const f=_(await o.get(l),{});(Array.isArray(f.tags)?f.tags:[]).includes("brain_from_git")&&a.push({topic:l.slice(19),lektion:f})}await o.set(u,JSON.stringify({stand:"fertig",am:new Date().toISOString(),ordner:s,lektionen:a.length})).catch(()=>{});const y=((Date.now()-i)/1e3).toFixed(1);e(`cachly: learned ${a.length} lessons from git history in ${y} s.
8
- `),a.length>0&&(d=H(a.length,s));try{t.melde?.(a.length)}catch{}const w=await $(o,a,t,e);return{art:"fertig",ordner:s,lektionen:a.length,vektoren:w}}catch(n){const s=n instanceof Error?n.message:String(n);return e(`cachly: import from git history stopped: ${s}
9
- `),{art:"fehler",grund:s}}}function W(t){return["","","---",`\u2139\uFE0F **cachly:** the project folder is not a git repository, so this new Brain loaded ${t} starter lesson${t===1?"":"s"} (common engineering fixes, tagged \`source: "starter"\`; they never override own lessons). \`smart_recall\` finds them now. Tell the user once.`].join(`
10
- `)}async function X(t,e,r){const n=t.startvorrat;if(!n)return{art:"kein-repo",ordner:e};const s=await t.verbindung(t.instanzId);if((await m(s,"cachly:lesson:best:*",{max:1})).length>0)return r(`cachly: this Brain already has lessons \u2014 no starter lessons.
11
- `),{art:"hat-lektionen"};if(await s.set(u,JSON.stringify({stand:"startvorrat",seit:new Date().toISOString(),ordner:e}),"NX")!=="OK")return{art:"schon-erledigt"};r(`cachly: new Brain without git history \u2014 loading ${K} starter lessons in the background.
12
- `);try{await n({instance_id:t.instanzId})}catch(i){const a=i instanceof Error?i.message:String(i);return await s.set(u,JSON.stringify({stand:"abgebrochen",am:new Date().toISOString(),grund:a.slice(0,200)})).catch(()=>{}),r(`cachly: loading starter lessons failed: ${a}
13
- `),{art:"fehler",grund:a}}const o=[];for(const i of await m(s,"cachly:lesson:best:*",{max:1e3})){const a=_(await s.get(i),{});a.source==="starter"&&o.push({topic:i.slice(19),lektion:a})}await s.set(u,JSON.stringify({stand:"fertig",am:new Date().toISOString(),ordner:e,startvorrat:o.length})).catch(()=>{}),r(`cachly: loaded ${o.length} starter lessons.
14
- `),o.length>0&&(d=W(o.length));try{t.meldeStartvorrat?.(o.length)}catch{}const h=await $(s,o,t,r);return{art:"startvorrat",ordner:e,lektionen:o.length,vektoren:h}}async function $(t,e,r,n){const s=r.einbetten;if(!s||e.length===0||!(r.hatEinbettung??(()=>!0))())return 0;for(const{topic:a}of e)await t.sadd(O,a).catch(()=>{});const c=r.schlafen??v,o=r.pauseMs??L;let h=0,i=0;for(const{topic:a,lektion:y}of e)try{await c(o);const w=await s(P({...y,topic:a}));w?.length&&(await t.set(`${C}${a}`,x(w),"EX",b),await t.srem(O,a),h++),await c(o);const l=await s(D(a));l?.length&&await t.set(`${z}${a}`,x(l),"EX",b),i=0}catch{if(i++,i>=F){n(`cachly: embedding service unavailable \u2014 ${e.length-h} lessons wait in the backlog; smart_recall fills them in later.
15
- `);break}}return n(`cachly: search vectors for git lessons: ${h}/${e.length}.
16
- `),h}const p=new Map,E=new Map;function at(t){return E.get(t)}function ot(t){const e=p.get(t.instanzId);if(e)return e;const r=(async()=>(await(t.schlafen??v)(t.anlaufMs??M),V(t)))().catch(n=>({art:"fehler",grund:n instanceof Error?n.message:String(n)})).then(n=>(E.set(t.instanzId,n.art),n));return p.set(t.instanzId,r),r}function it(t){return p.has(t)}async function ct(t,e){return await t.set(u,JSON.stringify({stand:e,seit:new Date().toISOString()}),"NX")==="OK"}function lt(){p.clear(),E.clear(),d=""}export{M as ANLAUF_MS,L as EINBETT_PAUSE_MS,K as STARTVORRAT_LEKTIONEN,S as STARTWISSEN_COMMITS,u as STARTWISSEN_MARKE,lt as _startwissenZuruecksetzen,U as ausschlussGrund,ct as beanspruchStartwissen,j as echteGitWurzel,st as holeStartwissenHinweis,V as lerneAusGitGeschichte,ot as starteStartwissen,B as startvorratErlaubt,W as startvorratSatz,at as startwissenAusgang,it as startwissenGestartet,H as startwissenSatz,rt as waehleProjektOrdner};
5
+ `),{art:"hat-lektionen"};if(await o.set(u,JSON.stringify({stand:"laeuft",seit:new Date().toISOString(),ordner:s}),"NX")!=="OK")return{art:"schon-erledigt"};e(`cachly: new Brain \u2014 learning from the last ${E} commits of ${s} in the background.
6
+ `);const i=Date.now();try{await t.ausGit({instance_id:t.instanzId,repo_path:s,limit:E})}catch(h){const f=h instanceof Error?h.message:String(h);return await o.set(u,JSON.stringify({stand:"abgebrochen",am:new Date().toISOString(),grund:f.slice(0,200)})).catch(()=>{}),e(`cachly: import from git history failed: ${f}
7
+ `),{art:"fehler",grund:f}}const a=[];for(const h of await m(o,"cachly:lesson:best:*",{max:1e3})){const f=v(await o.get(h),{});(Array.isArray(f.tags)?f.tags:[]).includes("brain_from_git")&&a.push({topic:h.slice(19),lektion:f})}await o.set(u,JSON.stringify({stand:"fertig",am:new Date().toISOString(),ordner:s,lektionen:a.length})).catch(()=>{});const g=((Date.now()-i)/1e3).toFixed(1);e(`cachly: learned ${a.length} lessons from git history in ${g} s.
8
+ `),a.length>0&&(w=W(a.length,s));try{t.melde?.(a.length)}catch{}const p=await R(o,a,t,e);return{art:"fertig",ordner:s,lektionen:a.length,vektoren:p}}catch(r){const s=r instanceof Error?r.message:String(r);return e(`cachly: import from git history stopped: ${s}
9
+ `),{art:"fehler",grund:s}}}function H(t){return["","","---",`\u2139\uFE0F **cachly:** the project folder is not a git repository, so this new Brain loaded ${t} starter lesson${t===1?"":"s"} (common engineering fixes, tagged \`source: "starter"\`; they never override own lessons). \`smart_recall\` finds them now. Tell the user once.`].join(`
10
+ `)}async function Z(t,e,n){const r=t.startvorrat;if(!r)return{art:"kein-repo",ordner:e};const s=await t.verbindung(t.instanzId);if((await m(s,"cachly:lesson:best:*",{max:1})).length>0)return n(`cachly: this Brain already has lessons \u2014 no starter lessons.
11
+ `),{art:"hat-lektionen"};if(await s.set(u,JSON.stringify({stand:"startvorrat",seit:new Date().toISOString(),ordner:e}),"NX")!=="OK")return{art:"schon-erledigt"};n(`cachly: new Brain without git history \u2014 loading ${B} starter lessons in the background.
12
+ `);try{await r({instance_id:t.instanzId})}catch(i){const a=i instanceof Error?i.message:String(i);return await s.set(u,JSON.stringify({stand:"abgebrochen",am:new Date().toISOString(),grund:a.slice(0,200)})).catch(()=>{}),n(`cachly: loading starter lessons failed: ${a}
13
+ `),{art:"fehler",grund:a}}const o=[];for(const i of await m(s,"cachly:lesson:best:*",{max:1e3})){const a=v(await s.get(i),{});a.source==="starter"&&o.push({topic:i.slice(19),lektion:a})}await s.set(u,JSON.stringify({stand:"fertig",am:new Date().toISOString(),ordner:e,startvorrat:o.length})).catch(()=>{}),n(`cachly: loaded ${o.length} starter lessons.
14
+ `),o.length>0&&(w=H(o.length));try{t.meldeStartvorrat?.(o.length)}catch{}const l=await R(s,o,t,n);return{art:"startvorrat",ordner:e,lektionen:o.length,vektoren:l}}async function R(t,e,n,r){const s=n.einbetten;if(!s||e.length===0||!(n.hatEinbettung??(()=>!0))())return 0;for(const{topic:a}of e)await t.sadd($,a).catch(()=>{});const c=n.schlafen??b,o=n.pauseMs??I;let l=0,i=0;for(const{topic:a,lektion:g}of e)try{await c(o);const p=await s(x({...g,topic:a}));p?.length&&(await t.set(`${D}${a}`,S(p),"EX",_),await t.srem($,a),l++),await c(o);const h=await s(M(a));h?.length&&await t.set(`${C}${a}`,S(h),"EX",_),i=0}catch{if(i++,i>=K){r(`cachly: embedding service unavailable \u2014 ${e.length-l} lessons wait in the backlog; smart_recall fills them in later.
15
+ `);break}}return r(`cachly: search vectors for git lessons: ${l}/${e.length}.
16
+ `),l>0&&await Y(t,e,n,r),l}async function Y(t,e,n,r){const s=n.einbettenZweit;if(!s)return 0;const c=n.schlafen??b,o=n.pauseMs??I;let l=0;for(const{topic:i,lektion:a}of e)try{await c(o);const g=await s(x({...a,topic:i}));g?.length&&(await t.set(`${L}${i}`,S(g),"EX",_),l++)}catch{break}return r(`cachly: second-model vectors for git lessons: ${l}/${e.length}.
17
+ `),l}const y=new Map,O=new Map;function it(t){return O.get(t)}function ct(t){const e=y.get(t.instanzId);if(e)return e;const n=(async()=>(await(t.schlafen??b)(t.anlaufMs??F),j(t)))().catch(r=>({art:"fehler",grund:r instanceof Error?r.message:String(r)})).then(r=>(O.set(t.instanzId,r.art),r));return y.set(t.instanzId,n),n}function lt(t){return y.has(t)}async function ht(t,e){return await t.set(u,JSON.stringify({stand:e,seit:new Date().toISOString()}),"NX")==="OK"}function ft(){y.clear(),O.clear(),w=""}export{F as ANLAUF_MS,I as EINBETT_PAUSE_MS,B as STARTVORRAT_LEKTIONEN,E as STARTWISSEN_COMMITS,u as STARTWISSEN_MARKE,ft as _startwissenZuruecksetzen,U as ausschlussGrund,ht as beanspruchStartwissen,V as echteGitWurzel,ot as holeStartwissenHinweis,j as lerneAusGitGeschichte,ct as starteStartwissen,G as startvorratErlaubt,H as startvorratSatz,it as startwissenAusgang,lt as startwissenGestartet,W as startwissenSatz,at as waehleProjektOrdner};
package/glama.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://glama.ai/mcp/schemas/server.json",
3
- "version": "0.10.183",
3
+ "version": "0.10.185",
4
4
  "maintainers": [
5
5
  "HeinrichNebula"
6
6
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cachly-dev/mcp-server",
3
- "version": "0.10.183",
3
+ "version": "0.10.185",
4
4
  "mcpName": "io.github.cachly-dev/mcp-server",
5
5
  "description": "Solve it once. From then on, your AI knows. Experience for coding agents, EU-hosted: 124 MCP tools for Claude Code, Cursor, Copilot & Windsurf. Learns from every bug fix, commit and CI run.",
6
6
  "type": "module",
package/server.json CHANGED
@@ -6,13 +6,13 @@
6
6
  "url": "https://github.com/cachly-dev/cachly-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.10.183",
9
+ "version": "0.10.185",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "name": "@cachly-dev/mcp-server",
14
14
  "identifier": "@cachly-dev/mcp-server",
15
- "version": "0.10.183",
15
+ "version": "0.10.185",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }