@kitelev/exocortex-cli 15.47.4 → 15.47.6

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 v15.47.4
2
+ // @kitelev/exocortex-cli v15.47.6
3
3
  // CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more
4
4
  // License: MIT
5
5
 
@@ -522,7 +522,7 @@ Available prefixes: ${u}`,this.wellKnownPrefixes[r]&&c.push(`Add: PREFIX ${r}: <
522
522
  `)}formatForJSON(e){return{type:e.type,message:e.message,originalMessage:e.originalMessage,suggestions:e.suggestions,line:e.line,column:e.column,context:e.context?{startLine:e.context.startLine,endLine:e.context.endLine,errorLine:e.context.errorLine,errorColumn:e.context.errorColumn,lines:e.context.lines.map(t=>({number:t.number,content:t.content,isError:t.isError}))}:void 0}}};var Yd=class n{static{o(this,"NTriplesFormatter")}static escapeString(e){let t=e.replace(/\\/g,"\\\\");return t=t.replace(/"/g,'\\"'),t=t.replace(/\n/g,"\\n"),t=t.replace(/\r/g,"\\r"),t=t.replace(/\t/g,"\\t"),t}static formatObject(e){return e.startsWith("http://")||e.startsWith("https://")||e.startsWith("urn:")?`<${e}>`:`"${n.escapeString(e)}"`}};var ka=require("fs"),iv=require("path");function Hl(n){let e=new Map,t="obsidian://vault/",r;try{r=(0,ka.readdirSync)(n)}catch{return e}for(let i of r){let s=(0,iv.join)(n,i);if(i.startsWith("."))continue;let a;try{a=(0,ka.statSync)(s)}catch{continue}if(!a.isDirectory())continue;let c;try{c=(0,ka.readdirSync)(s)}catch{continue}for(let l of c){let u=(0,iv.join)(s,l);if(l.startsWith("."))continue;let f;try{f=(0,ka.statSync)(u)}catch{continue}if(!f.isDirectory())continue;let h=!1;try{h=(0,ka.readdirSync)(u).some(p=>p.endsWith(".md"))}catch{continue}if(h){let d=`${i}/${l}`,p=encodeURI(d),y=`${t}${p}/`;/^[a-zA-Z][a-zA-Z0-9_]*$/.test(l)&&e.set(l,y)}}}return e}o(Hl,"scanVaultNamespaces");var kA=X(Ht());var LA=new Set(["exo","ems","ims","gtd","period","lit","inbox","rdf","rdfs","owl","xsd"]),oV=/(<)([a-zA-Z][a-zA-Z0-9]*)__([a-zA-Z][a-zA-Z0-9_]*)(>)/g;function Kd(n){let e=new Set,t=/PREFIX\s+(\w+)\s*:/gi,r;for(;(r=t.exec(n))!==null;)e.add(r[1].toLowerCase());let i=kA.SPARQL_PREFIXES.split(`
523
523
  `).filter(a=>a.trim().length>0),s=[];for(let a of i){let c=/PREFIX\s+(\w+)\s*:/i.exec(a);c&&!e.has(c[1].toLowerCase())&&s.push(a)}return s.length===0?n:s.join(`
524
524
  `)+`
525
- `+n}o(Kd,"injectExocortexPrefixes");function Xd(n){return n.replace(oV,(e,t,r,i,s)=>LA.has(r.toLowerCase())?`${r}:${i}`:e)}o(Xd,"transformShorthandNotation");function zl(n){let e=new Map(n);for(let t of LA)e.delete(t);return e}o(zl,"filterOntologyPrefixes");var cV=300,MA=3e4,lV="EXOCORTEX_SPARQL_TIMEOUT";function uV(){let n=process.env[lV];if(!n)return MA;try{let e=fV(n);if(e!==null&&e>0)return e}catch{}return MA}o(uV,"getDefaultTimeout");function fV(n){let e=n.trim().toLowerCase();if(!e)return null;if(e.endsWith("ms")){let r=parseInt(e.slice(0,-2),10);return isNaN(r)||r<=0?null:r}if(e.endsWith("s")){let r=parseInt(e.slice(0,-1),10);return isNaN(r)||r<=0?null:r*1e3}let t=parseInt(e,10);return isNaN(t)||t<=0?null:t*1e3}o(fV,"parseTimeoutSafe");function hV(n){if(!n)return cV;let e=parseInt(n.trim(),10);if(isNaN(e)||e<=0)throw new He(`Invalid cache TTL: "${n}". Must be a positive number (seconds).`,'exocortex sparql query --cache-ttl 600 "SELECT * WHERE { ?s ?p ?o }"');return e}o(hV,"parseCacheTtl");function dV(n){let e=n.trim().toLowerCase();if(e.endsWith("ms")){let r=parseInt(e.slice(0,-2),10);if(isNaN(r)||r<=0)throw new He(`Invalid timeout format: "${n}". Value must be a positive number.`,'exocortex sparql query --timeout "30s" or --timeout "5000ms"');return r}if(e.endsWith("s")){let r=parseInt(e.slice(0,-1),10);if(isNaN(r)||r<=0)throw new He(`Invalid timeout format: "${n}". Value must be a positive number.`,'exocortex sparql query --timeout "30s" or --timeout "5000ms"');return r*1e3}let t=parseInt(e,10);if(isNaN(t)||t<=0)throw new He(`Invalid timeout format: "${n}". Use formats like "30s", "5000ms", or just a number (seconds).`,'exocortex sparql query --timeout "30s" or --timeout "5000ms"');return t*1e3}o(dV,"parseTimeout");async function sv(n,e,t=Date.now()){let r=new Promise((i,s)=>{setTimeout(()=>{let a=Date.now()-t;s(new Ll(e,a))},e)});return Promise.race([n,r])}o(sv,"executeWithTimeout");function pV(n,e){return e.concat([n])}o(pV,"collectAlso");function $A(){return new Ge("query").description("Execute SPARQL query against Obsidian vault").argument("[query]","SPARQL query string or path to .sparql file (optional if --template is used)").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--also <path>","Additional vault to include in query (repeatable)",pV,[]).option("--format <type>","Output format: table|json|csv|ntriples","table").option("--output <type>","Response format: text|json (for MCP tools)","text").option("--timeout <duration>","Query timeout (e.g., 30s, 5000ms)","30s").option("--dry-run","Validate query syntax without executing (no vault loading)").option("--explain","Show optimized query plan").option("--stats","Show execution statistics").option("--no-optimize","Disable query optimization").option("--use-cache","Use persistent triple cache (faster vault loading)").option("--cache-ttl <seconds>","Query result cache TTL in seconds (default: 300)").option("--no-cache","Bypass query result cache").option("--template <name>","Use a predefined query template").option("--param <params>","Template parameters (format: key=value,key2=value2)").action(async(n,e)=>{let t=e.output||"text";V.setFormat(t);let r="";try{let i=Date.now(),s=e.timeout?dV(e.timeout):uV(),a=hV(e.cacheTtl),c=e.cache!==!1;if(e.template){let H=new uc,J=e.param?H.parseParamString(e.param):{};if(r=H.applyTemplate(e.template,J),t==="text"){let L=H.getTemplate(e.template);console.log(`\u{1F4CB} Using template: ${e.template}`),Object.keys(J).length>0&&console.log(` Parameters: ${Object.entries(J).map(([$,Z])=>`${$}=${Z}`).join(", ")}`),console.log()}}else if(n)r=mV(n);else throw new He("Either a query argument or --template flag is required.",'exocortex sparql query "SELECT * WHERE { ?s ?p ?o }" or exocortex sparql query --template tasks-by-date --param date=2024-01-15');if(e.dryRun){await gV(r,e,t);return}let l=(0,Ql.resolve)(e.vault);if(c){let J=await new ac().get(r,a);if(J!==null){let L=Date.now()-i;if(t==="json"){let $=ce.success(J,{durationMs:L,itemCount:J.count||0,queryResultCacheHit:!0});console.log(JSON.stringify($,null,2))}else{console.log(`\u{1F4E6} (cached) Query result loaded from cache in ${L}ms
525
+ `+n}o(Kd,"injectExocortexPrefixes");function Xd(n){return n.replace(oV,(e,t,r,i,s)=>LA.has(r.toLowerCase())?`${r}:${i}`:e)}o(Xd,"transformShorthandNotation");function zl(n){let e=new Map(n);for(let t of LA)e.delete(t);return e}o(zl,"filterOntologyPrefixes");var cV=300,MA=3e4,lV="EXOCORTEX_SPARQL_TIMEOUT";function uV(){let n=process.env[lV];if(!n)return MA;try{let e=fV(n);if(e!==null&&e>0)return e}catch{}return MA}o(uV,"getDefaultTimeout");function fV(n){let e=n.trim().toLowerCase();if(!e)return null;if(e.endsWith("ms")){let r=parseInt(e.slice(0,-2),10);return isNaN(r)||r<=0?null:r}if(e.endsWith("s")){let r=parseInt(e.slice(0,-1),10);return isNaN(r)||r<=0?null:r*1e3}let t=parseInt(e,10);return isNaN(t)||t<=0?null:t*1e3}o(fV,"parseTimeoutSafe");function hV(n){if(!n)return cV;let e=parseInt(n.trim(),10);if(isNaN(e)||e<=0)throw new He(`Invalid cache TTL: "${n}". Must be a positive number (seconds).`,'exocortex sparql query --cache-ttl 600 "SELECT * WHERE { ?s ?p ?o }"');return e}o(hV,"parseCacheTtl");function dV(n){let e=n.trim().toLowerCase();if(e.endsWith("ms")){let r=parseInt(e.slice(0,-2),10);if(isNaN(r)||r<=0)throw new He(`Invalid timeout format: "${n}". Value must be a positive number.`,'exocortex sparql query --timeout "30s" or --timeout "5000ms"');return r}if(e.endsWith("s")){let r=parseInt(e.slice(0,-1),10);if(isNaN(r)||r<=0)throw new He(`Invalid timeout format: "${n}". Value must be a positive number.`,'exocortex sparql query --timeout "30s" or --timeout "5000ms"');return r*1e3}let t=parseInt(e,10);if(isNaN(t)||t<=0)throw new He(`Invalid timeout format: "${n}". Use formats like "30s", "5000ms", or just a number (seconds).`,'exocortex sparql query --timeout "30s" or --timeout "5000ms"');return t*1e3}o(dV,"parseTimeout");async function sv(n,e,t=Date.now()){let r,i=new Promise((s,a)=>{r=setTimeout(()=>{let c=Date.now()-t;a(new Ll(e,c))},e),r&&typeof r=="object"&&"unref"in r&&r.unref()});return Promise.race([n,i])}o(sv,"executeWithTimeout");function pV(n,e){return e.concat([n])}o(pV,"collectAlso");function $A(){return new Ge("query").description("Execute SPARQL query against Obsidian vault").argument("[query]","SPARQL query string or path to .sparql file (optional if --template is used)").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--also <path>","Additional vault to include in query (repeatable)",pV,[]).option("--format <type>","Output format: table|json|csv|ntriples","table").option("--output <type>","Response format: text|json (for MCP tools)","text").option("--timeout <duration>","Query timeout (e.g., 30s, 5000ms)","30s").option("--dry-run","Validate query syntax without executing (no vault loading)").option("--explain","Show optimized query plan").option("--stats","Show execution statistics").option("--no-optimize","Disable query optimization").option("--use-cache","Use persistent triple cache (faster vault loading)").option("--cache-ttl <seconds>","Query result cache TTL in seconds (default: 300)").option("--no-cache","Bypass query result cache").option("--template <name>","Use a predefined query template").option("--param <params>","Template parameters (format: key=value,key2=value2)").action(async(n,e)=>{let t=e.output||"text";V.setFormat(t);let r="";try{let i=Date.now(),s=e.timeout?dV(e.timeout):uV(),a=hV(e.cacheTtl),c=e.cache!==!1;if(e.template){let H=new uc,J=e.param?H.parseParamString(e.param):{};if(r=H.applyTemplate(e.template,J),t==="text"){let L=H.getTemplate(e.template);console.log(`\u{1F4CB} Using template: ${e.template}`),Object.keys(J).length>0&&console.log(` Parameters: ${Object.entries(J).map(([$,Z])=>`${$}=${Z}`).join(", ")}`),console.log()}}else if(n)r=mV(n);else throw new He("Either a query argument or --template flag is required.",'exocortex sparql query "SELECT * WHERE { ?s ?p ?o }" or exocortex sparql query --template tasks-by-date --param date=2024-01-15');if(e.dryRun){await gV(r,e,t);return}let l=(0,Ql.resolve)(e.vault);if(c){let J=await new ac().get(r,a);if(J!==null){let L=Date.now()-i;if(t==="json"){let $=ce.success(J,{durationMs:L,itemCount:J.count||0,queryResultCacheHit:!0});console.log(JSON.stringify($,null,2))}else{console.log(`\u{1F4E6} (cached) Query result loaded from cache in ${L}ms
526
526
  `);let $=J;$.type==="select"&&$.bindings?(console.log(`\u2705 Found ${$.bindings.length} result(s)
527
527
  `),_V($.bindings,e.format)):$.type==="construct"&&$.triples&&(console.log(`\u2705 Generated ${$.triples.length} triple(s)
528
528
  `),wV($.triples,e.format))}return}}if(!(0,fc.existsSync)(l))throw new Be(l);t==="text"&&console.log(`\u{1F4E6} Loading vault: ${l}...`);let u=Date.now(),f,h=!1;if(e.useCache){let J=await new ki(l).loadOrBuild();f=J.triples,h=J.cacheHit,t==="text"&&h&&console.log("\u{1F680} Cache hit! Loading from persistent cache...")}else{let H=new nn(l);f=await new Ct.NoteToRDFConverter(H).convertVault()}let d=e.also||[];for(let H of d){let J=(0,Ql.resolve)(H);if(!(0,fc.existsSync)(J))throw new Be(J);t==="text"&&console.log(`\u{1F4E6} Loading additional vault: ${J}...`);let L=new nn(J),Z=await new Ct.NoteToRDFConverter(L).convertVault();f=f.concat(Z),t==="text"&&console.log(` \u2795 Added ${Z.length} triples from ${J}`)}let p=new Ct.InMemoryTripleStore;await p.addAll(f);let y=Date.now()-u;if(t==="text"){let H=h?" (from cache)":"",J=d.length>0?` (${d.length+1} vaults)`:"";console.log(`\u2705 Loaded ${f.length} triples in ${y}ms${H}${J}
@@ -635,7 +635,7 @@ ${hr.dump(i,{lineWidth:-1})}---
635
635
  States (${s.states.length}):`);for(let a of s.states){let c=a.optional?" (optional)":"",l=a.timestampOnEnter.length>0?` [timestamps: ${a.timestampOnEnter.join(", ")}]`:"";console.log(` ${a.order}. ${a.status}${c}${l}`)}console.log(`
636
636
  Transitions (${s.transitions.length}):`);for(let a of s.transitions){let c=a.isRollback?" (rollback)":"";console.log(` ${a.label}: ${a.from} \u2192 ${a.to}${c}`)}}}catch(i){V.handle(i)}}),n.command("validate").description("Validate a workflow definition").argument("<uid>","UID of the workflow asset").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--output <type>","Response format: text|json","text").action(async(e,t)=>{let r=t.output||"text";V.setFormat(r);try{let i=(0,Rc.resolve)(t.vault);if(!(0,ms.existsSync)(i))throw new Be(i);let s=RI(i,e);if(!s){if(r==="json"){let l=ce.success({error:`Workflow with UID "${e}" not found`});console.log(JSON.stringify(l,null,2))}else console.log(`\u274C Workflow with UID "${e}" not found.`);process.exitCode=1;return}let c=new mi.WorkflowEngine(s).validate();if(r==="json"){let l=ce.success({workflow:s.name,uid:s.id,...c});console.log(JSON.stringify(l,null,2))}else if(c.valid)console.log(`\u2705 Workflow "${s.name}" is valid.`);else{console.log(`\u274C Workflow "${s.name}" has ${c.errors.length} error(s):
637
637
  `);for(let l of c.errors)console.log(` \u2022 ${l}`);process.exitCode=1}}catch(i){V.handle(i)}}),n}o(PI,"workflowCommand");var FI=new mi.FrontmatterService;function DI(n){let e=[],t=[];NI(n,t);for(let{filePath:r,fm:i}of t){let s=i.exo__Instance_class;if(!s||!(Array.isArray(s)?s.some(p=>p.includes("ems__Workflow")&&!p.includes("WorkflowState")&&!p.includes("WorkflowTransition")):typeof s=="string"&&s.includes("ems__Workflow")&&!s.includes("WorkflowState")&&!s.includes("WorkflowTransition")))continue;let c=i.exo__Asset_uid??"",l=i.exo__Asset_label??uB(r),u=ps(i.ems__Workflow_targetClass??"ems__Task"),f=i.ems__Workflow_isDefault===!0||i.ems__Workflow_isDefault==="true",h=0,d=0;for(let{fm:p}of t){let y=p.exo__Instance_class;if(!ps(p.ems__WorkflowState_workflow??p.ems__WorkflowTransition_workflow??"").includes(c))continue;let S=Array.isArray(y)?y.some(F=>F.includes("ems__WorkflowState")):typeof y=="string"&&y.includes("ems__WorkflowState"),x=Array.isArray(y)?y.some(F=>F.includes("ems__WorkflowTransition")):typeof y=="string"&&y.includes("ems__WorkflowTransition");S&&h++,x&&d++}e.push({filePath:r,uid:c,label:l,targetClass:u,isDefault:f,stateCount:h,transitionCount:d})}return e}o(DI,"scanWorkflows");function NI(n,e){let t;try{t=(0,ms.readdirSync)(n,{withFileTypes:!0})}catch{return}for(let r of t){let i=(0,Rc.join)(n,r.name);if(r.isDirectory()){if(r.name.startsWith(".")||r.name==="node_modules")continue;NI(i,e)}else if(r.name.endsWith(".md"))try{let s=(0,ms.readFileSync)(i,"utf-8"),a=FI.parse(s);a.exists&&e.push({filePath:i,fm:kI(a.content)})}catch{}}}o(NI,"collectParsedFiles");function RI(n,e){let r=DI(n).find(i=>i.uid===e);if(!r)return null;try{let i=(0,ms.readFileSync)(r.filePath,"utf-8"),s=FI.parse(i);if(!s.exists)return null;let a=kI(s.content),c=ps(a.ems__Workflow_targetClass??"ems__Task"),l=ps(a.ems__Workflow_initialState??"ems__EffortStatusDraft"),u=Oc(l)??mi.EffortStatus.DRAFT,h=(Array.isArray(a.ems__Workflow_terminalStates)?a.ems__Workflow_terminalStates.map(S=>ps(S)):[]).map(Oc).filter(S=>S!==null),d=a.ems__Workflow_isDefault===!0||a.ems__Workflow_isDefault==="true",y=(Array.isArray(a.ems__Workflow_states)?a.ems__Workflow_states:[]).map((S,x)=>typeof S=="string"?{status:Oc(ps(S))??mi.EffortStatus.DRAFT,order:x+1,optional:!1,timestampOnEnter:[]}:{status:Oc(ps(S.status??""))??mi.EffortStatus.DRAFT,order:S.order??x+1,optional:S.optional===!0||S.optional==="true",timestampOnEnter:Array.isArray(S.timestampOnEnter)?S.timestampOnEnter:[],badgeColor:S.badgeColor}),T=(Array.isArray(a.ems__Workflow_transitions)?a.ems__Workflow_transitions:[]).map(S=>{let x=Oc(ps(S.from??"")),F=Oc(ps(S.to??""));return!x||!F?null:{from:x,to:F,label:S.label??`${x} \u2192 ${F}`,icon:S.icon,isRollback:S.isRollback===!0||S.isRollback==="true"}}).filter(S=>S!==null);return{id:e,name:r.label,targetClass:c,states:y,transitions:T,initialState:u,terminalStates:h.length>0?h:[mi.EffortStatus.DONE,mi.EffortStatus.TRASHED],isDefault:d}}catch{return null}}o(RI,"loadWorkflowByUid");function kI(n){let e={},t=n.split(`
638
- `),r="",i=null;for(let s of t){if(s.match(/^\s+-\s+/)&&r){let c=s.replace(/^\s+-\s+/,"").trim();i||(i=[]),i.push(c),e[r]=i;continue}let a=s.match(/^([a-zA-Z0-9_]+):\s*(.*)/);if(a){r=a[1],i=null;let c=a[2].trim();if((c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),c==="true"?c=!0:c==="false"&&(c=!1),c===""){e[r]=[],i=e[r];continue}e[r]=c}}return e}o(kI,"parseYamlFrontmatter");function ps(n){return typeof n!="string"?"":n.replace(/["'[\]]/g,"").trim()}o(ps,"normalizeWikilink");function uB(n){let e=n.split("/");return e[e.length-1].replace(/\.md$/,"")}o(uB,"extractLabelFromFilename");function Oc(n){return Object.values(mi.EffortStatus).includes(n)?n:null}o(Oc,"resolveEffortStatus");var Rr=new Ge;Rr.name("exocortex").description("CLI tool for Exocortex knowledge management system").version("15.47.4");var Gv=Rr.command("sparql").description("SPARQL query execution and cache management");Gv.addCommand($A());Gv.addCommand(qA());Gv.addCommand(WA());Rr.addCommand(JC());Rr.addCommand(tI());Rr.addCommand(rI());Rr.addCommand(iI());Rr.addCommand(sI());Rr.addCommand(uI());Rr.addCommand(pI());Rr.addCommand(yI());Rr.addCommand(wI());Rr.addCommand(xI());Rr.addCommand(II());Rr.addCommand(OI());Rr.addCommand(PI());Rr.parse();
638
+ `),r="",i=null;for(let s of t){if(s.match(/^\s+-\s+/)&&r){let c=s.replace(/^\s+-\s+/,"").trim();i||(i=[]),i.push(c),e[r]=i;continue}let a=s.match(/^([a-zA-Z0-9_]+):\s*(.*)/);if(a){r=a[1],i=null;let c=a[2].trim();if((c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),c==="true"?c=!0:c==="false"&&(c=!1),c===""){e[r]=[],i=e[r];continue}e[r]=c}}return e}o(kI,"parseYamlFrontmatter");function ps(n){return typeof n!="string"?"":n.replace(/["'[\]]/g,"").trim()}o(ps,"normalizeWikilink");function uB(n){let e=n.split("/");return e[e.length-1].replace(/\.md$/,"")}o(uB,"extractLabelFromFilename");function Oc(n){return Object.values(mi.EffortStatus).includes(n)?n:null}o(Oc,"resolveEffortStatus");var Rr=new Ge;Rr.name("exocortex").description("CLI tool for Exocortex knowledge management system").version("15.47.6");var Gv=Rr.command("sparql").description("SPARQL query execution and cache management");Gv.addCommand($A());Gv.addCommand(qA());Gv.addCommand(WA());Rr.addCommand(JC());Rr.addCommand(tI());Rr.addCommand(rI());Rr.addCommand(iI());Rr.addCommand(sI());Rr.addCommand(uI());Rr.addCommand(pI());Rr.addCommand(yI());Rr.addCommand(wI());Rr.addCommand(xI());Rr.addCommand(II());Rr.addCommand(OI());Rr.addCommand(PI());Rr.parse();
639
639
  /*! Bundled license information:
640
640
 
641
641
  reflect-metadata/Reflect.js:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitelev/exocortex-cli",
3
- "version": "15.47.4",
3
+ "version": "15.47.6",
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": {