@kitelev/exocortex-cli 16.255.14 → 16.255.16

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.255.14
2
+ // @kitelev/exocortex-cli v16.255.16
3
3
  // CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more
4
4
  // License: MIT
5
5
 
@@ -454,7 +454,7 @@ ${e}`}shouldSkipDirectory(e){return e.startsWith(".")}walkDirectory(e,t){let n;t
454
454
  \u2139\uFE0F ${p.length} warning(s)`+(h>0?` (${h} unresolvable class/symbolic ref(s) \u2014 not validated)`:"")+" \u2014 these do not affect the exit code.");let b=Y0e(p),_=Math.max(...b.map(S=>String(S.count).length));console.log(` Breakdown by reason (${p.length} total):`);for(let S of b)console.log(` ${String(S.count).padStart(_)} ${S.reason}`);if(g>0){console.log(` \u26A0\uFE0F ${m.size} term-IRI collision(s) \u2014 one IRI emitted by several assets (${g} entr${g===1?"y":"ies"}):`);for(let S of[...m].sort())console.log(` \u2022 ${S}`);console.log(" Run with --format json for the emitting assets.")}}}u.conforms||(process.exitCode=1)}catch(i){ue.handle(i)}}function Q0e(r,e,t){let n=q8(e),i=n.length>0?{...r,violations:[...r.violations,...n]}:r,s=RO(e,i);return t&&(s=xO(s,t)),s}function e7(){return new pe("schema").description("Check frontmatter properties against ontology (Issue #2713)").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--output <type>","Response format: text|json (for MCP tools)","text").option("--staged","Only validate git-staged .md files (for pre-commit hooks)").option("--use-cache","Use persistent triple cache (faster vault loading)").option("--shapes-mode","Run SHACL-lite shapes validation instead of schema linting").option("--format <type>","Output format for shapes-mode: text|json|earl","text").option("--class <iri>","Only validate assets whose exo__Instance_class matches this IRI/slug (RFC 8e83442b T1.4)").action(async r=>{let e=r.output||"text";if(ue.setFormat(e),r.shapesMode){await X0e(r);return}try{let t=(0,Ka.resolve)(r.vault);if(!(0,Vo.existsSync)(t))throw new Le(t);let n;if(r.staged){if(n=Q8(t),n.length===0){if(e==="json"){let f=pt.success({vaultPath:t,filesChecked:0,violations:[],healthy:!0});console.log(JSON.stringify(f,null,2))}else console.log("\u2705 No staged .md files to validate.");return}}else n=R0e(t);if(r.class){let f=r.class;n=n.filter(d=>{try{let p=(0,Vo.readFileSync)((0,Ka.resolve)(t,d),"utf-8"),h=K8(p);return T0e(h,f)}catch{return!1}})}e==="text"&&console.log(`\u{1F4E6} Loading vault: ${t}...`);let{triples:i,cacheHit:s}=await H8(t,!!r.useCache),o=i;e==="text"&&s&&console.log("\u{1F680} Cache hit! Loading from persistent cache..."),e==="text"&&(console.log(`\u2705 Loaded ${o.length} triples`),console.log("\u{1F50D} Querying ontology for declared properties..."));let c=await x0e(o);e==="text"&&(console.log(`\u{1F4CB} Found ${c.size} declared properties in ontology`),console.log(`\u{1F50D} Validating ${n.length} file(s)...
455
455
  `));let l=[];for(let f of n){let d=(0,Ka.resolve)(t,f),p=O0e(d,f,c);l.push(...p)}let u={vaultPath:t,filesChecked:n.length,violations:l,healthy:l.length===0};if(e==="json"){let f=pt.success(u);console.log(JSON.stringify(f,null,2))}else if(l.length===0)console.log(`\u2705 All ${n.length} file(s) pass schema validation.`);else{let f=new Map;for(let d of l){let p=f.get(d.file)||[];p.push(d),f.set(d.file,p)}console.log(`\u26A0\uFE0F Found ${l.length} schema violation(s) in ${f.size} file(s):
456
456
  `);for(let[d,p]of f){console.log(` \u274C ${d}`);for(let h of p)console.log(` \u2022 ${h.reason}`)}console.log(`
457
- \u{1F4DD} To fix these issues:`),console.log(" - Remove undeclared properties from frontmatter"),console.log(" - Or declare them in the ontology as Property instances")}l.length>0&&(process.exitCode=1)}catch(t){ue.handle(t)}})}var Vo,Ka,z8,ot,v0e,IO,A0e,F0e,D0e,L0e,AO,M0e,$0e,B0e,V0e,G0e,q0e,W0e,z0e,PO=Me(()=>{"use strict";ct();Vo=require("fs"),Ka=require("path"),z8=require("child_process");qm();ot=Q(Fe());St();W8();kt();Er();za();Hw();fg();v0e=new Set(["aliases","archived","tags","cssclasses","publish","permalink","description","image","cover","banner","title","share","share_link","share_updated","metadata","uri"]),IO=new Map([["exo__","https://exocortex.my/ontology/exo#"],["ems__","https://exocortex.my/ontology/ems#"],["exocmd__","https://exocortex.my/ontology/exocmd#"],["ims__","https://exocortex.my/ontology/ims#"],["exoql__","https://exocortex.my/ontology/exoql#"],["query__","https://exocortex.my/ontology/query#"],["ztlk__","https://exocortex.my/ontology/ztlk#"],["ptms__","https://exocortex.my/ontology/ptms#"],["lit__","https://exocortex.my/ontology/lit#"],["inbox__","https://exocortex.my/ontology/inbox#"],["place__","https://exocortex.my/ontology/place#"],["pn__","https://exocortex.my/ontology/pn#"],["period__","https://exocortex.my/ontology/period#"],["rdf__","http://www.w3.org/1999/02/22-rdf-syntax-ns#"],["rdfs__","http://www.w3.org/2000/01/rdf-schema#"],["owl__","http://www.w3.org/2002/07/owl#"],["xsd__","http://www.w3.org/2001/XMLSchema#"],["sh__","http://www.w3.org/ns/shacl#"]]);a(T0e,"frontmatterMatchesClass");a(H8,"loadTriplesFromAllVaults");A0e="http://www.w3.org/1999/02/22-rdf-syntax-ns#type";a(K8,"extractFrontmatter");a(Y8,"hasKnownPrefix");a(X8,"keyToURI");a(I0e,"classifyKeys");a(Q8,"getStagedMdFiles");a(R0e,"collectMdFiles");a(C0e,"extractPropertyNameFromURI");a(x0e,"loadDeclaredProperties");a(P0e,"detectUnparseableFrontmatter");a(O0e,"validateFile");F0e="http://www.w3.org/2000/01/rdf-schema#subClassOf",D0e="https://exocortex.my/ontology/exo#Class_superClass",L0e="http://www.w3.org/2000/01/rdf-schema#label";a(J8,"labelToOntologyIRI");a(N0e,"fileIriToOntologyURIFromFilename");a(k0e,"domainToAlgebraTriples");AO=class{constructor(e){this.subClassMap=new Map;let t=new Map,n=new Set,i=a(o=>o===F0e||o===D0e,"isSubClassPredicate");for(let o of e)o.predicate instanceof ot.DomainIRI&&i(o.predicate.value)&&o.subject instanceof ot.DomainIRI&&o.object instanceof ot.DomainIRI&&(n.add(o.subject.value),n.add(o.object.value));for(let o of e)if(o.predicate instanceof ot.DomainIRI&&o.predicate.value===L0e&&o.subject instanceof ot.DomainIRI&&o.object instanceof ot.DomainLiteral){let c=J8(o.object.value);c&&t.set(o.subject.value,c)}for(let o of n)if(!t.has(o)){let c=N0e(o);c&&t.set(o,c)}for(let[o,c]of t){let l=this.subClassMap.get(o)??new Set;l.add(c),this.subClassMap.set(o,l)}for(let o of e)if(o.predicate instanceof ot.DomainIRI&&i(o.predicate.value)&&o.subject instanceof ot.DomainIRI&&o.object instanceof ot.DomainIRI){let c=o.subject.value,l=o.object.value,u=this.subClassMap.get(c)??new Set;u.add(l),this.subClassMap.set(c,u);let f=t.get(c),d=l.startsWith("obsidian://")?t.get(l):l;if(f&&d){let p=this.subClassMap.get(f)??new Set;p.add(d),this.subClassMap.set(f,p)}}let s=e.filter(o=>o.predicate instanceof ot.DomainIRI&&o.predicate.value===A0e&&o.subject instanceof ot.DomainIRI&&o.object instanceof ot.DomainIRI);for(let o of s){let c=o.subject.value,l=o.object.value,u=this.collectAncestors(l);for(let d of u){if(c===d)continue;let p=this.subClassMap.get(c)??new Set;p.add(d),this.subClassMap.set(c,p)}let f=t.get(c);if(f)for(let d of u){let p=d.startsWith("obsidian://")?t.get(d):d;if(!p||f===p)continue;let h=this.subClassMap.get(f)??new Set;h.add(p),this.subClassMap.set(f,h)}}}static{a(this,"TripleClassHierarchy")}collectAncestors(e){let t=new Set,n=new Set,i=[e];for(;i.length>0;){let s=i.shift();if(n.has(s))continue;n.add(s);let o=this.subClassMap.get(s);if(o)for(let c of o)c!==e&&(t.add(c),n.has(c)||i.push(c))}return t}isSubClassOf(e,t){let n=new Set,i=[e];for(;i.length>0;){let s=i.shift();if(s===t)return!0;if(n.has(s))continue;n.add(s);let o=this.subClassMap.get(s);if(o)for(let c of o)i.push(c)}return!1}},M0e=new Set(["sh:Warning","sh:Info"]);a(j0e,"earlOutcomeFor");a(Z8,"buildEARLReport");$0e="https://exocortex.my/ontology/exo#Asset_legacyValidationException";a(RO,"applyLegacyExceptionFilter");a(CO,"runShapesValidation");a(xO,"filterReportToStagedFocusNodes");a(U0e,"emitEmptyStagedShapesResult");B0e="class target IRI has no path segment under obsidian://vault/",V0e="class target IRI has a path segment under obsidian://vault/",G0e="class target IRI is not under obsidian://vault/ (symbolic term IRI)",q0e="term-IRI collision (one IRI emitted by several assets)",W0e="unknown property (no registered shape)",z0e="class constraint with no target recorded (nothing to classify by)";a(H0e,"targetHasPathSegment");a(K0e,"classifyWarningReason");a(Y0e,"summarizeWarningReasons");a(X0e,"runShapesModeAction");a(Q0e,"assembleShapesReport");a(e7,"validateSchemaCommand")});var P7={};qu(P7,{CandidateShaclValidator:()=>GO});function Abe(r){let e=r.match(/^https:\/\/exocortex\.my\/ontology\/([A-Za-z][A-Za-z0-9_]*(?:-[A-Za-z0-9_]+)*)#(.+)$/);return e?`${e[1]}__${e[2]}`:r}function Ibe(r){let e=(0,Sg.basename)(r);return{path:r,basename:(0,Sg.basename)(r,(0,Sg.extname)(r)),name:e,parent:null}}function Rbe(r){let e=r.match(Tbe);return e?(0,dE.parseYamlFrontmatterTolerant)(e[1]):null}var Sg,dE,Tbe,GO,O7=Me(()=>{"use strict";Sg=require("path"),dE=Q(Fe());Xs();PO();za();Tbe=/^---\n([\s\S]*?)\n---/,GO=class{constructor(e,t={}){this.vaultPath=e;this.options=t}static{a(this,"CandidateShaclValidator")}async validateCandidate(e,t){let n=new Ht(this.vaultPath),i=new dE.NoteToRDFConverter(n),s=Ibe(e),o=Rbe(t),c=o?i.validateExocortexAsset(o,s.basename):null;if(c)return{violations:[{propertyPath:c.property,propertyIri:c.property,constraint:c.code,message:`${c.message} \u2014 the asset would be SKIPPED by the indexer (no triples emitted), making it invisible to every query, layout and graph relation.`}],warnings:[]};let l=this.options.useCache??!1,u=await yi(this.vaultPath,{useCache:l,cacheManager:this.options.cacheManager,vaultAdapter:n});l&&this.options.log?.(Eu(u));let f=u.triples,d;try{d=await i.convertNoteFromFrontmatter(s,o)}catch(S){return{violations:[{propertyPath:e,propertyIri:e,constraint:"indexability",message:`The asset could not be converted to RDF (${S instanceof Error?S.message:String(S)}) \u2014 the indexer would SKIP it, making it invisible to every query, layout and graph relation.`}],warnings:[]}}let p=[...f,...d],h=await CO(this.vaultPath,p),g=RO(p,h),m=xO(g,new Set([e])),b=[],_=[];for(let S of m.violations){let I={propertyPath:Abe(S.propertyPath),propertyIri:S.propertyPath,constraint:String(S.constraint),message:S.message,...S.actualValue!==void 0?{actualValue:S.actualValue}:{},...S.expectedRange!==void 0?{expectedRange:S.expectedRange}:{}};S.severity==="sh:Violation"?b.push(I):_.push(I)}return{violations:b,warnings:_}}};a(Abe,"iriToFrontmatterKey");a(Ibe,"syntheticFile");a(Rbe,"extractFrontmatter")});var Z7=T(Pn=>{"use strict";Object.defineProperty(Pn,"__esModule",{value:!0});Pn.createPathBasedTargetResolver=no;Pn.createCreateRelatedTaskService=f_e;Pn.createCreateRelatedProjectService=d_e;Pn.createCreateAssetService=p_e;Pn.createArchiveAssetService=h_e;Pn.createCleanPropertiesService=m_e;Pn.createFixMissingLabelService=g_e;Pn.createRenameToUidService=y_e;Pn.createRepairFolderService=__e;Pn.createPlanForEveningService=S_e;Pn.createUpdatePropertyService=w_e;Pn.createRemovePropertyService=E_e;Pn.createSetStatusService=v_e;Pn.createDuplicateAssetService=T_e;Pn.rewriteFrontmatterScalars=J7;var Cg=Fe();function no(r){return{resolveFile(e){let t=(0,Cg.iriToVaultPath)(e)??e,n=t.endsWith(".md")?t:`${t}.md`,i=r.getAbstractFileByPath(n);if(!i||!("basename"in i))throw new Error(`Cannot resolve target file for IRI: ${e}`);return i}}}a(no,"createPathBasedTargetResolver");var QO=a(()=>null,"NULL_CLASS_RESOLVER");function SE(r){return r.startsWith('"[[')&&r.endsWith(']]"')?r:r.startsWith("[[")&&r.endsWith("]]")?`"${r}"`:`"[[${r}]]"`}a(SE,"toQuotedWikilink");function f_e(r,e,t=no(r),n,i=QO){return{async execute(s,o){let c=o?.label;if(!c)throw new Error("createRelatedTask requires userInput.label");let l=t.resolveFile(s),u=r.getFrontmatter(l)??{},f=l.parent?.path||"",d={ems__Effort_status:'"[[c42245d0-01de-4c35-bfcf-d910445ea28e]]"'},p=o?.parentProperty;p&&l.basename&&(d[p]=`"[[${l.basename}]]"`);let h=await e.createAsset({className:"ems__Task",label:c,folderPath:f,propertyValues:d,parentFile:l,parentMetadata:u,classResolver:i});n&&await n(h)}}}a(f_e,"createCreateRelatedTaskService");function d_e(r,e,t=no(r),n,i=QO){return{async execute(s,o){let c=o?.label;if(!c)throw new Error("createRelatedProject requires userInput.label");let l=t.resolveFile(s),u=r.getFrontmatter(l)??{},f=l.parent?.path||"",d={ems__Effort_status:'"[[c42245d0-01de-4c35-bfcf-d910445ea28e]]"'},p=o?.parentProperty;p&&l.basename&&(d[p]=`"[[${l.basename}]]"`);let h=await e.createAsset({className:"ems__Project",label:c,folderPath:f,propertyValues:d,parentFile:l,parentMetadata:u,classResolver:i});n&&await n(h)}}}a(d_e,"createCreateRelatedProjectService");function p_e(r,e,t=QO,n=no(r)){return{async execute(i,s){let o=s?.prototypeUID??s?.prototype,c=s?.label,l=s?.folder,u=s?.ownerIdentity,f=s?.isDefinedBy;if(!o)throw new Error("createAsset requires userInput.prototypeUID");if(!c)throw new Error("createAsset requires userInput.label");let d,p;if(i)try{let w=n.resolveFile(i);d=w.path,p=r.getFrontmatter(w)??void 0}catch{}if(!l&&d){let w=d.lastIndexOf("/");l=w>=0?d.substring(0,w):""}if(l===void 0)throw new Error("createAsset requires userInput.folder");let h=o.endsWith("Prototype")?o.slice(0,-9):o,g=crypto.randomUUID(),m=Cg.DateFormatter.toISOTimestamp(new Date),b=`${g}.md`,_=l?`${l}/${b}`:b,S=["---",`exo__Asset_uid: ${g}`,`exo__Asset_createdAt: ${m}`,`exo__Asset_label: ${c}`,`exo__Asset_prototype: "[[${o}]]"`,"exo__Instance_class:",` - "[[${h}]]"`],I=!1;if(f&&(S.push(`exo__Asset_isDefinedBy: ${SE(f)}`),I=!0),p){let w=p.exo__Instance_class,x=(Array.isArray(w)?w:w!=null?[w]:[]).some(N=>Cg.WikiLinkHelpers.resolveSymbolic(String(N),t).includes("Area")),O=d?d.substring(d.lastIndexOf("/")+1).replace(/\.md$/,""):void 0;if(O){let N=x?"ems__Effort_area":"ems__Effort_parent";S.push(`${N}: "[[${O}]]"`)}!x&&p.ems__Effort_area&&S.push(`ems__Effort_area: ${SE(String(p.ems__Effort_area))}`),S.push('ems__Effort_status: "[[753a44d5-846c-4b82-9196-4fd9a4d48777]]"'),!I&&p.exo__Asset_isDefinedBy&&(S.push(`exo__Asset_isDefinedBy: ${SE(String(p.exo__Asset_isDefinedBy))}`),I=!0)}!I&&u&&S.push(`exo__Asset_isDefinedBy: ${SE(u)}`),S.push("---","");let E=S.join(`
457
+ \u{1F4DD} To fix these issues:`),console.log(" - Remove undeclared properties from frontmatter"),console.log(" - Or declare them in the ontology as Property instances")}l.length>0&&(process.exitCode=1)}catch(t){ue.handle(t)}})}var Vo,Ka,z8,ot,v0e,IO,A0e,F0e,D0e,L0e,AO,M0e,$0e,B0e,V0e,G0e,q0e,W0e,z0e,PO=Me(()=>{"use strict";ct();Vo=require("fs"),Ka=require("path"),z8=require("child_process");qm();ot=Q(Fe());St();W8();kt();Er();za();Hw();fg();v0e=new Set(["aliases","archived","tags","cssclasses","publish","permalink","description","image","cover","banner","title","share","share_link","share_updated","metadata","uri"]),IO=new Map([["exo__","https://exocortex.my/ontology/exo#"],["ems__","https://exocortex.my/ontology/ems#"],["exocmd__","https://exocortex.my/ontology/exocmd#"],["ims__","https://exocortex.my/ontology/ims#"],["exoql__","https://exocortex.my/ontology/exoql#"],["query__","https://exocortex.my/ontology/query#"],["ztlk__","https://exocortex.my/ontology/ztlk#"],["ptms__","https://exocortex.my/ontology/ptms#"],["lit__","https://exocortex.my/ontology/lit#"],["inbox__","https://exocortex.my/ontology/inbox#"],["place__","https://exocortex.my/ontology/place#"],["pn__","https://exocortex.my/ontology/pn#"],["period__","https://exocortex.my/ontology/period#"],["rdf__","http://www.w3.org/1999/02/22-rdf-syntax-ns#"],["rdfs__","http://www.w3.org/2000/01/rdf-schema#"],["owl__","http://www.w3.org/2002/07/owl#"],["xsd__","http://www.w3.org/2001/XMLSchema#"],["sh__","http://www.w3.org/ns/shacl#"]]);a(T0e,"frontmatterMatchesClass");a(H8,"loadTriplesFromAllVaults");A0e="http://www.w3.org/1999/02/22-rdf-syntax-ns#type";a(K8,"extractFrontmatter");a(Y8,"hasKnownPrefix");a(X8,"keyToURI");a(I0e,"classifyKeys");a(Q8,"getStagedMdFiles");a(R0e,"collectMdFiles");a(C0e,"extractPropertyNameFromURI");a(x0e,"loadDeclaredProperties");a(P0e,"detectUnparseableFrontmatter");a(O0e,"validateFile");F0e="http://www.w3.org/2000/01/rdf-schema#subClassOf",D0e="https://exocortex.my/ontology/exo#Class_superClass",L0e="http://www.w3.org/2000/01/rdf-schema#label";a(J8,"labelToOntologyIRI");a(N0e,"fileIriToOntologyURIFromFilename");a(k0e,"domainToAlgebraTriples");AO=class{constructor(e){this.subClassMap=new Map;this.subClassMemo=new Map;let t=new Map,n=new Set,i=a(o=>o===F0e||o===D0e,"isSubClassPredicate");for(let o of e)o.predicate instanceof ot.DomainIRI&&i(o.predicate.value)&&o.subject instanceof ot.DomainIRI&&o.object instanceof ot.DomainIRI&&(n.add(o.subject.value),n.add(o.object.value));for(let o of e)if(o.predicate instanceof ot.DomainIRI&&o.predicate.value===L0e&&o.subject instanceof ot.DomainIRI&&o.object instanceof ot.DomainLiteral){let c=J8(o.object.value);c&&t.set(o.subject.value,c)}for(let o of n)if(!t.has(o)){let c=N0e(o);c&&t.set(o,c)}for(let[o,c]of t){let l=this.subClassMap.get(o)??new Set;l.add(c),this.subClassMap.set(o,l)}for(let o of e)if(o.predicate instanceof ot.DomainIRI&&i(o.predicate.value)&&o.subject instanceof ot.DomainIRI&&o.object instanceof ot.DomainIRI){let c=o.subject.value,l=o.object.value,u=this.subClassMap.get(c)??new Set;u.add(l),this.subClassMap.set(c,u);let f=t.get(c),d=l.startsWith("obsidian://")?t.get(l):l;if(f&&d){let p=this.subClassMap.get(f)??new Set;p.add(d),this.subClassMap.set(f,p)}}let s=e.filter(o=>o.predicate instanceof ot.DomainIRI&&o.predicate.value===A0e&&o.subject instanceof ot.DomainIRI&&o.object instanceof ot.DomainIRI);for(let o of s){let c=o.subject.value,l=o.object.value,u=this.collectAncestors(l);for(let d of u){if(c===d)continue;let p=this.subClassMap.get(c)??new Set;p.add(d),this.subClassMap.set(c,p)}let f=t.get(c);if(f)for(let d of u){let p=d.startsWith("obsidian://")?t.get(d):d;if(!p||f===p)continue;let h=this.subClassMap.get(f)??new Set;h.add(p),this.subClassMap.set(f,h)}}}static{a(this,"TripleClassHierarchy")}collectAncestors(e){let t=new Set,n=new Set,i=[e];for(;i.length>0;){let s=i.shift();if(n.has(s))continue;n.add(s);let o=this.subClassMap.get(s);if(o)for(let c of o)c!==e&&(t.add(c),n.has(c)||i.push(c))}return t}isSubClassOf(e,t){let n=this.subClassMemo.get(e);if(n){let s=n.get(t);if(s!==void 0)return s}else n=new Map,this.subClassMemo.set(e,n);let i=this.walkIsSubClassOf(e,t);return n.set(t,i),i}walkIsSubClassOf(e,t){let n=new Set,i=[e];for(;i.length>0;){let s=i.shift();if(s===t)return!0;if(n.has(s))continue;n.add(s);let o=this.subClassMap.get(s);if(o)for(let c of o)i.push(c)}return!1}},M0e=new Set(["sh:Warning","sh:Info"]);a(j0e,"earlOutcomeFor");a(Z8,"buildEARLReport");$0e="https://exocortex.my/ontology/exo#Asset_legacyValidationException";a(RO,"applyLegacyExceptionFilter");a(CO,"runShapesValidation");a(xO,"filterReportToStagedFocusNodes");a(U0e,"emitEmptyStagedShapesResult");B0e="class target IRI has no path segment under obsidian://vault/",V0e="class target IRI has a path segment under obsidian://vault/",G0e="class target IRI is not under obsidian://vault/ (symbolic term IRI)",q0e="term-IRI collision (one IRI emitted by several assets)",W0e="unknown property (no registered shape)",z0e="class constraint with no target recorded (nothing to classify by)";a(H0e,"targetHasPathSegment");a(K0e,"classifyWarningReason");a(Y0e,"summarizeWarningReasons");a(X0e,"runShapesModeAction");a(Q0e,"assembleShapesReport");a(e7,"validateSchemaCommand")});var P7={};qu(P7,{CandidateShaclValidator:()=>GO});function Abe(r){let e=r.match(/^https:\/\/exocortex\.my\/ontology\/([A-Za-z][A-Za-z0-9_]*(?:-[A-Za-z0-9_]+)*)#(.+)$/);return e?`${e[1]}__${e[2]}`:r}function Ibe(r){let e=(0,Sg.basename)(r);return{path:r,basename:(0,Sg.basename)(r,(0,Sg.extname)(r)),name:e,parent:null}}function Rbe(r){let e=r.match(Tbe);return e?(0,dE.parseYamlFrontmatterTolerant)(e[1]):null}var Sg,dE,Tbe,GO,O7=Me(()=>{"use strict";Sg=require("path"),dE=Q(Fe());Xs();PO();za();Tbe=/^---\n([\s\S]*?)\n---/,GO=class{constructor(e,t={}){this.vaultPath=e;this.options=t}static{a(this,"CandidateShaclValidator")}async validateCandidate(e,t){let n=new Ht(this.vaultPath),i=new dE.NoteToRDFConverter(n),s=Ibe(e),o=Rbe(t),c=o?i.validateExocortexAsset(o,s.basename):null;if(c)return{violations:[{propertyPath:c.property,propertyIri:c.property,constraint:c.code,message:`${c.message} \u2014 the asset would be SKIPPED by the indexer (no triples emitted), making it invisible to every query, layout and graph relation.`}],warnings:[]};let l=this.options.useCache??!1,u=await yi(this.vaultPath,{useCache:l,cacheManager:this.options.cacheManager,vaultAdapter:n});l&&this.options.log?.(Eu(u));let f=u.triples,d;try{d=await i.convertNoteFromFrontmatter(s,o)}catch(S){return{violations:[{propertyPath:e,propertyIri:e,constraint:"indexability",message:`The asset could not be converted to RDF (${S instanceof Error?S.message:String(S)}) \u2014 the indexer would SKIP it, making it invisible to every query, layout and graph relation.`}],warnings:[]}}let p=[...f,...d],h=await CO(this.vaultPath,p),g=RO(p,h),m=xO(g,new Set([e])),b=[],_=[];for(let S of m.violations){let I={propertyPath:Abe(S.propertyPath),propertyIri:S.propertyPath,constraint:String(S.constraint),message:S.message,...S.actualValue!==void 0?{actualValue:S.actualValue}:{},...S.expectedRange!==void 0?{expectedRange:S.expectedRange}:{}};S.severity==="sh:Violation"?b.push(I):_.push(I)}return{violations:b,warnings:_}}};a(Abe,"iriToFrontmatterKey");a(Ibe,"syntheticFile");a(Rbe,"extractFrontmatter")});var Z7=T(Pn=>{"use strict";Object.defineProperty(Pn,"__esModule",{value:!0});Pn.createPathBasedTargetResolver=no;Pn.createCreateRelatedTaskService=f_e;Pn.createCreateRelatedProjectService=d_e;Pn.createCreateAssetService=p_e;Pn.createArchiveAssetService=h_e;Pn.createCleanPropertiesService=m_e;Pn.createFixMissingLabelService=g_e;Pn.createRenameToUidService=y_e;Pn.createRepairFolderService=__e;Pn.createPlanForEveningService=S_e;Pn.createUpdatePropertyService=w_e;Pn.createRemovePropertyService=E_e;Pn.createSetStatusService=v_e;Pn.createDuplicateAssetService=T_e;Pn.rewriteFrontmatterScalars=J7;var Cg=Fe();function no(r){return{resolveFile(e){let t=(0,Cg.iriToVaultPath)(e)??e,n=t.endsWith(".md")?t:`${t}.md`,i=r.getAbstractFileByPath(n);if(!i||!("basename"in i))throw new Error(`Cannot resolve target file for IRI: ${e}`);return i}}}a(no,"createPathBasedTargetResolver");var QO=a(()=>null,"NULL_CLASS_RESOLVER");function SE(r){return r.startsWith('"[[')&&r.endsWith(']]"')?r:r.startsWith("[[")&&r.endsWith("]]")?`"${r}"`:`"[[${r}]]"`}a(SE,"toQuotedWikilink");function f_e(r,e,t=no(r),n,i=QO){return{async execute(s,o){let c=o?.label;if(!c)throw new Error("createRelatedTask requires userInput.label");let l=t.resolveFile(s),u=r.getFrontmatter(l)??{},f=l.parent?.path||"",d={ems__Effort_status:'"[[c42245d0-01de-4c35-bfcf-d910445ea28e]]"'},p=o?.parentProperty;p&&l.basename&&(d[p]=`"[[${l.basename}]]"`);let h=await e.createAsset({className:"ems__Task",label:c,folderPath:f,propertyValues:d,parentFile:l,parentMetadata:u,classResolver:i});n&&await n(h)}}}a(f_e,"createCreateRelatedTaskService");function d_e(r,e,t=no(r),n,i=QO){return{async execute(s,o){let c=o?.label;if(!c)throw new Error("createRelatedProject requires userInput.label");let l=t.resolveFile(s),u=r.getFrontmatter(l)??{},f=l.parent?.path||"",d={ems__Effort_status:'"[[c42245d0-01de-4c35-bfcf-d910445ea28e]]"'},p=o?.parentProperty;p&&l.basename&&(d[p]=`"[[${l.basename}]]"`);let h=await e.createAsset({className:"ems__Project",label:c,folderPath:f,propertyValues:d,parentFile:l,parentMetadata:u,classResolver:i});n&&await n(h)}}}a(d_e,"createCreateRelatedProjectService");function p_e(r,e,t=QO,n=no(r)){return{async execute(i,s){let o=s?.prototypeUID??s?.prototype,c=s?.label,l=s?.folder,u=s?.ownerIdentity,f=s?.isDefinedBy;if(!o)throw new Error("createAsset requires userInput.prototypeUID");if(!c)throw new Error("createAsset requires userInput.label");let d,p;if(i)try{let w=n.resolveFile(i);d=w.path,p=r.getFrontmatter(w)??void 0}catch{}if(!l&&d){let w=d.lastIndexOf("/");l=w>=0?d.substring(0,w):""}if(l===void 0)throw new Error("createAsset requires userInput.folder");let h=o.endsWith("Prototype")?o.slice(0,-9):o,g=crypto.randomUUID(),m=Cg.DateFormatter.toISOTimestamp(new Date),b=`${g}.md`,_=l?`${l}/${b}`:b,S=["---",`exo__Asset_uid: ${g}`,`exo__Asset_createdAt: ${m}`,`exo__Asset_label: ${c}`,`exo__Asset_prototype: "[[${o}]]"`,"exo__Instance_class:",` - "[[${h}]]"`],I=!1;if(f&&(S.push(`exo__Asset_isDefinedBy: ${SE(f)}`),I=!0),p){let w=p.exo__Instance_class,x=(Array.isArray(w)?w:w!=null?[w]:[]).some(N=>Cg.WikiLinkHelpers.resolveSymbolic(String(N),t).includes("Area")),O=d?d.substring(d.lastIndexOf("/")+1).replace(/\.md$/,""):void 0;if(O){let N=x?"ems__Effort_area":"ems__Effort_parent";S.push(`${N}: "[[${O}]]"`)}!x&&p.ems__Effort_area&&S.push(`ems__Effort_area: ${SE(String(p.ems__Effort_area))}`),S.push('ems__Effort_status: "[[753a44d5-846c-4b82-9196-4fd9a4d48777]]"'),!I&&p.exo__Asset_isDefinedBy&&(S.push(`exo__Asset_isDefinedBy: ${SE(String(p.exo__Asset_isDefinedBy))}`),I=!0)}!I&&u&&S.push(`exo__Asset_isDefinedBy: ${SE(u)}`),S.push("---","");let E=S.join(`
458
458
  `);await e.createFile(_,E)}}}a(p_e,"createCreateAssetService");function h_e(r,e,t=no(r)){return{async execute(n){let i=t.resolveFile(n);await e.archiveAsset(i)}}}a(h_e,"createArchiveAssetService");function m_e(r,e,t=no(r)){return{async execute(n){let i=t.resolveFile(n);await e.cleanEmptyProperties(i)}}}a(m_e,"createCleanPropertiesService");function g_e(r,e,t=no(r)){return{async execute(n){let i=t.resolveFile(n);await e.fixMissingLabel(i)}}}a(g_e,"createFixMissingLabelService");function y_e(r,e,t=no(r)){return{async execute(n){let i=t.resolveFile(n),s=r.getFrontmatter(i)??{};await e.renameToUid(i,s)}}}a(y_e,"createRenameToUidService");async function b_e(r,e,t){try{let n=await r.read(t),i=e.parseObject(n);if(i)return i}catch{}return r.getFrontmatter(t)??{}}a(b_e,"readFreshFrontmatter");function __e(r,e,t=no(r)){let n=new Cg.FrontmatterService;return{async execute(i){let s=t.resolveFile(i),o=await b_e(r,n,s),c=await e.getExpectedFolder(s,o);if(c===null)throw new Error("repairFolder: cannot determine expected folder (missing exo__Asset_isDefinedBy or referenced asset not found)");(s.parent?.path??"")!==c&&await e.repairFolder(s,c)}}}a(__e,"createRepairFolderService");function S_e(r,e,t=no(r)){return{async execute(n){let i=t.resolveFile(n);await e.planForEvening(i)}}}a(S_e,"createPlanForEveningService");function w_e(r,e,t){return{async execute(n,i){let s=i?.property,o=i?.value;if(!s)throw new Error(`updateProperty requires userInput.property \u2014 pass it via --input '{"property":"<name>","value":"<value>"}'`);if(o===void 0)throw new Error(`updateProperty requires userInput.value \u2014 pass it via --input '{"value":"<value>"}' (e.g. set-planned-start: --input '{"value":"2026-07-25T09:00:00"}')`);let c=await t.resolveTargetPath(n),l=await r.readFile(c),u=e.updateProperty(l,s,o);await r.updateFile(c,u)}}}a(w_e,"createUpdatePropertyService");function E_e(r,e,t){return{async execute(n,i){let s=i?.property;if(!s)throw new Error("removeProperty requires userInput.property");let o=await t.resolveTargetPath(n),c=await r.readFile(o),l=e.removeProperty(c,s);await r.updateFile(o,l)}}}a(E_e,"createRemovePropertyService");function v_e(r,e,t){return{async execute(n,i){let s=i?.statusUID;if(!s)throw new Error("setStatus requires userInput.statusUID");let o=await t.resolveTargetPath(n),c=await r.readFile(o),l=e.updateProperty(c,"ems__Effort_status",`"[[${s}]]"`);await r.updateFile(o,l)}}}a(v_e,"createSetStatusService");function T_e(r,e=no(r),t){return{async execute(n){if(!n)throw new Error("duplicateAsset requires an active target \u2014 open an Exocortex asset before invoking");let i=e.resolveFile(n),s=await r.read(i),o=crypto.randomUUID(),c=Cg.DateFormatter.toLocalTimestamp(new Date),l=J7(s,{exo__Asset_uid:o,exo__Asset_createdAt:c}),u=i.parent?.path??"",f=u?`${u}/${o}.md`:`${o}.md`,d=await r.create(f,l);t&&await t(d)}}}a(T_e,"createDuplicateAssetService");function J7(r,e){let t=r.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!t)throw new Error("duplicateAsset: source file has no YAML frontmatter block");let n=t[1],i=new Map(Object.entries(e)),s=n.split(`
459
459
  `).map(u=>{let f=u.match(/^([A-Za-z_][A-Za-z0-9_]*):/);if(!f)return u;let d=f[1],p=i.get(d);return p===void 0?u:(i.delete(d),`${d}: ${p}`)});for(let[u,f]of i)s.push(`${u}: ${f}`);let o=s.join(`
460
460
  `),c=t[0].includes(`\r
@@ -699,7 +699,7 @@ Next steps:
699
699
  `).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(ywe,"parseLastJsonLine");function fG(r,e){return e.filter(t=>{let n=r[t];return typeof n!="string"||n.trim().length===0})}a(fG,"missingStringFields");var BE=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:uG,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:uG,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:mwe,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:lG}};case"tools/call":return{jsonrpc:"2.0",id:i,result:await this.callTool(e.params??{})};default:return{jsonrpc:"2.0",id:i,error:{code:gwe,message:`Method not found: ${e.method}`}}}}async callTool(e){let t=e.name,n=e.arguments??{},i;if(t==="create_asset"){let c=fG(n,["vault","class","label"]);if(c.length>0)return Ep(`create_asset: missing required argument(s): ${c.join(", ")}`,!0);let l=oG(n);if(l!==null)return Ep(`create_asset: ${l}`,!0);i=aG(n)}else if(t==="create_effort"){let c=fG(n,["vault","command","target"]);if(c.length>0)return Ep(`create_effort: missing required argument(s): ${c.join(", ")}`,!0);i=cG(n)}else return Ep(`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 Ep(`exocortex-cli exited ${s.exitCode}
700
700
  ${c}`,!0)}let o=ywe(s.stdout);return Ep(o===void 0?s.stdout.trim():JSON.stringify(o))}};var hG=require("child_process");var bwe=32*1024*1024;function mG(r){return e=>new Promise(t=>{(0,hG.execFile)(process.execPath,[r,...e],{maxBuffer:bwe},(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(mG,"createSelfCliRunner");async function _we(r,e,t){let n=(0,gG.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:dG,message:"Parse error: invalid JSON"}})+`
701
701
  `);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:pG,message:`Internal error: ${l instanceof Error?l.message:String(l)}`}}}c!==null&&t(JSON.stringify(c)+`
702
- `)}}a(_we,"runStdioServer");function yG(r){return new pe("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 BE({runCli:mG(t),version:r??"unknown"});await _we(n,process.stdin,i=>process.stdout.write(i))})}a(yG,"mcpCommand");function VE(r){let e=new pe;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more").version(r??"16.255.14"),e.addCommand(Q7()),e.addCommand(aV()),e.addCommand(F8()),e.addCommand(k8()),e.addCommand(n7()),e.addCommand(M8()),e.addCommand(V8()),e.addCommand(G8()),e.addCommand(f7()),e.addCommand(g7()),e.addCommand(N7()),e.addCommand(U7()),e.addCommand(q7()),e.addCommand(W7()),e.addCommand(H7()),e.addCommand(K7()),e.addCommand(PV()),e.addCommand(DV()),e.addCommand(KV()),e.addCommand(XV()),e.addCommand(ZV()),e.addCommand(eG()),e.addCommand(nG()),e.addCommand($V()),e.addCommand(WV()),e.addCommand(iG()),e.addCommand(yG(r??"16.255.14")),e}a(VE,"createProgram");VE().parse();0&&(module.exports={createProgram});
702
+ `)}}a(_we,"runStdioServer");function yG(r){return new pe("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 BE({runCli:mG(t),version:r??"unknown"});await _we(n,process.stdin,i=>process.stdout.write(i))})}a(yG,"mcpCommand");function VE(r){let e=new pe;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more").version(r??"16.255.16"),e.addCommand(Q7()),e.addCommand(aV()),e.addCommand(F8()),e.addCommand(k8()),e.addCommand(n7()),e.addCommand(M8()),e.addCommand(V8()),e.addCommand(G8()),e.addCommand(f7()),e.addCommand(g7()),e.addCommand(N7()),e.addCommand(U7()),e.addCommand(q7()),e.addCommand(W7()),e.addCommand(H7()),e.addCommand(K7()),e.addCommand(PV()),e.addCommand(DV()),e.addCommand(KV()),e.addCommand(XV()),e.addCommand(ZV()),e.addCommand(eG()),e.addCommand(nG()),e.addCommand($V()),e.addCommand(WV()),e.addCommand(iG()),e.addCommand(yG(r??"16.255.16")),e}a(VE,"createProgram");VE().parse();0&&(module.exports={createProgram});
703
703
  /*! Bundled license information:
704
704
 
705
705
  reflect-metadata/Reflect.js:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitelev/exocortex-cli",
3
- "version": "16.255.14",
3
+ "version": "16.255.16",
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": {