@kitelev/exocortex-cli 16.245.1 → 16.245.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +3 -3
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // @kitelev/exocortex-cli v16.245.1
2
+ // @kitelev/exocortex-cli v16.245.2
3
3
  // CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more
4
4
  // License: MIT
5
5
 
@@ -555,7 +555,7 @@ Available prefixes: ${u}`,this.wellKnownPrefixes[n]&&c.push(`Add: PREFIX ${n}: <
555
555
  \u{1F4CA} Cache Statistics:`),console.log(` Triples: ${u.tripleCount.toLocaleString()}`),console.log(` Created: ${u.createdAt.toISOString()}`),console.log(` Valid: ${u.isValid?"\u2705 Yes":"\u274C No"}`),console.log(` Size: ${uye(u.sizeBytes)}`))}}}catch(t){ue.handle(t)}})}a(X6,"sparqlIndexCommand");function uye(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}a(uye,"formatBytes");at();var Fw=require("fs"),Qs=require("path");Rt();Ut();Sr();cr();function Q6(){return new he("resolve").description("Resolve UUID to file path").argument("<uuid>","Full or partial UUID to resolve").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--format <type>","Output format: uri|path|json (default: uri)","uri").option("--output <type>","Response format: text|json (for MCP tools)","text").option("--partial","Match partial UUIDs (returns all matches)").action(async(r,e)=>{let t=e.output||"text";ue.setFormat(t);try{let n=Date.now();if(!fye(r))throw new Ke(`Invalid UUID format: ${r}`,"exocortex resolve <uuid> [--format uri|path|json] [--partial]",{uuid:r});let i=(0,Qs.resolve)(e.vault);if(!(0,Fw.existsSync)(i))throw new Me(i);let s=dye(i,r,e.partial??!1),o=Date.now()-n;if(s.length===0){if(t==="json"){let c=pt.error("VALIDATION_FILE_NOT_FOUND",`UUID not found: ${r}`,3,{context:{uuid:r}});console.log(JSON.stringify(c,null,2))}else console.error(`UUID not found: ${r}`);process.exit(1)}e.partial||s.length>1?hye(s,i,e.format,t,r,o):pye(s[0],i,e.format,t,r,o)}catch(n){ue.handle(n)}})}a(Q6,"resolveCommand");function fye(r){if(r.length<4)return!1;let e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,t=/^[0-9a-f-]+$/i;return e.test(r)||t.test(r)}a(fye,"isValidUuidFormat");function dye(r,e,t){let n=[],i=e.toLowerCase();function s(o){let c=(0,Fw.readdirSync)(o,{withFileTypes:!0});for(let l of c){let u=(0,Qs.join)(o,l.name);if(l.isDirectory())!l.name.startsWith(".")&&l.name!=="node_modules"&&s(u);else if(l.isFile()&&l.name.endsWith(".md")){let f=l.name.toLowerCase();t?f.includes(i)&&n.push(u):(f.startsWith(i+".md")||f.startsWith(i+" ")||f.startsWith(i+"-"))&&n.push(u)}}}return a(s,"walk"),s(r),n}a(dye,"findFilesWithUuid");function J6(r){return`obsidian://vault/${encodeURI(r)}`}a(J6,"pathToObsidianUri");function Z6(r){let e=r.match(/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i);return e?e[1]:(0,Qs.basename)(r,".md")}a(Z6,"extractUuidFromFilename");function pye(r,e,t,n,i,s){let o=(0,Qs.relative)(e,r),c=J6(o),l=Z6((0,Qs.basename)(r));if(n==="json"){let u={uuid:l,path:o,absolutePath:r,uri:c},f=pt.success(u,{durationMs:s,searchUuid:i});console.log(JSON.stringify(f,null,2))}else switch(t){case"path":console.log(r);break;case"json":console.log(JSON.stringify({uuid:l,path:o,absolutePath:r,uri:c},null,2));break;default:console.log(c);break}}a(pye,"outputSingleResult");function hye(r,e,t,n,i,s){let o=r.map(c=>{let l=(0,Qs.relative)(e,c),u=J6(l);return{uuid:Z6((0,Qs.basename)(c)),path:l,absolutePath:c,uri:u}});if(n==="json"){let c=pt.success({matches:o,count:o.length},{durationMs:s,searchUuid:i,itemCount:o.length});console.log(JSON.stringify(c,null,2))}else switch(t){case"path":for(let c of o)console.log(c.absolutePath);break;case"json":console.log(JSON.stringify(o,null,2));break;default:for(let c of o)console.log(c.uri);break}}a(hye,"outputMultipleResults");at();var JO=require("fs"),Js=require("path"),zr=te(ke());Rt();Ut();cr();No();var e7=te(ke());function Dw(r,e){return t=>{let n=typeof t.filePath=="string"&&t.filePath.length>0?t.filePath:null;if(n===null||n.split("/").includes("09 Templates"))return!1;let i=r.getAbstractFileByPath(n);if(i===null||!("basename"in i))return!1;let s=i,o=r.getFrontmatter(s)??{},c=e.getExpectedFolderSync(s,o),l=typeof t.currentFolder=="string"?t.currentFolder:s.parent?.path??"";return(0,e7.needsFolderRepair)(l,c)}}a(Dw,"createIsInWrongFolderHostFunction");var t7=te(ke());function Lw(r){return e=>{let t=typeof e.filePath=="string"&&e.filePath.length>0?e.filePath:null;if(t===null||t.split("/").includes("09 Templates"))return!1;let n=r.getAbstractFileByPath(t);if(n===null||!("basename"in n))return!1;let i=n,s=r.getFrontmatter(i)??{};return(0,t7.hasEmptyProperties)(s)}}a(Lw,"createHasEmptyPropertiesHostFunction");var kw={debug(r,e){process.env.EXOCORTEX_DEBUG&&Nw("debug",r,e)},info(r,e){Nw("info",r,e)},warn(r,e){Nw("warn",r,e)},error(r,e,t){Nw("error",e?`${r} \u2014 ${e.message}`:r,t)}};function Nw(r,e,t){let n=t&&Object.keys(t).length>0?` ${mye(t)}`:"";process.stderr.write(`[${r}] ${e}${n}
556
556
  `)}a(Nw,"write");function mye(r){try{return JSON.stringify(r)}catch{return"[uninspectable context]"}}a(mye,"safeJson");qa();var gye=/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.md$/i;function r7(r){let e=Array.isArray(r)?r[0]:r;if(typeof e!="string")return null;let t=e.replace(/["'[\]]/g,"").trim(),n=t.indexOf("|");return n!==-1&&(t=t.slice(0,n).trim()),t.length>0?t:null}a(r7,"cleanRef");function yye(r){if(!r)return[];let e=r.exo__Instance_class,t=[],n=a(i=>{let s=r7(i);s&&!t.includes(s)&&t.push(s)},"collect");if(typeof e=="string")n(e);else if(Array.isArray(e))for(let i of e)n(i);return t}a(yye,"extractClasses");function bye(r){let e=r.match(/\/ontology\/([^#/]+)#(.+)$/);return e?`${e[1]}__${e[2]}`:null}a(bye,"ontologyIriToSymbolic");async function _ye(r,e){let t=await r.match(new zr.IRI(e),zr.Namespace.EXO.term("Instance_class"),void 0),n=[];for(let i of t){let s=typeof i.object.value=="string"?i.object.value:String(i.object),o=bye(s);o&&!n.includes(o)&&n.push(o)}return n}a(_ye,"deriveStoreSymbolicClasses");async function Sye(r){let e=new zr.IRI("https://exocortex.my/ontology/exocmd#Command_cliName"),t=await r.match(void 0,e,void 0),n=new Map;for(let i of t){let s=typeof i.subject.value=="string"?i.subject.value:String(i.subject),o=typeof i.object.value=="string"?i.object.value:String(i.object),c=s.match(gye);c&&o.length>0&&n.set(c[1],o)}return n}a(Sye,"buildCliNameMap");async function wye(r,e,t=(0,zr.liveClock)(),n={}){let i=(0,Js.resolve)(r);if(!(0,JO.existsSync)(i))throw new Me(i);let s=(0,Js.resolve)(i,e);if(!(0,JO.existsSync)(s))throw new Error(`Target file not found: ${e}`);let o=(0,Js.relative)(i,s);if(o===".."||o.startsWith(`..${Js.sep}`)||(0,Js.isAbsolute)(o))throw new Error(`Target is outside the vault: ${e} (vault: ${i})`);let c=new er(i),l=n.useCache??!1,u=await mi(i,{useCache:l,vaultAdapter:c});l&&n.log?.(_u(u));let f=new zr.InMemoryTripleStore;await f.addAll(u.triples);let d=(0,zr.vaultPathToIRI)(o),p=c.getAbstractFileByPath(o),h=p!==null&&"basename"in p?p:null,g=h?c.getFrontmatter(h):null,m=yye(g),b=await _ye(f,d),_=[...new Set([...m,...b])],w=r7(g?.exo__Asset_prototype),I=g?.exo__Asset_uid,E=typeof I=="string"?I:void 0,R=await new zr.CommandResolver(f,kw).resolveForAssetMulti(d,_,w??void 0),O=new zr.FolderRepairService(c),x=new zr.PreconditionEvaluator(f,void 0,{clock:t});(0,zr.registerDefaultHostFunctions)(x),x.registerHostFunction("isInWrongFolder",Dw(c,O)),x.registerHostFunction("hasObsoleteProperties",Lw(c));let k=(0,Js.dirname)(o),M={targetIRI:d,filePath:o,fileBasename:h?.basename,currentFolder:k==="."?"":k,assetUid:E},D=await Sye(f),Y=await Promise.all(R.map(async H=>{let oe;try{oe=await x.evaluate(H.command.precondition,d,M)}catch{oe=!1}return{rc:H,available:oe}})),fe=a(H=>({id:H.command.id,label:H.command.name,cliName:D.get(H.command.id)??null,category:H.command.category??null}),"toEntry"),$=Y.filter(H=>H.available).map(H=>fe(H.rc)),ce=Y.filter(H=>!H.available).map(H=>({...fe(H.rc),reason:"precondition-false"}));return{target:o,classes:_,prototype:w,visible:$,hidden:ce}}a(wye,"resolveButtons");function Eye(r,e){let t=a(n=>`${n.label}${n.cliName?` (${n.cliName})`:""}`,"fmt");if(console.log(`Command buttons on "${r.target}" (${r.visible.length} visible):`),r.visible.length===0)console.log(" (none)");else for(let n of r.visible)console.log(` \u2713 ${t(n)}`);if(e)if(console.log(`
557
557
  Hidden by precondition (${r.hidden.length}):`),r.hidden.length===0)console.log(" (none)");else for(let n of r.hidden)console.log(` \u2717 ${t(n)} \u2014 precondition not satisfied`)}a(Eye,"printHuman");function n7(){return new he("resolve-inline-buttons").alias("resolve-buttons").description("Print the actual command button-set for an asset \u2014 binding-match \u2229 precondition-eval (Issue #3833). The authoritative button-visibility oracle; strictly more complete than `apply --dry-run` (precondition-only).").argument("<target>","Vault-relative path to the target asset").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--json","Emit structured JSON instead of human-readable text").option("--show-hidden","Also list commands that bind but are hidden by their precondition").option("--use-cache","Use the persistent triple cache (faster vault loading; read-only, nothing is written through)").action(async(r,e)=>{ue.setFormat(e.json?"json":"text");try{let t=await wye(e.vault,r,void 0,{useCache:e.useCache??!1,log:a(n=>process.stderr.write(`${n}
558
- `),"log")});if(e.json){let n=e.showHidden?t:{...t,hidden:[]};console.log(JSON.stringify(n,null,2))}else Eye(t,e.showHidden??!1)}catch(t){ue.handle(t),process.exit(5)}})}a(n7,"resolveButtonsCommand");at();var ZO=require("fs"),Zs=require("path"),zc=te(ke());Rt();Ut();cr();No();var Mw=class{constructor(e){this.vault=e}static{a(this,"FsVaultMetadataAdapter")}*listFrontmatter(){for(let e of this.vault.getAllFiles()){let t=this.vault.getFrontmatter(e);t&&(yield t)}}resolveLinkpathFrontmatter(e){let t={allowAliasFallback:!1},n=this.vault.getFirstLinkpathDest(e,"",t);return!n&&!e.endsWith(".md")&&(n=this.vault.getFirstLinkpathDest(`${e}.md`,"",t)),n?this.vault.getFrontmatter(n)??{}:null}};async function vye(r,e){let t=(0,Zs.resolve)(r);if(!(0,ZO.existsSync)(t))throw new Me(t);let n=(0,Zs.resolve)(t,e);if(!(0,ZO.existsSync)(n))throw new Error(`Target file not found: ${e}`);let i=(0,Zs.relative)(t,n);if(i===".."||i.startsWith(`..${Zs.sep}`)||(0,Zs.isAbsolute)(i))throw new Error(`Target is outside the vault: ${e} (vault: ${t})`);let s=new er(t),o=new Mw(s),c=new zc.PrintNameRuleService(o,(0,zc.createDisplayMatcherHostFunctions)(o));c.initialize();let l=new zc.DisplayNameResolver(zc.DEFAULT_DISPLAY_NAME_SETTINGS,c,c.createMetadataResolver()),u=s.getAbstractFileByPath(i),f=u!==null&&"basename"in u?u:null,d=(f?s.getFrontmatter(f):null)??{},p=(0,Zs.basename)(i).replace(/\.md$/,""),h=l.resolveWithProvenance({metadata:d,basename:p}),g=h.displayName??p,m=d.exo__Asset_label,b=typeof m=="string"&&m.trim().length>0,_=h.displayName===null?"basename":h.provenance==="default"?b?"label":"basename":h.provenance,w=d.exo__Asset_uid;return{target:i,uid:typeof w=="string"&&w.trim()?w.trim():null,basename:p,displayName:g,source:_}}a(vye,"resolveDisplayName");function i7(){return new he("resolve-display-name").description("Print the composed display name an asset renders as \u2014 the same engine the plugin runs, over the same vault exo__DisplayNameSpec assets (req f17f7c57). The authoritative naming oracle outside Obsidian; --json adds `source`, which distinguishes a spec-composed name from a raw exo__Asset_label.").argument("<target>","Vault-relative path to the target asset").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--json","Emit structured JSON instead of the bare name").action(async(r,e)=>{ue.setFormat(e.json?"json":"text");try{let t=await vye(e.vault,r);e.json?console.log(JSON.stringify(t,null,2)):console.log(t.displayName)}catch(t){ue.handle(t),process.exit(5)}})}a(i7,"resolveDisplayNameCommand");at();sP();at();var jw=require("fs"),g7=require("path"),Hc=te(ke());var Tr=te(ja()),Mi=te(require("path"));iO();var Ha=te(ke());var gi=class{constructor(e){this.rootPath=e}static{a(this,"NodeFsAdapter")}async readFile(e){let t=this.resolvePath(e);if(!await Tr.default.pathExists(t))throw new Ha.FileNotFoundError(e);return Tr.default.readFile(t,"utf-8")}async fileExists(e){let t=this.resolvePath(e);return Tr.default.pathExists(t)}async getFileMetadata(e){let t=await this.readFile(e);return this.extractFrontmatter(t)}async createFile(e,t){let n=this.resolvePath(e);if(await Tr.default.pathExists(n))throw new Ha.FileAlreadyExistsError(e);return await Tr.default.ensureDir(Mi.default.dirname(n)),await Tr.default.writeFile(n,t,"utf-8"),e}async updateFile(e,t){let n=this.resolvePath(e);if(!await Tr.default.pathExists(n))throw new Ha.FileNotFoundError(e);await Tr.default.writeFile(n,t,"utf-8")}async writeFile(e,t){let n=this.resolvePath(e);await Tr.default.ensureDir(Mi.default.dirname(n)),await Tr.default.writeFile(n,t,"utf-8")}async deleteFile(e){let t=this.resolvePath(e);if(!await Tr.default.pathExists(t))throw new Ha.FileNotFoundError(e);await Tr.default.remove(t)}async renameFile(e,t){let n=this.resolvePath(e),i=this.resolvePath(t);if(!await Tr.default.pathExists(n))throw new Ha.FileNotFoundError(e);await Tr.default.ensureDir(Mi.default.dirname(i)),await Tr.default.move(n,i)}async createDirectory(e){let t=this.resolvePath(e);await Tr.default.ensureDir(t)}async directoryExists(e){let t=this.resolvePath(e);return await Tr.default.pathExists(t)?(await Tr.default.stat(t)).isDirectory():!1}async getMarkdownFiles(e){let t=e?this.resolvePath(e):this.rootPath,n=Mi.default.join(t,"**/*.md");return(await Wd(n,{nodir:!0})).map(o=>Mi.default.relative(this.rootPath,o)).sort()}async findFilesByMetadata(e){let t=await this.getMarkdownFiles(),n=[];for(let i of t)try{let s=await this.getFileMetadata(i);this.matchesQuery(s,e)&&n.push(i)}catch{continue}return n}async findFileByUID(e){let t=await this.findFilesByMetadata({exo__Asset_uid:e});return t.length>0?t[0]:null}async findFileByLinkpath(e){let t=e.trim();if(t.length===0)return null;let n=await this.findFileByBasename(`${t}.md`);if(n)return n;let i=await this.getMarkdownFiles();for(let s of i){let o;try{o=await this.getFileMetadata(s)}catch{continue}if(o.exo__Asset_label===t)return s;let c=o.aliases;if(Array.isArray(c)&&c.some(l=>l===t)||typeof c=="string"&&c===t)return s}return null}async findFileByBasename(e){let t=a(async n=>{let i;try{i=await Tr.default.readdir(n,{withFileTypes:!0})}catch{return null}for(let s of i){let o=Mi.default.join(n,s.name);if(s.isDirectory()){if(s.name.startsWith(".")||s.name==="node_modules")continue;let c=await t(o);if(c)return c}else if(s.isFile()&&s.name===e)return Mi.default.relative(this.rootPath,o)}return null},"walk");return t(this.rootPath)}async findFileByUidFilename(e){let t=e.toLowerCase(),n=a(async i=>{let s;try{s=await Tr.default.readdir(i,{withFileTypes:!0})}catch{return null}for(let o of s){let c=Mi.default.join(i,o.name);if(o.isDirectory()){if(o.name.startsWith(".")||o.name==="node_modules")continue;let l=await n(c);if(l)return l}else if(o.isFile()&&o.name.endsWith(".md")){let l=o.name.toLowerCase();if(l.startsWith(t+".md")||l.startsWith(t+" ")||l.startsWith(t+"-"))return Mi.default.relative(this.rootPath,c)}}return null},"walk");return n(this.rootPath)}resolvePath(e){if(Mi.default.isAbsolute(e))return e;let t=this.rootPath.replace(/[/\\]+$/,""),n=Mi.default.sep+e;return n===t||n.startsWith(t+Mi.default.sep)?n:Mi.default.join(this.rootPath,e)}extractFrontmatter(e){let t=/^---\n([\s\S]*?)\n---/,n=e.match(t);return n?(0,Ha.parseYamlFrontmatterTolerant)(n[1])??{}:{}}matchesQuery(e,t){for(let[n,i]of Object.entries(t)){let s=e[n];if(Array.isArray(s)){if(!s.some(o=>this.normalizeValue(o)===this.normalizeValue(i)))return!1}else if(this.normalizeValue(s)!==this.normalizeValue(i))return!1}return!0}normalizeValue(e){return e==null?"":String(e).replace(/["'[\]]/g,"").trim()}};var Cn=class r extends gi{constructor(t,n){super(t);this.indexed=!1;this.uidToPath=new Map;this.basenameToPaths=new Map;this.allPaths=[];this.pathSet=new Set;this.assets=[];this.cacheContent=n?.cacheContent??!1}static{a(this,"CachingNodeFsAdapter")}async buildIndex(){if(this.indexed)return;let t=await super.getMarkdownFiles();for(let n of t){this.allPaths.push(n),this.pathSet.add(n);let i={},s;try{this.cacheContent?(s=await super.readFile(n),i=this.extractFrontmatter(s)):i=await super.getFileMetadata(n)}catch{i={}}let o=i?.exo__Asset_uid,c=Array.isArray(o)?o:[o];for(let f of c){let d=r.normalizeUid(f);d.length>0&&!this.uidToPath.has(d)&&this.uidToPath.set(d,n)}let l=r.basenameOf(n),u=this.basenameToPaths.get(l);u?u.push(n):this.basenameToPaths.set(l,[n]),this.assets.push(this.cacheContent?{path:n,metadata:i,content:s}:{path:n,metadata:i})}this.indexed=!0}async findPathsByBasename(t){return await this.buildIndex(),this.basenameToPaths.get(t)??[]}async hasIndexedPath(t){await this.buildIndex();let n=t.replace(/\\/g,"/").replace(/^\.\//,"");return this.pathSet.has(n)}static basenameOf(t){let n=t.lastIndexOf("/"),i=n===-1?t:t.slice(n+1);return i.endsWith(".md")?i.slice(0,-3):i}async indexedAssets(){return await this.buildIndex(),this.assets}async getMarkdownFiles(t){return t?super.getMarkdownFiles(t):(await this.buildIndex(),this.allPaths)}async findFileByUID(t){return await this.buildIndex(),this.uidToPath.get(r.normalizeUid(t))??null}static normalizeUid(t){return t==null?"":String(t).replace(/["'[\]]/g,"").trim()}async fileExists(t){await this.buildIndex();let n=t.replace(/\\/g,"/").replace(/^\.\//,"");return this.pathSet.has(n)?!0:super.fileExists(t)}};Rt();Ut();var oP=class{constructor(e){this.vaultPath=e}static{a(this,"CliFsCheckReader")}async read(){return{assets:(await new Cn(this.vaultPath).indexedAssets()).map(i=>({path:i.path,frontmatter:i.metadata}))}}};function y7(){return new he("vault").description("Run the homoiconic vault-integrity check-runner (enabled-set from validation-check setting__Setting instances; --all runs every check)").requiredOption("--vault <path>","Vault root directory").option("--all","Run ALL known checks, ignoring the vault enabled-set").option("--output <type>","Response format: text|json","text").action(async r=>{let e=r.output??"text";ue.setFormat(e);try{let t=(0,g7.resolve)(r.vault);if(!(0,jw.existsSync)(t)||!(0,jw.statSync)(t).isDirectory())throw new Me(t);let i=await new oP(t).read(),s=r.all?[...Hc.KNOWN_CHECK_IDS]:(0,Hc.readEnabledCheckIds)(i.assets),o=await new Hc.VaultCheckRunner((0,Hc.createDefaultCheckRegistry)()).runWithContext(i,s);if(e==="json")console.log(JSON.stringify({vaultPath:t,...o},null,2));else{s.length===0&&console.log(`OK ${t}: no validation checks enabled (scaffold validation-settings to enable some, or pass --all)`);for(let c of o.results){let l=`${c.status==="pass"?"OK":c.status==="fail"?"FAIL":"ERROR"} ${c.label}`;if(c.status==="pass")console.log(`${l} (${i.assets.length} assets)`);else if(c.status==="error")console.error(`${l}: ${c.errorMessage}`);else{console.error(`${l}: ${c.findings.length} violation(s)`);for(let u of c.findings.slice(0,50))console.error(` ${u.path?u.path+" \u2014 ":""}${u.message}`);c.findings.length>50&&console.error(` \u2026and ${c.findings.length-50} more`)}}console.error(o.ok?`
558
+ `),"log")});if(e.json){let n=e.showHidden?t:{...t,hidden:[]};console.log(JSON.stringify(n,null,2))}else Eye(t,e.showHidden??!1)}catch(t){ue.handle(t),process.exit(5)}})}a(n7,"resolveButtonsCommand");at();var ZO=require("fs"),Zs=require("path"),zc=te(ke());Rt();Ut();cr();No();var Mw=class{constructor(e){this.vault=e}static{a(this,"FsVaultMetadataAdapter")}*listFrontmatter(){for(let e of this.vault.getAllFiles()){let t=this.vault.getFrontmatter(e);t&&(yield t)}}resolveLinkpathFrontmatter(e){let t={allowAliasFallback:!1},n=this.vault.getFirstLinkpathDest(e,"",t);return!n&&!e.endsWith(".md")&&(n=this.vault.getFirstLinkpathDest(`${e}.md`,"",t)),n?this.vault.getFrontmatter(n)??{}:null}};async function vye(r,e){let t=(0,Zs.resolve)(r);if(!(0,ZO.existsSync)(t))throw new Me(t);let n=(0,Zs.resolve)(t,e);if(!(0,ZO.existsSync)(n))throw new Error(`Target file not found: ${e}`);let i=(0,Zs.relative)(t,n);if(i===".."||i.startsWith(`..${Zs.sep}`)||(0,Zs.isAbsolute)(i))throw new Error(`Target is outside the vault: ${e} (vault: ${t})`);let s=new er(t),o=new Mw(s),c=new zc.PrintNameRuleService(o,(0,zc.createDisplayMatcherHostFunctions)(o));c.initialize();let l=new zc.DisplayNameResolver(zc.DEFAULT_DISPLAY_NAME_SETTINGS,c,c.createMetadataResolver()),u=s.getAbstractFileByPath(i),f=u!==null&&"basename"in u?u:null,d=(f?s.getFrontmatter(f):null)??{},p=(0,Zs.basename)(i).replace(/\.md$/,""),h=l.resolveWithProvenance({metadata:d,basename:p}),g=d.exo__Asset_label,m=typeof g=="string"&&g.trim().length>0,b=m?g.trim():null,_=h.displayName??b??p,w=h.displayName===null||h.provenance==="default"?m?"label":"basename":h.provenance,I=d.exo__Asset_uid;return{target:i,uid:typeof I=="string"&&I.trim()?I.trim():null,basename:p,displayName:_,source:w}}a(vye,"resolveDisplayName");function i7(){return new he("resolve-display-name").description("Print the composed display name an asset renders as \u2014 the same engine the plugin runs, over the same vault exo__DisplayNameSpec assets (req f17f7c57). The authoritative naming oracle outside Obsidian; --json adds `source`, which distinguishes a spec-composed name from a raw exo__Asset_label.").argument("<target>","Vault-relative path to the target asset").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--json","Emit structured JSON instead of the bare name").action(async(r,e)=>{ue.setFormat(e.json?"json":"text");try{let t=await vye(e.vault,r);e.json?console.log(JSON.stringify(t,null,2)):console.log(t.displayName)}catch(t){ue.handle(t),process.exit(5)}})}a(i7,"resolveDisplayNameCommand");at();sP();at();var jw=require("fs"),g7=require("path"),Hc=te(ke());var Tr=te(ja()),Mi=te(require("path"));iO();var Ha=te(ke());var gi=class{constructor(e){this.rootPath=e}static{a(this,"NodeFsAdapter")}async readFile(e){let t=this.resolvePath(e);if(!await Tr.default.pathExists(t))throw new Ha.FileNotFoundError(e);return Tr.default.readFile(t,"utf-8")}async fileExists(e){let t=this.resolvePath(e);return Tr.default.pathExists(t)}async getFileMetadata(e){let t=await this.readFile(e);return this.extractFrontmatter(t)}async createFile(e,t){let n=this.resolvePath(e);if(await Tr.default.pathExists(n))throw new Ha.FileAlreadyExistsError(e);return await Tr.default.ensureDir(Mi.default.dirname(n)),await Tr.default.writeFile(n,t,"utf-8"),e}async updateFile(e,t){let n=this.resolvePath(e);if(!await Tr.default.pathExists(n))throw new Ha.FileNotFoundError(e);await Tr.default.writeFile(n,t,"utf-8")}async writeFile(e,t){let n=this.resolvePath(e);await Tr.default.ensureDir(Mi.default.dirname(n)),await Tr.default.writeFile(n,t,"utf-8")}async deleteFile(e){let t=this.resolvePath(e);if(!await Tr.default.pathExists(t))throw new Ha.FileNotFoundError(e);await Tr.default.remove(t)}async renameFile(e,t){let n=this.resolvePath(e),i=this.resolvePath(t);if(!await Tr.default.pathExists(n))throw new Ha.FileNotFoundError(e);await Tr.default.ensureDir(Mi.default.dirname(i)),await Tr.default.move(n,i)}async createDirectory(e){let t=this.resolvePath(e);await Tr.default.ensureDir(t)}async directoryExists(e){let t=this.resolvePath(e);return await Tr.default.pathExists(t)?(await Tr.default.stat(t)).isDirectory():!1}async getMarkdownFiles(e){let t=e?this.resolvePath(e):this.rootPath,n=Mi.default.join(t,"**/*.md");return(await Wd(n,{nodir:!0})).map(o=>Mi.default.relative(this.rootPath,o)).sort()}async findFilesByMetadata(e){let t=await this.getMarkdownFiles(),n=[];for(let i of t)try{let s=await this.getFileMetadata(i);this.matchesQuery(s,e)&&n.push(i)}catch{continue}return n}async findFileByUID(e){let t=await this.findFilesByMetadata({exo__Asset_uid:e});return t.length>0?t[0]:null}async findFileByLinkpath(e){let t=e.trim();if(t.length===0)return null;let n=await this.findFileByBasename(`${t}.md`);if(n)return n;let i=await this.getMarkdownFiles();for(let s of i){let o;try{o=await this.getFileMetadata(s)}catch{continue}if(o.exo__Asset_label===t)return s;let c=o.aliases;if(Array.isArray(c)&&c.some(l=>l===t)||typeof c=="string"&&c===t)return s}return null}async findFileByBasename(e){let t=a(async n=>{let i;try{i=await Tr.default.readdir(n,{withFileTypes:!0})}catch{return null}for(let s of i){let o=Mi.default.join(n,s.name);if(s.isDirectory()){if(s.name.startsWith(".")||s.name==="node_modules")continue;let c=await t(o);if(c)return c}else if(s.isFile()&&s.name===e)return Mi.default.relative(this.rootPath,o)}return null},"walk");return t(this.rootPath)}async findFileByUidFilename(e){let t=e.toLowerCase(),n=a(async i=>{let s;try{s=await Tr.default.readdir(i,{withFileTypes:!0})}catch{return null}for(let o of s){let c=Mi.default.join(i,o.name);if(o.isDirectory()){if(o.name.startsWith(".")||o.name==="node_modules")continue;let l=await n(c);if(l)return l}else if(o.isFile()&&o.name.endsWith(".md")){let l=o.name.toLowerCase();if(l.startsWith(t+".md")||l.startsWith(t+" ")||l.startsWith(t+"-"))return Mi.default.relative(this.rootPath,c)}}return null},"walk");return n(this.rootPath)}resolvePath(e){if(Mi.default.isAbsolute(e))return e;let t=this.rootPath.replace(/[/\\]+$/,""),n=Mi.default.sep+e;return n===t||n.startsWith(t+Mi.default.sep)?n:Mi.default.join(this.rootPath,e)}extractFrontmatter(e){let t=/^---\n([\s\S]*?)\n---/,n=e.match(t);return n?(0,Ha.parseYamlFrontmatterTolerant)(n[1])??{}:{}}matchesQuery(e,t){for(let[n,i]of Object.entries(t)){let s=e[n];if(Array.isArray(s)){if(!s.some(o=>this.normalizeValue(o)===this.normalizeValue(i)))return!1}else if(this.normalizeValue(s)!==this.normalizeValue(i))return!1}return!0}normalizeValue(e){return e==null?"":String(e).replace(/["'[\]]/g,"").trim()}};var Cn=class r extends gi{constructor(t,n){super(t);this.indexed=!1;this.uidToPath=new Map;this.basenameToPaths=new Map;this.allPaths=[];this.pathSet=new Set;this.assets=[];this.cacheContent=n?.cacheContent??!1}static{a(this,"CachingNodeFsAdapter")}async buildIndex(){if(this.indexed)return;let t=await super.getMarkdownFiles();for(let n of t){this.allPaths.push(n),this.pathSet.add(n);let i={},s;try{this.cacheContent?(s=await super.readFile(n),i=this.extractFrontmatter(s)):i=await super.getFileMetadata(n)}catch{i={}}let o=i?.exo__Asset_uid,c=Array.isArray(o)?o:[o];for(let f of c){let d=r.normalizeUid(f);d.length>0&&!this.uidToPath.has(d)&&this.uidToPath.set(d,n)}let l=r.basenameOf(n),u=this.basenameToPaths.get(l);u?u.push(n):this.basenameToPaths.set(l,[n]),this.assets.push(this.cacheContent?{path:n,metadata:i,content:s}:{path:n,metadata:i})}this.indexed=!0}async findPathsByBasename(t){return await this.buildIndex(),this.basenameToPaths.get(t)??[]}async hasIndexedPath(t){await this.buildIndex();let n=t.replace(/\\/g,"/").replace(/^\.\//,"");return this.pathSet.has(n)}static basenameOf(t){let n=t.lastIndexOf("/"),i=n===-1?t:t.slice(n+1);return i.endsWith(".md")?i.slice(0,-3):i}async indexedAssets(){return await this.buildIndex(),this.assets}async getMarkdownFiles(t){return t?super.getMarkdownFiles(t):(await this.buildIndex(),this.allPaths)}async findFileByUID(t){return await this.buildIndex(),this.uidToPath.get(r.normalizeUid(t))??null}static normalizeUid(t){return t==null?"":String(t).replace(/["'[\]]/g,"").trim()}async fileExists(t){await this.buildIndex();let n=t.replace(/\\/g,"/").replace(/^\.\//,"");return this.pathSet.has(n)?!0:super.fileExists(t)}};Rt();Ut();var oP=class{constructor(e){this.vaultPath=e}static{a(this,"CliFsCheckReader")}async read(){return{assets:(await new Cn(this.vaultPath).indexedAssets()).map(i=>({path:i.path,frontmatter:i.metadata}))}}};function y7(){return new he("vault").description("Run the homoiconic vault-integrity check-runner (enabled-set from validation-check setting__Setting instances; --all runs every check)").requiredOption("--vault <path>","Vault root directory").option("--all","Run ALL known checks, ignoring the vault enabled-set").option("--output <type>","Response format: text|json","text").action(async r=>{let e=r.output??"text";ue.setFormat(e);try{let t=(0,g7.resolve)(r.vault);if(!(0,jw.existsSync)(t)||!(0,jw.statSync)(t).isDirectory())throw new Me(t);let i=await new oP(t).read(),s=r.all?[...Hc.KNOWN_CHECK_IDS]:(0,Hc.readEnabledCheckIds)(i.assets),o=await new Hc.VaultCheckRunner((0,Hc.createDefaultCheckRegistry)()).runWithContext(i,s);if(e==="json")console.log(JSON.stringify({vaultPath:t,...o},null,2));else{s.length===0&&console.log(`OK ${t}: no validation checks enabled (scaffold validation-settings to enable some, or pass --all)`);for(let c of o.results){let l=`${c.status==="pass"?"OK":c.status==="fail"?"FAIL":"ERROR"} ${c.label}`;if(c.status==="pass")console.log(`${l} (${i.assets.length} assets)`);else if(c.status==="error")console.error(`${l}: ${c.errorMessage}`);else{console.error(`${l}: ${c.findings.length} violation(s)`);for(let u of c.findings.slice(0,50))console.error(` ${u.path?u.path+" \u2014 ":""}${u.message}`);c.findings.length>50&&console.error(` \u2026and ${c.findings.length-50} more`)}}console.error(o.ok?`
559
559
  \u2705 ${t}: all ${s.length} enabled check(s) passed`:`
560
560
  \u274C ${t}: validation failed`)}o.ok||(process.exitCode=1)}catch(t){ue.handle(t)}})}a(y7,"validateVaultCommand");function b7(){let r=new he("validate").description("Validate vault files (schema linting, homoiconic vault-integrity checks)");return r.addCommand(m7()),r.addCommand(y7()),r}a(b7,"validateCommand");at();var v7=require("fs"),T7=require("path"),A7=te(ke());Rt();cr();Sr();Ut();Sr();qa();var _7=te(ke());var hs=te(ke());var Zd=class{constructor(e,t){this.tripleStore=e;this.reader=t}static{a(this,"FsQueryBodyResolver")}async resolveSparql(e){if(!e)return null;let n=(await this.tripleStore.match(void 0,hs.Namespace.EXO.term("Asset_uid"),new hs.Literal(e)))[0]?.subject;if(!(n instanceof hs.IRI))return null;let i=(0,hs.iriToVaultPath)(n.value);if(!i)return null;let s;try{s=await this.reader.readFile(i)}catch{return null}return(0,hs.extractSparqlBlock)((0,hs.stripFrontmatter)(s))}};function $w(r,e){let t=new gi(e);return new _7.NamedQueryRunner(new Zd(r,t),r)}a($w,"buildNamedQueryRunner");var S7="b6aa1da9-96b9-4066-99a9-f81cc8b316aa",w7="5ba1031d-2c6e-4528-ab81-fb768d8e061a",E7="efb7bb79-6378-44b0-b1ca-9a27e3eeb684";function I7(){return new he("classes").alias("describe-class").description("List RDF classes in vault, or describe a class (predicates + counts). Alias `describe-class` is provided per #3043 RFC \xA7B (schema introspection). Introspection SPARQL is read from vault query__NamedQuery assets (req 2678df55).").argument("[class-name]","Optional class name to show details (e.g., ems__Task)").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--format <type>","Output format: table|json","table").option("--output <type>","Response format: text|json (for MCP tools)","text").option("--use-cache","Use persistent cache (faster for repeated queries)").action(async(r,e)=>{let t=e.output||"text";ue.setFormat(t);try{let n=Date.now(),i=(0,T7.resolve)(e.vault);if(!(0,v7.existsSync)(i))throw new Me(i);t==="text"&&console.log(`\u{1F4E6} Loading vault: ${i}...`);let s=e.useCache??!1,o,c=!1,l=await mi(i,{useCache:s});o=l.triples,c=l.cacheHit,t==="text"&&c&&console.log(l.mode==="delta"?`\u267B\uFE0F Cache refreshed incrementally (${l.reparsedFiles} file(s) re-parsed)...`:"\u{1F680} Cache hit! Loading from persistent cache...");let u=new A7.InMemoryTripleStore;await u.addAll(o);let f=Date.now()-n;if(t==="text"){let p=c?" (from cache)":"";console.log(`\u2705 Loaded ${o.length} triples in ${f}ms${p}
561
561
  `)}let d=$w(u,i);r?await Wye(d,r,e,t):await qye(d,e,t)}catch(n){ue.handle(n)}})}a(I7,"classesCommand");function aP(r,e){return r===null&&ue.handleWithMessage(`Introspection query__NamedQuery asset "${e}" not found in the vault (no asset with that UID, or it has no \`\`\`sparql code-block). The \`classes\` command reads its SPARQL from vault query assets (req 2678df55).`,3,"VALIDATION_FILE_NOT_FOUND"),r.kind!=="select"&&ue.handleWithMessage(`Introspection query "${e}" is an ${r.kind} query; expected SELECT.`,2,"VALIDATION_INVALID_ARGUMENTS"),r.rows}a(aP,"requireSelectRows");function cP(r){let e=r?.value,t=typeof e=="string"?parseInt(e,10):NaN;return Number.isNaN(t)?0:t}a(cP,"parseCount");async function qye(r,e,t){let n=await r.run(S7),s=aP(n,S7).map(o=>{let c=o.get("class"),l=o.get("count");return{name:c?R7(c.toString()):"unknown",count:cP(l)}});if(t==="json"||e.format==="json"){let o=pt.success({classes:s,totalClasses:s.length});console.log(JSON.stringify(o,null,2))}else{if(console.log(`\u{1F4CA} Found ${s.length} RDF class(es):
@@ -685,7 +685,7 @@ Next steps:
685
685
  `).map(n=>n.trim()).filter(n=>n.length>0),t=e[e.length-1];if(t!==void 0)try{return JSON.parse(t)}catch{return}}a(W_e,"parseLastJsonLine");function mV(r,e){return e.filter(t=>{let n=r[t];return typeof n!="string"||n.trim().length===0})}a(mV,"missingStringFields");var EE=class{constructor(e){this.deps=e}static{a(this,"McpServer")}async handle(e){if(typeof e!="object"||e===null||Array.isArray(e))return{jsonrpc:"2.0",id:null,error:{code:hV,message:"Invalid request: expected a JSON-RPC object"}};let t=e.id,n=t===void 0;if(typeof e.method!="string")return n?null:{jsonrpc:"2.0",id:t??null,error:{code:hV,message:"Invalid request: missing method"}};if(n)return null;let i=t??null;switch(e.method){case"initialize":return{jsonrpc:"2.0",id:i,result:{protocolVersion:G_e,capabilities:{tools:{}},serverInfo:{name:"exocortex",version:this.deps.version}}};case"ping":return{jsonrpc:"2.0",id:i,result:{}};case"tools/list":return{jsonrpc:"2.0",id:i,result:{tools:pV}};case"tools/call":return{jsonrpc:"2.0",id:i,result:await this.callTool(e.params??{})};default:return{jsonrpc:"2.0",id:i,error:{code:q_e,message:`Method not found: ${e.method}`}}}}async callTool(e){let t=e.name,n=e.arguments??{},i;if(t==="create_asset"){let c=mV(n,["vault","class","label"]);if(c.length>0)return hp(`create_asset: missing required argument(s): ${c.join(", ")}`,!0);let l=uV(n);if(l!==null)return hp(`create_asset: ${l}`,!0);i=fV(n)}else if(t==="create_effort"){let c=mV(n,["vault","command","target"]);if(c.length>0)return hp(`create_effort: missing required argument(s): ${c.join(", ")}`,!0);i=dV(n)}else return hp(`Unknown tool: ${String(t)}`,!0);let s=await this.deps.runCli(i);if(s.exitCode!==0){let c=s.stderr.trim()||s.stdout.trim()||"(no diagnostic output)";return hp(`exocortex-cli exited ${s.exitCode}
686
686
  ${c}`,!0)}let o=W_e(s.stdout);return hp(o===void 0?s.stdout.trim():JSON.stringify(o))}};var bV=require("child_process");var z_e=32*1024*1024;function _V(r){return e=>new Promise(t=>{(0,bV.execFile)(process.execPath,[r,...e],{maxBuffer:z_e},(n,i,s)=>{let o=0;if(n){let c=n.code;o=typeof c=="number"?c:1}t({stdout:i,stderr:s,exitCode:o})})})}a(_V,"createSelfCliRunner");async function H_e(r,e,t){let n=(0,SV.createInterface)({input:e,crlfDelay:1/0});for await(let i of n){let s=i.trim();if(s.length===0)continue;let o;try{o=JSON.parse(s)}catch{t(JSON.stringify({jsonrpc:"2.0",id:null,error:{code:gV,message:"Parse error: invalid JSON"}})+`
687
687
  `);continue}let c;try{c=await r.handle(o)}catch(l){c={jsonrpc:"2.0",id:typeof o?.id=="string"||typeof o?.id=="number"?o.id:null,error:{code:yV,message:`Internal error: ${l instanceof Error?l.message:String(l)}`}}}c!==null&&t(JSON.stringify(c)+`
688
- `)}}a(H_e,"runStdioServer");function wV(r){return new he("mcp").description("Run an MCP (Model Context Protocol) stdio server exposing create_asset / create_effort tools backed by this CLI").option("--entry <path>","Path to the CLI entry script the tools invoke (defaults to this process's script)").action(async e=>{let t=e.entry??process.argv[1],n=new EE({runCli:_V(t),version:r??"unknown"});await H_e(n,process.stdin,i=>process.stdout.write(i))})}a(wV,"mcpCommand");function vE(r){let e=new he;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more").version(r??"16.245.1"),e.addCommand(e8()),e.addCommand(l8()),e.addCommand(z6()),e.addCommand(X6()),e.addCommand(b7()),e.addCommand(Q6()),e.addCommand(n7()),e.addCommand(i7()),e.addCommand(I7()),e.addCommand(P7()),e.addCommand(q7()),e.addCommand(H7()),e.addCommand(K7()),e.addCommand(X7()),e.addCommand(Q7()),e.addCommand(L8()),e.addCommand(M8()),e.addCommand(J8()),e.addCommand(eV()),e.addCommand(nV()),e.addCommand(iV()),e.addCommand(aV()),e.addCommand(G8()),e.addCommand(Y8()),e.addCommand(cV()),e.addCommand(wV(r??"16.245.1")),e}a(vE,"createProgram");vE().parse();0&&(module.exports={createProgram});
688
+ `)}}a(H_e,"runStdioServer");function wV(r){return new he("mcp").description("Run an MCP (Model Context Protocol) stdio server exposing create_asset / create_effort tools backed by this CLI").option("--entry <path>","Path to the CLI entry script the tools invoke (defaults to this process's script)").action(async e=>{let t=e.entry??process.argv[1],n=new EE({runCli:_V(t),version:r??"unknown"});await H_e(n,process.stdin,i=>process.stdout.write(i))})}a(wV,"mcpCommand");function vE(r){let e=new he;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more").version(r??"16.245.2"),e.addCommand(e8()),e.addCommand(l8()),e.addCommand(z6()),e.addCommand(X6()),e.addCommand(b7()),e.addCommand(Q6()),e.addCommand(n7()),e.addCommand(i7()),e.addCommand(I7()),e.addCommand(P7()),e.addCommand(q7()),e.addCommand(H7()),e.addCommand(K7()),e.addCommand(X7()),e.addCommand(Q7()),e.addCommand(L8()),e.addCommand(M8()),e.addCommand(J8()),e.addCommand(eV()),e.addCommand(nV()),e.addCommand(iV()),e.addCommand(aV()),e.addCommand(G8()),e.addCommand(Y8()),e.addCommand(cV()),e.addCommand(wV(r??"16.245.2")),e}a(vE,"createProgram");vE().parse();0&&(module.exports={createProgram});
689
689
  /*! Bundled license information:
690
690
 
691
691
  reflect-metadata/Reflect.js:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitelev/exocortex-cli",
3
- "version": "16.245.1",
3
+ "version": "16.245.2",
4
4
  "description": "CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more",
5
5
  "main": "dist/index.js",
6
6
  "bin": {