@cachly-dev/mcp-server 0.10.224 → 0.10.225
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/README.md +4 -3
- package/dist/src/handlers/advanced.js +1 -1
- package/dist/src/handlers/brain.js +56 -56
- package/dist/src/handlers/team.js +1 -1
- package/dist/src/projektdateien.js +10 -4
- package/dist/src/uninstall.js +4 -4
- package/dist/src/wirkungsspur.js +1 -1
- package/glama.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -12,7 +12,7 @@ ${R}`).join("")}`}case"team_recall":{const{instance_id:l,topic:t,author:i,limit:
|
|
|
12
12
|
|
|
13
13
|
Shared instance: add lessons with \`learn_from_attempts\` and include an \`author\` field.`:`\u{1F4ED} No lessons in this brain yet.
|
|
14
14
|
|
|
15
|
-
All team members sharing this instance will see lessons here.`;const s=[`\u{1F465} **Team Brain** \u2014 ${r.length} lesson${r.length>1?"s":""}`,""];for(const n of r){const m=n.outcome==="success"?"\u2705":n.outcome==="partial"?"\u26A0\uFE0F":"\u274C",g=n.severity==="critical"?"\u{1F534} ":n.severity==="major"?"\u{1F7E1} ":"",v=n.reviewed_by?n.review_level==="senior"?" \u{1F6E1}\uFE0F":" \u2714\uFE0F":"",j=n.author?` \xB7 _by ${n.author}_`:"",$=n.reviewed_by?` \xB7 reviewed by ${n.reviewed_by}${(n.endorsements??0)>1?` +${(n.endorsements??0)-1}`:""}`:"",b=(n.recall_count??0)>0?` \xB7
|
|
15
|
+
All team members sharing this instance will see lessons here.`;const s=[`\u{1F465} **Team Brain** \u2014 ${r.length} lesson${r.length>1?"s":""}`,""];for(const n of r){const m=n.outcome==="success"?"\u2705":n.outcome==="partial"?"\u26A0\uFE0F":"\u274C",g=n.severity==="critical"?"\u{1F534} ":n.severity==="major"?"\u{1F7E1} ":"",v=n.reviewed_by?n.review_level==="senior"?" \u{1F6E1}\uFE0F":" \u2714\uFE0F":"",j=n.author?` \xB7 _by ${n.author}_`:"",$=n.reviewed_by?` \xB7 reviewed by ${n.reviewed_by}${(n.endorsements??0)>1?` +${(n.endorsements??0)-1}`:""}`:"",b=(n.recall_count??0)>0?` \xB7 in ${n.recall_count} answers`:"",S=Math.round((Date.now()-new Date(n.ts).getTime())/864e5),d=S===0?"today":S===1?"yesterday":`${S}d ago`;s.push(`${m} ${g}**\`${n.topic}\`**${v}${j}${$}${b} \xB7 ${d}`);const u=Me(n);u&&s.push(` ${u}`),s.push(` ${n.what_worked.slice(0,120)}`),s.push("")}return s.join(`
|
|
16
16
|
`)}case"team_synthesize":{const{instance_id:l,topic:t}=w,i=await _(l),a=`cachly:lessons:${t}`,o=await i.lrange(a,0,-1);if(o.length<2)return`\u{1F4ED} Need at least 2 entries for topic \`${t}\` to synthesize.
|
|
17
17
|
|
|
18
18
|
Currently: ${o.length} entr${o.length===1?"y":"ies"}.
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
const c="<!-- cachly-brain-start -->",p="<!-- cachly-brain-end -->";function
|
|
1
|
+
const c="<!-- cachly-brain-start -->",p="<!-- cachly-brain-end -->";function d(e=""){return new RegExp(`${c}[\\s\\S]*?${p}`,e)}const m=`---
|
|
2
2
|
description: Cachly AI Brain \u2014 persistent memory protocol (recall before tasks, learn after fixes)
|
|
3
3
|
alwaysApply: true
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
`,f
|
|
6
|
+
`,f=`---
|
|
7
|
+
name: cachly AI Brain
|
|
8
|
+
description: Persistent memory protocol (recall before tasks, learn after fixes)
|
|
9
|
+
alwaysApply: true
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
`,y={claude:".mcp.json",cursor:".cursor/mcp.json",windsurf:".windsurf/mcp.json",copilot:".vscode/mcp.json",continue:".continue/config.json",cline:".vscode/mcp.json",zed:".zed/settings.json"};function h(e,t,i,r,n){if(e.nurMitIdea&&!r(n(t,".idea")))return!1;if(e.nurMit){const a=(e.nurMit.projekt??[]).some(o=>r(n(t,o))),s=(e.nurMit.heim??[]).some(o=>r(n(i,o)));if(!a&&!s)return!1}return!0}async function _(e,t,i){const{writeFile:r,appendFile:n,readFile:a,mkdir:s}=await import("node:fs/promises"),{existsSync:o}=await import("node:fs"),{dirname:l}=await import("node:path");if(await s(l(e),{recursive:!0}),o(e)){const u=await a(e,"utf-8");return u.includes(c)?(await r(e,u.replace(d(),()=>t),"utf-8"),"updated"):(await n(e,`
|
|
7
13
|
`+t+`
|
|
8
14
|
`,"utf-8"),"appended")}return await r(e,(i??"")+t+`
|
|
9
|
-
`,"utf-8"),"written"}const
|
|
15
|
+
`,"utf-8"),"written"}const w=[{pfad:["CLAUDE.md"]},{pfad:["AGENTS.md"]},{pfad:[".github","copilot-instructions.md"]},{pfad:[".cursor","rules","cachly.mdc"],prefix:m},{pfad:[".windsurfrules"]},{pfad:[".clinerules"]},{pfad:[".aiassistant","rules","cachly.md"],nurMitIdea:!0},{pfad:["GEMINI.md"],nurMit:{projekt:[".gemini"],heim:[".gemini"]}},{pfad:[".junie","guidelines.md"],nurMit:{projekt:[".junie"]}},{pfad:[".continue","rules","cachly.md"],prefix:f,nurMit:{projekt:[".continue"],heim:[".continue"]}}];function E(e){return`${c}
|
|
10
16
|
## Cachly AI Brain \u2014 Always Active
|
|
11
17
|
|
|
12
18
|
The Brain MCP server runs automatically. Instance: \`${e}\`
|
|
@@ -61,4 +67,4 @@ Report predicted failure risks to the user before proceeding.
|
|
|
61
67
|
|
|
62
68
|
### Half-finished code rule:
|
|
63
69
|
Never commit code that does not compile. Run \`tsc --noEmit\` / \`go build ./...\` before every commit.
|
|
64
|
-
${p}`}export{
|
|
70
|
+
${p}`}export{w as ANWEISUNGS_DATEIEN,p as CLAUDE_MD_MARKER_END,c as CLAUDE_MD_MARKER_START,f as CONTINUE_RULE_FRONTMATTER,m as CURSOR_MDC_FRONTMATTER,y as EDITOR_FILES,d as blockMuster,E as buildClaudeMdBlock,_ as setzeAnweisungsblock,h as sollSchreiben};
|
package/dist/src/uninstall.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{existsSync as A,lstatSync as
|
|
1
|
+
import{existsSync as A,lstatSync as x,readFileSync as Z,readdirSync as v,rmSync as R,rmdirSync as ee,writeFileSync as te}from"node:fs";import{basename as b,dirname as C,isAbsolute as T,join as g,relative as I,resolve as k,sep as S}from"node:path";import{ANWEISUNGS_DATEIEN as ne,CLAUDE_MD_MARKER_END as H,CLAUDE_MD_MARKER_START as D,EDITOR_FILES as re,blockMuster as oe}from"./projektdateien.js";import{PROJEKT_HOOK_MARKE as $,istCachlyEintrag as N}from"./hook-zugang.js";import{CLS_BLOCK_RE as se}from"./cls-hook.js";import{BRAIN_WATCH_BLOCK_RE as ie}from"./brain-watch-hook.js";import{CLAUDE_HOOK_DIR as ae,CLAUDE_SETTINGS_DATEI as ce,CODEX_HOOKS_DATEI as le,CODEX_HOOK_DIR as he,COPILOT_HOOKS_DATEI as ue,COPILOT_HOOK_DIR as fe,CURSOR_HOOKS_DATEI as de,CURSOR_HOOK_DIR as pe,GEMINI_HOOK_DIR as me,GEMINI_SETTINGS_DATEI as z}from"./ambient-hooks.js";import{CURSOR_ABLAGE_ORDNER as ge}from"./cursor-hook.js";import{CODEX_CONFIG_DATEI as ye,ohneCodexMcpEintrag as ke}from"./editor-mcp-eintrag.js";import{COPILOT_ABLAGE_ORDNER as be}from"./copilot-hook.js";import{credentialsPath as P}from"./credentials.js";import{defaultLedgerPath as M,readLedger as ve}from"./ambient-ledger.js";import{defaultMilestonePath as je}from"./funnel-milestones.js";import{defaultKostprobePath as we}from"./kostprobe.js";import{standPfad as _e}from"./neue-fassung.js";import{AUFTRAG as Ee,FEHLSCHLAG as Oe,SPERRE as Se}from"./konto-anlegen.js";import{netBalance as $e}from"./ambient-recall.js";import{istTestSchluessel as Ae}from"./uebernahme.js";const xe='broken Stop hook from setup_ai_memory ("checkpoint" is not a command)',B="Your lessons stay in your cachly account. uninstall never deletes cloud data. To erase your account and everything in it (GDPR Art. 17), write to privacy@cachly.dev (https://cachly.dev/legal/datenschutz).",Re=[P({home:""}),M(),je(),we(),_e(""),Se,Oe,Ee].map(t=>b(t));function Ce(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}const Te=new RegExp(`^(?:${Re.map(Ce).join("|")})(?:\\.[\\w.-]*(?:tmp|genommen))?$`),Ie=/^cachly-(?:ambient|leser-sicherung|lernen-arme|projektversionen|startwissen-import)-[\w.-]+\.(?:json|jsonl|lock|tmp)$/,He=["cachly-lernen",b(ge),b(be)];function De(t,e){return e?He.includes(t):Ie.test(t)}function p(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function L(t){try{const e=JSON.parse(t);return p(e)?e:null}catch{return null}}function K(t,e){const n=/^([ \t]+)"/m.exec(e)?.[1]??2,r=e.includes(`\r
|
|
2
2
|
`);let o=JSON.stringify(t,null,n);return r&&(o=o.replace(/\n/g,`\r
|
|
3
3
|
`)),/\n$/.test(e)?o+(r?`\r
|
|
4
4
|
`:`
|
|
5
|
-
`):o}function y(t){try{return
|
|
5
|
+
`):o}function y(t){try{return x(t).isFile()?Z(t,"utf8"):null}catch{return null}}function F(t){try{return x(t).isDirectory()}catch{return!1}}function Ne(t){if(!p(t))return"";const n=(p(t.env)?t.env:p(t.command)&&p(t.command.env)?t.command.env:null)?.CACHLY_BRAIN_INSTANCE_ID;return typeof n=="string"?n:""}function j(t,e,n){const r=t[e];return!p(r)||!("cachly"in r)?!1:(n.push(r.cachly),delete r.cachly,Object.keys(r).length===0&&delete t[e],!0)}function G(t){return p(t)?p(t.env)&&("CACHLY_JWT"in t.env||"CACHLY_BRAIN_INSTANCE_ID"in t.env)?!0:JSON.stringify(t).includes("@cachly-dev/mcp-server"):!1}function w(t,e){const n=L(t);if(!n)return{art:"unlesbar"};const r=[],o=[];if(e==="mcpServers"&&j(n,"mcpServers",r)&&o.push("mcpServers.cachly"),e==="vscode"&&(j(n,"servers",r)&&o.push("servers.cachly"),j(n,"mcpServers",r)&&o.push("mcpServers.cachly")),e==="zed"&&j(n,"context_servers",r)&&o.push("context_servers.cachly"),e==="continue"){const a=n.experimental,c=p(a)?a.modelContextProtocolServers:void 0;if(p(a)&&Array.isArray(c)){const s=c.filter(l=>!G(l));s.length<c.length&&(r.push(...c.filter(G)),o.push(`experimental.modelContextProtocolServers (${c.length-s.length})`),s.length===0?delete a.modelContextProtocolServers:a.modelContextProtocolServers=s,Object.keys(a).length===0&&delete n.experimental)}}if(o.length===0)return{art:"nichts"};const i=r.map(Ne).find(Boolean)??"";return{art:"geaendert",nachher:Object.keys(n).length===0?null:K(n,t),entfernt:o,instanz:i}}function ze(t){if(N(t))return"ambient";const e=String(t?.command??"");return e.includes("@cachly-dev/mcp-server")&&e.includes(" checkpoint")?"checkpoint":null}function _(t){return N(t)?"ambient":null}function U(t,e,n=[]){const r=L(t);if(!r)return{art:"unlesbar"};const o=r.hooks;if(!p(o))return{art:"nichts"};const i=[];for(const[c,s]of Object.entries(o)){if(!Array.isArray(s))continue;const l=i.length,h=[];for(const u of s){const d=p(u)&&Array.isArray(u.hooks)?u.hooks:null;if(!d){const f=e(u);f?i.push(f):h.push(u);continue}const m=d.filter(f=>{const O=e(f);return O&&i.push(O),!O});m.length===d.length?h.push(u):m.length>0&&h.push({...u,hooks:m})}i.length!==l&&(h.length===0?delete o[c]:o[c]=h)}return i.length===0?{art:"nichts"}:(Object.keys(o).length===0&&delete r.hooks,{art:"geaendert",nachher:Object.keys(r).filter(c=>!n.includes(c)).length===0?null:K(r,t),entfernt:i,instanz:""})}function Pe(t,e,n){let r=e;t[e-1]===`
|
|
6
6
|
`&&(r=t[e-2]==="\r"?e-2:e-1);let o=n;return t[n]===`
|
|
7
7
|
`?o=n+1:t[n]==="\r"&&t[n+1]===`
|
|
8
8
|
`&&(o=n+2),r<e&&o>n&&r>0&&o<t.length&&t[r-1]!==`
|
|
@@ -11,6 +11,6 @@ import{existsSync as A,lstatSync as R,readFileSync as Z,readdirSync as v,rmSync
|
|
|
11
11
|
|
|
12
12
|
`:"")+l,n.push(i)}if(n.length===0)return{rest:t,entfernt:n};const o=e.trim();return o===""||o.startsWith("#!")&&!o.includes(`
|
|
13
13
|
`)?{rest:"",entfernt:n}:{rest:e.replace(/\s+$/,"")+`
|
|
14
|
-
`,entfernt:n}}function Fe(t,e){const n=I(e,t);return n!==""&&!n.startsWith("..")&&!T(n)}function W(t,e,n,r){const o=new Set(t.filter(c=>c.stufe===e&&(c.aktion==="datei-loeschen"||c.aktion==="ordner-loeschen")).map(c=>c.pfad)),i=new Set;for(const c of o)for(let s=C(c);s!==r&&Fe(s,n)&&!s.split(S).includes(".git");s=C(s))i.add(s);const a=[];for(const c of[...i].sort((s,l)=>l.length-s.length)){let s;try{s=v(c)}catch{continue}s.every(l=>o.has(g(c,l)))&&(o.add(c),a.push({stufe:e,aktion:"ordner-entfernen",pfad:c,was:"empty folder"}))}return a}function Ge(t,e){const n=new Map;for(const[r,o]of Object.entries(re))n.set(o,r==="continue"?"continue":r==="zed"?"zed":o===".vscode/mcp.json"?"vscode":"mcpServers");for(const[r,o]of n){const i=k(t.projekt,r),a=y(i);if(A(`${i}.bak`)&&e.funde.push({stufe:"projekt",aktion:"melden",pfad:`${i}.bak`,was:"your old file is there; uninstall does not restore it"}),a===null)continue;const c=w(a,o);if(c.art==="unlesbar"){a.includes("cachly")&&e.vonHand.push({stufe:"projekt",text:`${r}: cannot be read as plain JSON (comments or another format). Remove the "cachly" entry by hand.`});continue}c.art!=="nichts"&&(e.instanz||=c.instanz,c.nachher===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:i,was:'MCP server entry "cachly", the only thing in the file',vorher:a}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:i,was:'MCP server entry "cachly"; other servers and settings stay',vorher:a,nachher:c.nachher}))}}function Ue(t,e){for(const n of ne){const r=k(t.projekt,...n.pfad),o=y(r);if(o===null)continue;const i=n.pfad.join("/"),a=Me(o);if(a.art==="kein-block"){o.startsWith("# cachly AI Brain")&&e.vonHand.push({stufe:"projekt",text:`${i}: looks like the whole file was written by the setup_ai_memory tool (no markers). Check it and remove it by hand if it is not yours.`});continue}if(a.art==="kaputt"){e.vonHand.push({stufe:"projekt",text:`${i}: a cachly marker has no partner. Remove the block by hand.`});continue}Le(a.rest,i.endsWith(".mdc"))?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:r,was:"only the cachly block was in it",vorher:o}):e.funde.push({stufe:"projekt",aktion:"block-entfernen",pfad:r,was:"cachly block between the markers; your text stays as it is",vorher:o,nachher:a.rest})}}function E(t,e,n,r,o){const i=k(t.projekt,n),a=y(i);if(a===null)return;const c=U(a,r,o);if(c.art==="unlesbar"){(a.includes($)||a.includes("@cachly-dev/mcp-server"))&&e.vonHand.push({stufe:"projekt",text:`${n}: cannot be read as plain JSON (comments or another format). Remove the cachly hooks by hand.`});return}if(c.art==="nichts")return;const s=c.entfernt.filter(u=>u==="ambient").length,l=c.entfernt.filter(u=>u==="checkpoint").length,h=[...s?[`${s} Ambient Recall hook${s===1?"":"s"}`]:[],...l?[`${l} ${Re}`]:[]];c.nachher===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:i,was:`${h.join(" and ")}, the only thing in the file`,vorher:a}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:i,was:`${h.join(" and ")}; other hooks and settings stay`,vorher:a,nachher:c.nachher})}function We(t,e,n){const r=k(t.projekt,n);let o;try{o=v(r)}catch{return}for(const i of o.sort()){const a=g(r,i);!i.startsWith($)||y(a)===null||e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:a,was:"Ambient Recall hook script"})}}function Je(t,e){E(t,e,ce,ze,[]),E(t,e,de,_,["version"]),E(t,e,ue,_,["version"]),E(t,e,le,_,[]),Ye(t,e);for(const n of[ae,pe,fe,he,me])We(t,e,n);Ve(t,e)}function Ye(t,e){const n=k(t.projekt,z),r=y(n);if(r===null)return;const o=U(r,_,[]);if(o.art==="unlesbar"){(r.includes($)||r.includes("@cachly-dev/mcp-server"))&&e.vonHand.push({stufe:"projekt",text:`${z}: cannot be read as plain JSON (comments or another format). Remove the cachly hooks and the MCP server "cachly" by hand.`});return}const i=o.art==="geaendert"?o.nachher:r,a=i===null?{art:"nichts"}:w(i,"mcpServers"),c=a.art==="geaendert"?a.nachher:i;if(o.art!=="geaendert"&&a.art!=="geaendert")return;a.art==="geaendert"&&(e.instanz||=a.instanz);const s=o.art==="geaendert"?o.entfernt.length:0,l=[...s?[`${s} Ambient Recall hook${s===1?"":"s"}`]:[],...a.art==="geaendert"?['MCP server entry "cachly"']:[]];c===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:n,was:`${l.join(" and ")}, the only thing in the file`,vorher:r}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:n,was:`${l.join(" and ")}; other servers, hooks and settings stay`,vorher:r,nachher:c})}function Ve(t,e){const n=k(t.projekt,ye),r=y(n);if(r===null)return;const o=ke(r);o.entfernt&&(o.rest===""?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:n,was:"MCP server table [mcp_servers.cachly], the only thing in the file",vorher:r}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:n,was:"MCP server table [mcp_servers.cachly]; other settings stay",vorher:r,nachher:o.rest}))}function Xe(t,e){const n=g(t.projekt,".git");if(!A(n))return;if(!F(n)){e.vonHand.push({stufe:"projekt",text:".git is a file here (a Git worktree). cachly never writes a post-commit hook there. If you set one up in the main repository, check its .git/hooks/post-commit."});return}const r=g(n,"hooks","post-commit"),o=y(r);if(o===null)return;const i=Ke(o);if(i.entfernt.length===0)return;const a=i.entfernt.join(" and ");i.rest===""?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:r,was:`${a}, the only thing in the hook`,vorher:o}):e.funde.push({stufe:"projekt",aktion:"block-entfernen",pfad:r,was:`${a}; your own commands stay`,vorher:o,nachher:i.rest})}function qe(t,e){const n=g(t.heim,".claude","mcp.json"),r=y(n);if(r!==null){const s=w(r,"mcpServers");s.art==="unlesbar"&&r.includes("cachly")?e.vonHand.push({stufe:"global",text:'~/.claude/mcp.json: cannot be read as plain JSON. Remove the "cachly" entry by hand.'}):s.art==="geaendert"&&(e.instanz||=s.instanz,s.nachher===null?e.funde.push({stufe:"global",aktion:"datei-loeschen",pfad:n,was:'MCP server entry "cachly", the only thing in the file (it holds your key)',vorher:r}):e.funde.push({stufe:"global",aktion:"eintrag-entfernen",pfad:n,was:'MCP server entry "cachly" (it holds your key); other servers stay',vorher:r,nachher:s.nachher}))}for(const s of[g(t.heim,".cursor","mcp.json"),g(t.heim,".codeium","windsurf","mcp_config.json")]){const l=y(s);if(l===null)continue;const h=w(l,"mcpServers");(h.art==="geaendert"||h.art==="unlesbar"&&l.includes("cachly"))&&e.funde.push({stufe:"global",aktion:"melden",pfad:s,was:'has a "cachly" server entry. You set this file up yourself, so uninstall leaves it. Remove the entry by hand.'})}const o=g(t.heim,".cachly");let i=[];try{i=v(o)}catch{}const a=[];for(const s of i.sort()){const l=g(o,s);if(Te.test(s)&&y(l)!==null){const h=s===b(P({home:""}))?"your key and Brain id; other projects on this computer lose their access":"cachly data on this computer";e.funde.push({stufe:"global",aktion:"datei-loeschen",pfad:l,was:h})}else a.push(s)}a.length>0&&e.vonHand.push({stufe:"global",text:`~/.cachly also holds ${a.join(", ")}. Not written by this package, so it stays.${a.includes("vscode-mcp.env")?" vscode-mcp.env holds your key (written by the VS Code extension): uninstall the extension, then delete it.":""}`});let c=[];try{c=v(t.tmp)}catch{}for(const s of c.sort()){if(!s.startsWith("cachly-"))continue;const l=g(t.tmp,s),h=F(l);De(s,h)&&e.funde.push({stufe:"global",aktion:h?"ordner-loeschen":"datei-loeschen",pfad:l,was:"cache in the temp folder"})}}function Qe(t){const e={projekt:k(t.projekt),heim:k(t.heim),tmp:k(t.tmp)},n={funde:[],vonHand:[],instanz:""};return Ge(e,n),Ue(e,n),Je(e,n),Xe(e,n),qe(e,n),n.funde.push(...W(n.funde,"projekt",e.projekt,e.tmp)),n.funde.push(...W(n.funde,"global",e.heim,e.tmp)),n}function J(t){return t.split(S).length}function Y(t){return[...t].sort((n,r)=>{const o=i=>i.aktion==="ordner-entfernen"?1:0;return o(n)-o(r)||(o(n)?J(r.pfad)-J(n.pfad):0)}).map(n=>{if(n.aktion==="melden")return{fund:n,status:"uebersprungen",grund:"only reported"};try{return n.vorher!==void 0&&y(n.pfad)!==n.vorher?{fund:n,status:"uebersprungen",grund:"the file changed after the plan was made"}:(n.aktion==="datei-loeschen"?x(n.pfad,{force:!0}):n.aktion==="ordner-loeschen"?x(n.pfad,{recursive:!0,force:!0}):n.aktion==="ordner-entfernen"?ee(n.pfad):te(n.pfad,n.nachher??"","utf8"),{fund:n,status:"entfernt"})}catch(r){const o=r.code==="ENOTEMPTY"?"the folder is not empty":r.message;return{fund:n,status:"uebersprungen",grund:o}}})}async function Ze(t){const e=await ve(g(t.heim,".cachly",b(M()))),n=$e(e),r={schluessel:t.schluessel?Ae(t.schluessel)?"test":"konto":"keiner",turns:e.length,injected:n.injected,prevented:n.prevented,net:n.net,lektionen:null};if(!t.schluessel||!t.instanz)return r.lektionenFehlt="no-instance",r;try{const o=await(t.fetchFn??fetch)(`${t.apiUrl}/api/v1/instances/${t.instanz}/memory`,{headers:{Authorization:`Bearer ${t.schluessel}`},signal:AbortSignal.timeout(5e3)});if(!o.ok)throw new Error(`HTTP ${o.status}`);const i=(await o.json()).lesson_count;if(typeof i!="number")throw new Error("no lesson_count");r.lektionen=i}catch{r.lektionenFehlt="unreachable"}return r}const et={"datei-loeschen":"delete file","ordner-loeschen":"delete folder","ordner-entfernen":"remove folder","eintrag-entfernen":"remove entry","block-entfernen":"remove block",melden:"note only"};function V(t,e){const n=t.stufe==="projekt"?e.projekt:e.heim,r=I(n,t.pfad),o=r!==""&&!r.startsWith("..")&&!T(r),i=(o?r:t.pfad).split(S).join("/");return t.stufe==="global"&&o?`~/${i}`:i}function tt(t,e){const n=e.ausgabe;n(""),n("What you have right now");const r=t.schluessel==="test"?"test key (cky_trial_), the Brain behind it is a test Brain":t.schluessel==="konto"?"account key":"none found";n(` Key: ${r}`);const o=t.lektionen!==null?`${t.lektionen} in your Brain`:t.lektionenFehlt==="no-instance"?"unknown (no key or Brain found here)":"not reachable right now";n(` Lessons: ${o}`),n(t.turns>0?` Ledger: ${t.turns} turns, ${t.injected} tokens injected, ${t.prevented} prevented, net ${t.net>=0?"+":""}${t.net} tokens`:" Ledger: no turns recorded"),n(" To keep your lessons first, write them to disk:"),n(" npx @cachly-dev/mcp-server@latest export")}function X(t,e,n){n.ausgabe(""),n.ausgabe(t);for(const r of e)n.ausgabe(` ${et[r.aktion].padEnd(14)} ${V(r,n)} (${r.was})`)}function q(t,e,n){n.ausgabe(""),n.ausgabe("By hand (uninstall cannot do these):"),n.ausgabe(' - If you registered cachly with "codex mcp add" or "gemini mcp add -s user", it is in ~/.codex/config.toml or ~/.gemini/settings.json. Remove the entry named cachly there (the project files above are handled).'),n.ausgabe(' - Uninstall the JetBrains plugin "Cachly Brain" (Settings, Plugins) and the VS Code extension "cachly Brain" (cachly-dev.cachly-brain), if you installed them.');for(const r of t.vonHand)(r.stufe==="projekt"||e)&&n.ausgabe(` - ${r.text}`)}function Q(t,e){e.ausgabe("");for(const r of t){if(r.fund.aktion==="melden")continue;const o=r.status==="entfernt"?"removed":"skipped";e.ausgabe(` ${o.padEnd(8)} ${V(r.fund,e)}${r.grund?` (${r.grund})`:""}`)}const n=t.filter(r=>r.fund.aktion!=="melden");e.ausgabe(`Done: ${n.filter(r=>r.status==="entfernt").length} removed, ${n.filter(r=>r.status==="uebersprungen").length} skipped.`)}function nt(t){return{dryRun:t.includes("--dry-run"),ja:t.includes("--yes")||t.includes("-y"),global:t.includes("--global")}}async function jt(t,e){const n=nt(t),r=Qe({projekt:e.projekt,heim:e.heim,tmp:e.tmp}),o=await Ze({heim:e.heim,schluessel:e.schluessel,instanz:e.instanz||r.instanz,apiUrl:e.apiUrl,fetchFn:e.fetchFn});tt(o,e);const i=r.funde.filter(d=>d.stufe==="projekt"),a=r.funde.filter(d=>d.stufe==="global"),c=i.filter(d=>d.aktion!=="melden"),s=a.filter(d=>d.aktion!=="melden");if(i.length===0&&(!n.global||a.length===0))return e.ausgabe(""),e.ausgabe(`Nothing found in ${e.projekt}${n.global?" or your home folder":""}: cachly has not written anything here that uninstall can remove.`),!n.global&&s.length>0&&e.ausgabe(`Your home folder still holds ${s.length} cachly files (key, ledger, caches). "uninstall --global" removes them.`),q(r,n.global,e),e.ausgabe(""),e.ausgabe(B),0;if(i.length>0&&X(`In this project (${e.projekt}):`,i,e),n.global&&a.length>0&&X("In your home folder and temp folder (--global):",a,e),q(r,n.global,e),e.ausgabe(""),e.ausgabe(B),n.dryRun)return e.ausgabe(""),e.ausgabe("Dry run: nothing was changed."),!n.global&&s.length>0&&e.ausgabe(`Your home and temp folders hold ${s.length} more cachly files (key, ledger, caches); add --global to include them.`),0;if(!(c.length>0||n.global&&s.length>0))return e.ausgabe(""),e.ausgabe("Nothing to remove."),0;if(!n.ja&&!e.istTty)return e.ausgabe(""),e.ausgabe('This is not a terminal and --yes is missing: nothing was changed. Run it in a terminal, or add --yes. "--dry-run" only shows the plan.'),1;let h=0,u=0;if(c.length>0)if(n.ja||await e.frage(`
|
|
14
|
+
`,entfernt:n}}function Fe(t,e){const n=I(e,t);return n!==""&&!n.startsWith("..")&&!T(n)}function W(t,e,n,r){const o=new Set(t.filter(c=>c.stufe===e&&(c.aktion==="datei-loeschen"||c.aktion==="ordner-loeschen")).map(c=>c.pfad)),i=new Set;for(const c of o)for(let s=C(c);s!==r&&Fe(s,n)&&!s.split(S).includes(".git");s=C(s))i.add(s);const a=[];for(const c of[...i].sort((s,l)=>l.length-s.length)){let s;try{s=v(c)}catch{continue}s.every(l=>o.has(g(c,l)))&&(o.add(c),a.push({stufe:e,aktion:"ordner-entfernen",pfad:c,was:"empty folder"}))}return a}function Ge(t,e){const n=new Map;for(const[r,o]of Object.entries(re))n.set(o,r==="continue"?"continue":r==="zed"?"zed":o===".vscode/mcp.json"?"vscode":"mcpServers");for(const[r,o]of n){const i=k(t.projekt,r),a=y(i);if(A(`${i}.bak`)&&e.funde.push({stufe:"projekt",aktion:"melden",pfad:`${i}.bak`,was:"your old file is there; uninstall does not restore it"}),a===null)continue;const c=w(a,o);if(c.art==="unlesbar"){a.includes("cachly")&&e.vonHand.push({stufe:"projekt",text:`${r}: cannot be read as plain JSON (comments or another format). Remove the "cachly" entry by hand.`});continue}c.art!=="nichts"&&(e.instanz||=c.instanz,c.nachher===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:i,was:'MCP server entry "cachly", the only thing in the file',vorher:a}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:i,was:'MCP server entry "cachly"; other servers and settings stay',vorher:a,nachher:c.nachher}))}}function Ue(t,e){for(const n of ne){const r=k(t.projekt,...n.pfad),o=y(r);if(o===null)continue;const i=n.pfad.join("/"),a=Me(o);if(a.art==="kein-block"){o.startsWith("# cachly AI Brain")&&e.vonHand.push({stufe:"projekt",text:`${i}: looks like the whole file was written by the setup_ai_memory tool (no markers). Check it and remove it by hand if it is not yours.`});continue}if(a.art==="kaputt"){e.vonHand.push({stufe:"projekt",text:`${i}: a cachly marker has no partner. Remove the block by hand.`});continue}Le(a.rest,i.endsWith(".mdc")||n.prefix!==void 0)?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:r,was:"only the cachly block was in it",vorher:o}):e.funde.push({stufe:"projekt",aktion:"block-entfernen",pfad:r,was:"cachly block between the markers; your text stays as it is",vorher:o,nachher:a.rest})}}function E(t,e,n,r,o){const i=k(t.projekt,n),a=y(i);if(a===null)return;const c=U(a,r,o);if(c.art==="unlesbar"){(a.includes($)||a.includes("@cachly-dev/mcp-server"))&&e.vonHand.push({stufe:"projekt",text:`${n}: cannot be read as plain JSON (comments or another format). Remove the cachly hooks by hand.`});return}if(c.art==="nichts")return;const s=c.entfernt.filter(u=>u==="ambient").length,l=c.entfernt.filter(u=>u==="checkpoint").length,h=[...s?[`${s} Ambient Recall hook${s===1?"":"s"}`]:[],...l?[`${l} ${xe}`]:[]];c.nachher===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:i,was:`${h.join(" and ")}, the only thing in the file`,vorher:a}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:i,was:`${h.join(" and ")}; other hooks and settings stay`,vorher:a,nachher:c.nachher})}function We(t,e,n){const r=k(t.projekt,n);let o;try{o=v(r)}catch{return}for(const i of o.sort()){const a=g(r,i);!i.startsWith($)||y(a)===null||e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:a,was:"Ambient Recall hook script"})}}function Je(t,e){E(t,e,ce,ze,[]),E(t,e,de,_,["version"]),E(t,e,ue,_,["version"]),E(t,e,le,_,[]),Ye(t,e);for(const n of[ae,pe,fe,he,me])We(t,e,n);Ve(t,e)}function Ye(t,e){const n=k(t.projekt,z),r=y(n);if(r===null)return;const o=U(r,_,[]);if(o.art==="unlesbar"){(r.includes($)||r.includes("@cachly-dev/mcp-server"))&&e.vonHand.push({stufe:"projekt",text:`${z}: cannot be read as plain JSON (comments or another format). Remove the cachly hooks and the MCP server "cachly" by hand.`});return}const i=o.art==="geaendert"?o.nachher:r,a=i===null?{art:"nichts"}:w(i,"mcpServers"),c=a.art==="geaendert"?a.nachher:i;if(o.art!=="geaendert"&&a.art!=="geaendert")return;a.art==="geaendert"&&(e.instanz||=a.instanz);const s=o.art==="geaendert"?o.entfernt.length:0,l=[...s?[`${s} Ambient Recall hook${s===1?"":"s"}`]:[],...a.art==="geaendert"?['MCP server entry "cachly"']:[]];c===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:n,was:`${l.join(" and ")}, the only thing in the file`,vorher:r}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:n,was:`${l.join(" and ")}; other servers, hooks and settings stay`,vorher:r,nachher:c})}function Ve(t,e){const n=k(t.projekt,ye),r=y(n);if(r===null)return;const o=ke(r);o.entfernt&&(o.rest===""?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:n,was:"MCP server table [mcp_servers.cachly], the only thing in the file",vorher:r}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:n,was:"MCP server table [mcp_servers.cachly]; other settings stay",vorher:r,nachher:o.rest}))}function Xe(t,e){const n=g(t.projekt,".git");if(!A(n))return;if(!F(n)){e.vonHand.push({stufe:"projekt",text:".git is a file here (a Git worktree). cachly never writes a post-commit hook there. If you set one up in the main repository, check its .git/hooks/post-commit."});return}const r=g(n,"hooks","post-commit"),o=y(r);if(o===null)return;const i=Ke(o);if(i.entfernt.length===0)return;const a=i.entfernt.join(" and ");i.rest===""?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:r,was:`${a}, the only thing in the hook`,vorher:o}):e.funde.push({stufe:"projekt",aktion:"block-entfernen",pfad:r,was:`${a}; your own commands stay`,vorher:o,nachher:i.rest})}function qe(t,e){const n=g(t.heim,".claude","mcp.json"),r=y(n);if(r!==null){const s=w(r,"mcpServers");s.art==="unlesbar"&&r.includes("cachly")?e.vonHand.push({stufe:"global",text:'~/.claude/mcp.json: cannot be read as plain JSON. Remove the "cachly" entry by hand.'}):s.art==="geaendert"&&(e.instanz||=s.instanz,s.nachher===null?e.funde.push({stufe:"global",aktion:"datei-loeschen",pfad:n,was:'MCP server entry "cachly", the only thing in the file (it holds your key)',vorher:r}):e.funde.push({stufe:"global",aktion:"eintrag-entfernen",pfad:n,was:'MCP server entry "cachly" (it holds your key); other servers stay',vorher:r,nachher:s.nachher}))}for(const s of[g(t.heim,".cursor","mcp.json"),g(t.heim,".codeium","windsurf","mcp_config.json")]){const l=y(s);if(l===null)continue;const h=w(l,"mcpServers");(h.art==="geaendert"||h.art==="unlesbar"&&l.includes("cachly"))&&e.funde.push({stufe:"global",aktion:"melden",pfad:s,was:'has a "cachly" server entry. You set this file up yourself, so uninstall leaves it. Remove the entry by hand.'})}const o=g(t.heim,".cachly");let i=[];try{i=v(o)}catch{}const a=[];for(const s of i.sort()){const l=g(o,s);if(Te.test(s)&&y(l)!==null){const h=s===b(P({home:""}))?"your key and Brain id; other projects on this computer lose their access":"cachly data on this computer";e.funde.push({stufe:"global",aktion:"datei-loeschen",pfad:l,was:h})}else a.push(s)}a.length>0&&e.vonHand.push({stufe:"global",text:`~/.cachly also holds ${a.join(", ")}. Not written by this package, so it stays.${a.includes("vscode-mcp.env")?" vscode-mcp.env holds your key (written by the VS Code extension): uninstall the extension, then delete it.":""}`});let c=[];try{c=v(t.tmp)}catch{}for(const s of c.sort()){if(!s.startsWith("cachly-"))continue;const l=g(t.tmp,s),h=F(l);De(s,h)&&e.funde.push({stufe:"global",aktion:h?"ordner-loeschen":"datei-loeschen",pfad:l,was:"cache in the temp folder"})}}function Qe(t){const e={projekt:k(t.projekt),heim:k(t.heim),tmp:k(t.tmp)},n={funde:[],vonHand:[],instanz:""};return Ge(e,n),Ue(e,n),Je(e,n),Xe(e,n),qe(e,n),n.funde.push(...W(n.funde,"projekt",e.projekt,e.tmp)),n.funde.push(...W(n.funde,"global",e.heim,e.tmp)),n}function J(t){return t.split(S).length}function Y(t){return[...t].sort((n,r)=>{const o=i=>i.aktion==="ordner-entfernen"?1:0;return o(n)-o(r)||(o(n)?J(r.pfad)-J(n.pfad):0)}).map(n=>{if(n.aktion==="melden")return{fund:n,status:"uebersprungen",grund:"only reported"};try{return n.vorher!==void 0&&y(n.pfad)!==n.vorher?{fund:n,status:"uebersprungen",grund:"the file changed after the plan was made"}:(n.aktion==="datei-loeschen"?R(n.pfad,{force:!0}):n.aktion==="ordner-loeschen"?R(n.pfad,{recursive:!0,force:!0}):n.aktion==="ordner-entfernen"?ee(n.pfad):te(n.pfad,n.nachher??"","utf8"),{fund:n,status:"entfernt"})}catch(r){const o=r.code==="ENOTEMPTY"?"the folder is not empty":r.message;return{fund:n,status:"uebersprungen",grund:o}}})}async function Ze(t){const e=await ve(g(t.heim,".cachly",b(M()))),n=$e(e),r={schluessel:t.schluessel?Ae(t.schluessel)?"test":"konto":"keiner",turns:e.length,injected:n.injected,prevented:n.prevented,net:n.net,lektionen:null};if(!t.schluessel||!t.instanz)return r.lektionenFehlt="no-instance",r;try{const o=await(t.fetchFn??fetch)(`${t.apiUrl}/api/v1/instances/${t.instanz}/memory`,{headers:{Authorization:`Bearer ${t.schluessel}`},signal:AbortSignal.timeout(5e3)});if(!o.ok)throw new Error(`HTTP ${o.status}`);const i=(await o.json()).lesson_count;if(typeof i!="number")throw new Error("no lesson_count");r.lektionen=i}catch{r.lektionenFehlt="unreachable"}return r}const et={"datei-loeschen":"delete file","ordner-loeschen":"delete folder","ordner-entfernen":"remove folder","eintrag-entfernen":"remove entry","block-entfernen":"remove block",melden:"note only"};function V(t,e){const n=t.stufe==="projekt"?e.projekt:e.heim,r=I(n,t.pfad),o=r!==""&&!r.startsWith("..")&&!T(r),i=(o?r:t.pfad).split(S).join("/");return t.stufe==="global"&&o?`~/${i}`:i}function tt(t,e){const n=e.ausgabe;n(""),n("What you have right now");const r=t.schluessel==="test"?"test key (cky_trial_), the Brain behind it is a test Brain":t.schluessel==="konto"?"account key":"none found";n(` Key: ${r}`);const o=t.lektionen!==null?`${t.lektionen} in your Brain`:t.lektionenFehlt==="no-instance"?"unknown (no key or Brain found here)":"not reachable right now";n(` Lessons: ${o}`),n(t.turns>0?` Ledger: ${t.turns} turns, ${t.injected} tokens injected, ${t.prevented} prevented, net ${t.net>=0?"+":""}${t.net} tokens`:" Ledger: no turns recorded"),n(" To keep your lessons first, write them to disk:"),n(" npx @cachly-dev/mcp-server@latest export")}function X(t,e,n){n.ausgabe(""),n.ausgabe(t);for(const r of e)n.ausgabe(` ${et[r.aktion].padEnd(14)} ${V(r,n)} (${r.was})`)}function q(t,e,n){n.ausgabe(""),n.ausgabe("By hand (uninstall cannot do these):"),n.ausgabe(' - If you registered cachly with "codex mcp add" or "gemini mcp add -s user", it is in ~/.codex/config.toml or ~/.gemini/settings.json. Remove the entry named cachly there (the project files above are handled).'),n.ausgabe(' - Uninstall the JetBrains plugin "Cachly Brain" (Settings, Plugins) and the VS Code extension "cachly Brain" (cachly-dev.cachly-brain), if you installed them.');for(const r of t.vonHand)(r.stufe==="projekt"||e)&&n.ausgabe(` - ${r.text}`)}function Q(t,e){e.ausgabe("");for(const r of t){if(r.fund.aktion==="melden")continue;const o=r.status==="entfernt"?"removed":"skipped";e.ausgabe(` ${o.padEnd(8)} ${V(r.fund,e)}${r.grund?` (${r.grund})`:""}`)}const n=t.filter(r=>r.fund.aktion!=="melden");e.ausgabe(`Done: ${n.filter(r=>r.status==="entfernt").length} removed, ${n.filter(r=>r.status==="uebersprungen").length} skipped.`)}function nt(t){return{dryRun:t.includes("--dry-run"),ja:t.includes("--yes")||t.includes("-y"),global:t.includes("--global")}}async function jt(t,e){const n=nt(t),r=Qe({projekt:e.projekt,heim:e.heim,tmp:e.tmp}),o=await Ze({heim:e.heim,schluessel:e.schluessel,instanz:e.instanz||r.instanz,apiUrl:e.apiUrl,fetchFn:e.fetchFn});tt(o,e);const i=r.funde.filter(d=>d.stufe==="projekt"),a=r.funde.filter(d=>d.stufe==="global"),c=i.filter(d=>d.aktion!=="melden"),s=a.filter(d=>d.aktion!=="melden");if(i.length===0&&(!n.global||a.length===0))return e.ausgabe(""),e.ausgabe(`Nothing found in ${e.projekt}${n.global?" or your home folder":""}: cachly has not written anything here that uninstall can remove.`),!n.global&&s.length>0&&e.ausgabe(`Your home folder still holds ${s.length} cachly files (key, ledger, caches). "uninstall --global" removes them.`),q(r,n.global,e),e.ausgabe(""),e.ausgabe(B),0;if(i.length>0&&X(`In this project (${e.projekt}):`,i,e),n.global&&a.length>0&&X("In your home folder and temp folder (--global):",a,e),q(r,n.global,e),e.ausgabe(""),e.ausgabe(B),n.dryRun)return e.ausgabe(""),e.ausgabe("Dry run: nothing was changed."),!n.global&&s.length>0&&e.ausgabe(`Your home and temp folders hold ${s.length} more cachly files (key, ledger, caches); add --global to include them.`),0;if(!(c.length>0||n.global&&s.length>0))return e.ausgabe(""),e.ausgabe("Nothing to remove."),0;if(!n.ja&&!e.istTty)return e.ausgabe(""),e.ausgabe('This is not a terminal and --yes is missing: nothing was changed. Run it in a terminal, or add --yes. "--dry-run" only shows the plan.'),1;let h=0,u=0;if(c.length>0)if(n.ja||await e.frage(`
|
|
15
15
|
Remove these ${c.length} items from this project? [y/N] `)){const m=Y(i);Q(m,e),h+=m.filter(f=>f.status==="entfernt").length,u+=m.filter(f=>f.status==="uebersprungen"&&f.fund.aktion!=="melden").length}else e.ausgabe("Project: nothing was changed.");if(n.global&&s.length>0)if(e.ausgabe(""),e.ausgabe("Home folder: this removes your key file. Other projects on this computer lose their access to the Brain."),o.schluessel==="test"&&e.ausgabe('It is a test key. Without it you cannot reach the test Brain again. "npx @cachly-dev/mcp-server@latest claim" keeps it in your own account first.'),n.ja||await e.frage(`
|
|
16
|
-
Remove these ${s.length} items from your home and temp folder? [y/N] `)){const m=Y(a);Q(m,e),h+=m.filter(f=>f.status==="entfernt").length,u+=m.filter(f=>f.status==="uebersprungen"&&f.fund.aktion!=="melden").length}else e.ausgabe("Home folder: nothing was changed.");else!n.global&&s.length>0&&(e.ausgabe(""),e.ausgabe(`Your home folder still holds ${s.length} cachly files (key, ledger, caches). "uninstall --global" removes them, with its own question.`));return h===0&&u===0&&e.ausgabe("Nothing was changed."),u>0?1:0}export{
|
|
16
|
+
Remove these ${s.length} items from your home and temp folder? [y/N] `)){const m=Y(a);Q(m,e),h+=m.filter(f=>f.status==="entfernt").length,u+=m.filter(f=>f.status==="uebersprungen"&&f.fund.aktion!=="melden").length}else e.ausgabe("Home folder: nothing was changed.");else!n.global&&s.length>0&&(e.ausgabe(""),e.ausgabe(`Your home folder still holds ${s.length} cachly files (key, ledger, caches). "uninstall --global" removes them, with its own question.`));return h===0&&u===0&&e.ausgabe("Nothing was changed."),u>0?1:0}export{xe as KAPUTTER_STOP_HOOK,Me as entferneAnweisungsBlock,Ke as entferneGitHookBloecke,U as entferneHookEintraege,w as entferneMcpEintrag,Y as fuehreAus,De as istCachlyAblage,Le as istLeerNachRueckbau,_ as klassifiziereAmbientHook,ze as klassifiziereClaudeHook,Qe as plane,Ze as sammleBestand,jt as uninstallBefehl};
|
package/dist/src/wirkungsspur.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const m=500,p=500;function o(e,n){return typeof e=="string"?e.trim().slice(0,n):""}function d(e,n){const t=o(e.frage,500);if(!t)return{ok:!1,grund:"frage fehlt \u2014 ohne die Frage ist der Eintrag wertlos"};const r=o(e.thema,200);return r?typeof e.geholfen!="boolean"?{ok:!1,grund:'geholfen muss true oder false sein \u2014 "weiss nicht" ist keine Rueckmeldung'}:typeof e.platz!="number"||!Number.isInteger(e.platz)||e.platz<0?{ok:!1,grund:"platz muss eine ganze Zahl ab 0 sein (0 = die Lektion stand gar nicht in der Antwort)"}:{ok:!0,eintrag:{ts:n,quelle:"gemeldet",frage:t,thema:r,geholfen:e.geholfen,platz:e.platz,notiz:o(e.notiz,500),autor:o(e.autor,80)}}:{ok:!1,grund:"thema fehlt \u2014 welche Lektion ist gemeint?"}}function A(e,n,t){if(!e)return null;const r=o(e.frage,500),f=o(n,200);if(!r||!f||!Array.isArray(e.themen))return null;const l=e.themen.indexOf(f);return{ts:t,quelle:"abgeleitet",frage:r,thema:f,geholfen:!0,platz:l===-1?0:l+1,notiz:l===-1?"automatisch: geoeffnet, obwohl nicht in der Antwort":"automatisch: aus der Antwort geoeffnet",autor:""}}const a=3;function c(e){return e.geholfen&&e.platz===0?"fehlender-treffer":e.geholfen&&e.platz>a?"zu-weit-hinten":!e.geholfen&&e.platz>0&&e.platz<=a?"falsch-und-sicher":e.geholfen?"bestaetigung":"unauffaellig"}function z(e){const n={"fehlender-treffer":0,"zu-weit-hinten":0,"falsch-und-sicher":0,bestaetigung:0,unauffaellig:0};let t=0,r=0,f=0,l=0,s=0,u=0,h=0;for(const i of e){n[c(i)]++;const g=i.platz>0&&i.platz<=a;if(i.quelle==="abgeleitet"){r++,u++,g&&h++;continue}t++,i.geholfen&&(f++,l++,g&&s++)}return{gesamt:e.length,gemeldet:t,abgeleitet:r,geholfen:f,trefferquote:l===0?null:s/l,auswahlquote:u===0?null:h/u,nachLehrwert:n}}function w(e){const n=new Map;for(const t of e){if(!t||typeof t.thema!="string"||!t.thema)continue;const r=n.get(t.thema)??{geholfen:0,geoeffnet:0};t.quelle==="gemeldet"&&t.geholfen===!0?r.geholfen++:t.quelle==="abgeleitet"&&r.geoeffnet++,n.set(t.thema,r)}return n}export{a as SICHTBARE_PLAETZE,w as belegeJeThema,c as lehrwert,A as leiteAb,d as pruefeWirkung,z as werteAus};
|
package/glama.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cachly-dev/mcp-server",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.225",
|
|
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: an MCP server 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.
|
|
9
|
+
"version": "0.10.225",
|
|
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.
|
|
15
|
+
"version": "0.10.225",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
}
|