@kitelev/exocortex-cli 16.86.0 → 16.87.0

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.86.0
2
+ // @kitelev/exocortex-cli v16.87.0
3
3
  // CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more
4
4
  // License: MIT
5
5
 
@@ -644,7 +644,7 @@ Available prefixes: ${u}`,this.wellKnownPrefixes[r]&&c.push(`Add: PREFIX ${r}: <
644
644
  `),C.length>0?gre(C,e.format):console.log("No results found."),L.length>0){console.log(`
645
645
  \u{1F4A1} Suggestions:`);for(let P of L)console.log(` \u2022 ${P}`)}if(o.confidence<.6&&o.alternatives.length>0){console.log(`
646
646
  \u{1F504} Alternative queries that might work better:`);for(let P=0;P<Math.min(2,o.alternatives.length);P++)console.log(` ${P+1}. ${o.alternatives[P].split(`
647
- `).slice(-3)[0]?.trim()||"..."}`)}}}catch(r){be.handle(r)}})}a(Lk,"askCommand");function gre(n,e){let t=n;switch(e){case"json":let r=new Ou;console.log(r.format(t));break;case"table":default:let i=new Pu;console.log(i.format(t));break}}a(gre,"formatResults");var Yk=require("fs"),Jk=require("path");var yi=require("fs"),En=require("path"),kk=require("child_process"),Fe=re(it());var yre=new Set(["aliases","archived","tags","cssclasses","publish","permalink","description","image","cover","banner","title","share","share_link","share_updated","metadata","uri"]),q2=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#"],["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#"],["exoob__","https://exocortex.my/ontology/exoob#"],["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#"]]);function bre(n,e){if(!n)return!1;let t=n.exo__Instance_class;if(t==null)return!1;let r=Array.isArray(t)?t:[t];for(let i of r){if(typeof i!="string")continue;let s=i.match(/\[\[([^|\]]+)/),o=s?s[1]:i;if(o===e||o.includes(e))return!0}return!1}a(bre,"frontmatterMatchesClass");function _re(n,e){return e.concat([n])}a(_re,"collectAlso");async function Mk(n,e,t,r){t&&e.length>0&&(r&&console.log("\u26A0\uFE0F --use-cache is disabled when --also is specified (per-vault cache cannot represent multi-vault state)."),t=!1);let i,s=!1;if(t){let c=await new mi(n).loadOrBuild();i=c.triples,s=c.cacheHit}else{let o=new ht(n);i=await new Fe.NoteToRDFConverter(o).convertVault()}for(let o of e){let c=(0,En.resolve)(o);if(!(0,yi.existsSync)(c))throw new Ne(c);r&&console.log(`\u{1F4E6} Loading additional vault: ${c}...`);let l=new ht(c),f=await new Fe.NoteToRDFConverter(l).convertVault();i=i.concat(f),r&&console.log(` \u2795 Added ${f.length} triples from ${c}`)}if(e.length>0){let o=i.length;if(i=Ere(i),r){let c=i.length-o;c>0&&console.log(` \u{1F517} Cross-vault Instance_class resolution: emitted ${c} additional canonical-IRI triple(s)`)}}return{triples:i,cacheHit:s}}a(Mk,"loadTriplesFromAllVaults");var Nk="https://exocortex.my/ontology/exo#Instance_class",jk="http://www.w3.org/1999/02/22-rdf-syntax-ns#type",Sre=/^\[\[([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:\|[^\]]*)?\]\]$/i,wre=/\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.md$/i;function Ere(n){let e=new Map;for(let i of n){if(!(i.subject instanceof Fe.DomainIRI)||!(i.predicate instanceof Fe.DomainIRI)||!(i.object instanceof Fe.DomainLiteral)||i.predicate.value!==Gk&&i.predicate.value!==vre)continue;let s=wre.exec(i.subject.value);if(!s)continue;let o=s[1].toLowerCase();if(e.has(o))continue;let c=i.object.value.trim();if(/\s/.test(c))continue;let l=W2(c);l&&e.set(o,l)}if(e.size===0)return n;let t=new Set,r=[];for(let i of n){if(!(i.subject instanceof Fe.DomainIRI)||!(i.predicate instanceof Fe.DomainIRI)||!(i.object instanceof Fe.DomainLiteral)||i.predicate.value!==Nk)continue;let s=i.object.value.trim(),o=Sre.exec(s);if(!o)continue;let c=o[1].toLowerCase(),l=e.get(c);if(!l)continue;let f=`${i.subject.value}\0${l}`;if(t.has(f))continue;t.add(f);let d=new Fe.DomainIRI(l);r.push(new Fe.DomainTriple(i.subject,new Fe.DomainIRI(Nk),d)),r.push(new Fe.DomainTriple(i.subject,new Fe.DomainIRI(jk),d))}return r.length>0?n.concat(r):n}a(Ere,"resolveCrossVaultInstanceClassWikilinks");var vre="https://exocortex.my/ontology/exo#Asset_label";function Tre(n,e){let t="obsidian://vault/",r=n;if(n.startsWith(t))r=decodeURIComponent(n.substring(t.length));else return n;for(let i of e){let s=(0,En.join)(i,r);if((0,yi.existsSync)(s))return s}return(0,En.join)(e[0]??"",r)}a(Tre,"qualifyFocusNodePath");function $k(n){let e=n.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!e)return n.match(/^---\r?\n---/)?{}:null;let t=e[1].split(`
647
+ `).slice(-3)[0]?.trim()||"..."}`)}}}catch(r){be.handle(r)}})}a(Lk,"askCommand");function gre(n,e){let t=n;switch(e){case"json":let r=new Ou;console.log(r.format(t));break;case"table":default:let i=new Pu;console.log(i.format(t));break}}a(gre,"formatResults");var Yk=require("fs"),Jk=require("path");var yi=require("fs"),En=require("path"),kk=require("child_process"),Fe=re(it());var yre=new Set(["aliases","archived","tags","cssclasses","publish","permalink","description","image","cover","banner","title","share","share_link","share_updated","metadata","uri"]),q2=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#"],["exoob__","https://exocortex.my/ontology/exoob#"],["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#"]]);function bre(n,e){if(!n)return!1;let t=n.exo__Instance_class;if(t==null)return!1;let r=Array.isArray(t)?t:[t];for(let i of r){if(typeof i!="string")continue;let s=i.match(/\[\[([^|\]]+)/),o=s?s[1]:i;if(o===e||o.includes(e))return!0}return!1}a(bre,"frontmatterMatchesClass");function _re(n,e){return e.concat([n])}a(_re,"collectAlso");async function Mk(n,e,t,r){t&&e.length>0&&(r&&console.log("\u26A0\uFE0F --use-cache is disabled when --also is specified (per-vault cache cannot represent multi-vault state)."),t=!1);let i,s=!1;if(t){let c=await new mi(n).loadOrBuild();i=c.triples,s=c.cacheHit}else{let o=new ht(n);i=await new Fe.NoteToRDFConverter(o).convertVault()}for(let o of e){let c=(0,En.resolve)(o);if(!(0,yi.existsSync)(c))throw new Ne(c);r&&console.log(`\u{1F4E6} Loading additional vault: ${c}...`);let l=new ht(c),f=await new Fe.NoteToRDFConverter(l).convertVault();i=i.concat(f),r&&console.log(` \u2795 Added ${f.length} triples from ${c}`)}if(e.length>0){let o=i.length;if(i=Ere(i),r){let c=i.length-o;c>0&&console.log(` \u{1F517} Cross-vault Instance_class resolution: emitted ${c} additional canonical-IRI triple(s)`)}}return{triples:i,cacheHit:s}}a(Mk,"loadTriplesFromAllVaults");var Nk="https://exocortex.my/ontology/exo#Instance_class",jk="http://www.w3.org/1999/02/22-rdf-syntax-ns#type",Sre=/^\[\[([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:\|[^\]]*)?\]\]$/i,wre=/\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.md$/i;function Ere(n){let e=new Map;for(let i of n){if(!(i.subject instanceof Fe.DomainIRI)||!(i.predicate instanceof Fe.DomainIRI)||!(i.object instanceof Fe.DomainLiteral)||i.predicate.value!==Gk&&i.predicate.value!==vre)continue;let s=wre.exec(i.subject.value);if(!s)continue;let o=s[1].toLowerCase();if(e.has(o))continue;let c=i.object.value.trim();if(/\s/.test(c))continue;let l=W2(c);l&&e.set(o,l)}if(e.size===0)return n;let t=new Set,r=[];for(let i of n){if(!(i.subject instanceof Fe.DomainIRI)||!(i.predicate instanceof Fe.DomainIRI)||!(i.object instanceof Fe.DomainLiteral)||i.predicate.value!==Nk)continue;let s=i.object.value.trim(),o=Sre.exec(s);if(!o)continue;let c=o[1].toLowerCase(),l=e.get(c);if(!l)continue;let f=`${i.subject.value}\0${l}`;if(t.has(f))continue;t.add(f);let d=new Fe.DomainIRI(l);r.push(new Fe.DomainTriple(i.subject,new Fe.DomainIRI(Nk),d)),r.push(new Fe.DomainTriple(i.subject,new Fe.DomainIRI(jk),d))}return r.length>0?n.concat(r):n}a(Ere,"resolveCrossVaultInstanceClassWikilinks");var vre="https://exocortex.my/ontology/exo#Asset_label";function Tre(n,e){let t="obsidian://vault/",r=n;if(n.startsWith(t))r=decodeURIComponent(n.substring(t.length));else return n;for(let i of e){let s=(0,En.join)(i,r);if((0,yi.existsSync)(s))return s}return(0,En.join)(e[0]??"",r)}a(Tre,"qualifyFocusNodePath");function $k(n){let e=n.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!e)return n.match(/^---\r?\n---/)?{}:null;let t=e[1].split(`
648
648
  `),r={};for(let i of t){let s=i.match(/^(\w[\w]*):\s*(.*)$/);s&&(r[s[1]]=!0)}return r}a($k,"extractFrontmatter");function Uk(n){for(let e of q2.keys())if(n.startsWith(e))return!0;return!1}a(Uk,"hasKnownPrefix");function Bk(n){for(let[e,t]of q2)if(n.startsWith(e))return t+n.substring(e.length);return null}a(Bk,"keyToURI");function Are(n){let e=[],t=[];for(let r of n)yre.has(r)||(Uk(r)?e.push(r):t.push(r));return{toValidate:e,unknownPrefix:t}}a(Are,"classifyKeys");function Vk(n){try{return(0,kk.execSync)("git diff --cached --name-only",{cwd:n,encoding:"utf-8"}).split(`
649
649
  `).filter(t=>t.endsWith(".md")&&t.trim().length>0)}catch{return[]}}a(Vk,"getStagedMdFiles");function Ire(n){let e=[];function t(r){let i=(0,yi.readdirSync)(r);for(let s of i){if(s.startsWith(".")||s==="node_modules")continue;let o=(0,En.join)(r,s);(0,yi.statSync)(o).isDirectory()?t(o):s.endsWith(".md")&&e.push((0,En.relative)(n,o))}}return a(t,"walk"),t(n),e}a(Ire,"collectMdFiles");function xre(n){let e=n.lastIndexOf("/");if(e===-1)return null;let t=decodeURIComponent(n.substring(e+1));return t.endsWith(".md")&&(t=t.slice(0,-3)),Uk(t)?t:null}a(xre,"extractPropertyNameFromURI");async function Rre(n){let e=new Fe.InMemoryTripleStore;await e.addAll(n);let t=new Fe.ExoQLParser,r=Aa(`SELECT ?s ?label WHERE {
650
650
  {
@@ -773,7 +773,7 @@ Next steps:
773
773
  `),process.stdout.write(` File: ${e.file}
774
774
  `),process.stdout.write(` Commit: ${e.sha}
775
775
  `),process.stdout.write(` URL: ${e.url}
776
- `)),process.exit(0)}catch(e){let t=e instanceof Error?e:new Error(String(e)),r=new Do;t.message=r.redact(t.message),t.stack&&(t.stack=r.redact(t.stack)),be.handle(t)}})}a(Eie,"restPushCommand");var Fo=require("node:fs"),p4=require("node:crypto"),_i=re(require("node:path"));var Si=re(it());var vie=a(async n=>{let e=await p4.webcrypto.subtle.digest("SHA-1",n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength));return[...new Uint8Array(e)].map(t=>t.toString(16).padStart(2,"0")).join("")},"nodeSha1"),Tie={parse:a(n=>Br.load(n,{schema:Br.CORE_SCHEMA}),"parse"),stringify:a(n=>Br.dump(n,{schema:Br.CORE_SCHEMA,lineWidth:-1}),"stringify")};function Aie(n,e){if(n.tokenFromGh===!0)return Do.resolveGhToken(e.ghTokenRunner);let t=e.env??process.env,r=n.token||t.GITHUB_TOKEN||t.GH_TOKEN||"";if(r.length===0)throw new Error("A GitHub token is required (private sync units read as 404 without one). Use --token-from-gh, --token <pat>, or set GITHUB_TOKEN / GH_TOKEN.");return r}a(Aie,"resolveToken");function Iie(n){let e=a(r=>_i.join(n,r),"abs"),t=a(async(r,i)=>{let s;try{s=await Fo.promises.readdir(r,{withFileTypes:!0})}catch{return}for(let o of s){let c=_i.join(r,o.name);if(o.isDirectory()){if(o.name===".git")continue;await t(c,i)}else o.isFile()&&i.push(_i.relative(n,c).split(_i.sep).join("/"))}},"walk");return{async list(){let r=[];return(0,Fo.existsSync)(n)&&await t(n,r),r},read:a(r=>Fo.promises.readFile(e(r),"utf-8"),"read"),async readBinary(r){return new Uint8Array(await Fo.promises.readFile(e(r)))},async write(){throw new Error("exosync-parity is read-only \u2014 write refused")},async delete(){throw new Error("exosync-parity is read-only \u2014 delete refused")}}}a(Iie,"nodeLocalFilesPort");function xie(n){let e=new ht(n),t=new Si.SpaceSpecAccumulator;for(let r of e.getAllFiles()){let i=e.getFrontmatter(r);if(!i)continue;let s=(0,Si.classifySpaceDeclaration)(i,r.path);if(s.kind==="not-space"||(s.warning!==void 0&&t.warnings.push(s.warning),s.kind==="skip"))continue;let o=t.offer(s.candidate);o!==null&&(0,Fo.existsSync)(_i.join(n,o.localPath))&&t.commit(s.candidate)}return{specs:t.specs,warnings:t.warnings}}a(xie,"collectVaultSpecs");function Rie(n,e){for(let t of n.repos){let r=t.headSha!==void 0?` @${t.headSha.slice(0,7)}`:"";e(`${t.repoKey}${r}: ${t.status} \u2014 ${t.inParity}/${t.filesChecked} in parity, M2 diffs ${t.m2SemanticDiffs}, accounted ${t.accountedCount}, M1 violations ${t.m1Violations.length}${t.attachmentHashSetIdentical!==void 0?`, attachment hash-set ${t.attachmentHashSetIdentical?"identical":"DIFFERS"}`:""}`),t.detail!==void 0&&e(` ${t.detail}`);for(let i of t.warnings)e(` warn: ${i}`);for(let i of t.discrepancies)e(` ${i.cls}: ${i.path}${i.detail!==void 0?` (${i.detail})`:""}`);for(let i of t.m1Violations)e(` M1 VIOLATION: ${i.path} \u2014 ${i.detail}`)}e((0,Si.summarizeParityRound)(n))}a(Rie,"printHumanReport");async function Cie(n,e={}){let t=e.out??(g=>console.log(g)),r=_i.resolve(n.vault);if(!(0,Fo.existsSync)(r))throw new Error(`Vault path does not exist: ${r}`);let i=Aie(n,e),s=new Do({token:i,...n.apiBase!==void 0?{apiBase:n.apiBase}:{}}),o=e.transportFactory?.(i,n.apiBase)??s.transport(),{specs:c,warnings:l}=xie(r);for(let g of l)t(`warn: ${g}`);if(c.length===0)return t("Nothing to check \u2014 no materialized AssetSpaces with a GitHub source found in this vault."),2;let u=n.configDir??".obsidian",f=_i.join(r,u,"plugins","exocortex",Si.WATERMARK_STORE_FILENAME),d=new Si.FileWatermarkStore({read:a(async()=>{try{return await Fo.promises.readFile(f,"utf-8")}catch{return null}},"read"),writeAtomic:a(async()=>{throw new Error("exosync-parity: watermark access is read-only by contract")},"writeAtomic")}),h=new Si.ParityValidator({transport:o,sha1:vie,localFilesFor:a(g=>Iie(_i.join(r,g.localPath)),"localFilesFor"),watermarks:{get:a(g=>d.get(g),"get")},yaml:Tie,redact:a(g=>s.redact(g),"redact"),...n.apiBase!==void 0?{baseURL:n.apiBase}:{}});t(`ExoSync parity check: ${c.length} repo(s), vault ${r}`);let p=await h.runRound(c,{trigger:"standalone"});return n.json===!0?t(JSON.stringify(p,null,2)):Rie(p,t),p.vacuous?2:p.ok?0:1}a(Cie,"runExosyncParity");function m4(){return new Re("exosync-parity").description("ExoSync M1/M2 parity report: compare materialized sync units against their remote heads (read-only; RFC 4e4dc453 Phase E)").requiredOption("--vault <path>","Vault root path").option("--config-dir <name>","Obsidian config dir name (watermark location)",".obsidian").option("--json","Print the full round record as JSON").option("--token <pat>","GitHub PAT (or env GITHUB_TOKEN / GH_TOKEN). Prefer --token-from-gh.").option("--token-from-gh","Resolve the PAT via `gh auth token`").option("--api-base <url>","GitHub API base (testing)").action(async n=>{try{process.exitCode=await Cie(n)}catch(e){be.handle(e,{command:"exosync-parity"}),process.exitCode=1}})}a(m4,"exosyncParityCommand");function g4(n){let e=new Re;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.86.0"),e.addCommand(xM()),e.addCommand(MM()),e.addCommand(wk()),e.addCommand(Tk()),e.addCommand(Zk()),e.addCommand(Rk()),e.addCommand(Ck()),e.addCommand(Lk()),e.addCommand(rM()),e.addCommand(lM()),e.addCommand(fM()),e.addCommand(gM()),e.addCommand(IM()),e.addCommand(JM()),e.addCommand(s4()),e.addCommand(o4()),e.addCommand(c4()),e.addCommand(h4()),e.addCommand(m4()),e}a(g4,"createProgram");g4().parse();0&&(module.exports={createProgram});
776
+ `)),process.exit(0)}catch(e){let t=e instanceof Error?e:new Error(String(e)),r=new Do;t.message=r.redact(t.message),t.stack&&(t.stack=r.redact(t.stack)),be.handle(t)}})}a(Eie,"restPushCommand");var Fo=require("node:fs"),p4=require("node:crypto"),_i=re(require("node:path"));var Si=re(it());var vie=a(async n=>{let e=await p4.webcrypto.subtle.digest("SHA-1",n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength));return[...new Uint8Array(e)].map(t=>t.toString(16).padStart(2,"0")).join("")},"nodeSha1"),Tie={parse:a(n=>Br.load(n,{schema:Br.CORE_SCHEMA}),"parse"),stringify:a(n=>Br.dump(n,{schema:Br.CORE_SCHEMA,lineWidth:-1}),"stringify")};function Aie(n,e){if(n.tokenFromGh===!0)return Do.resolveGhToken(e.ghTokenRunner);let t=e.env??process.env,r=n.token||t.GITHUB_TOKEN||t.GH_TOKEN||"";if(r.length===0)throw new Error("A GitHub token is required (private sync units read as 404 without one). Use --token-from-gh, --token <pat>, or set GITHUB_TOKEN / GH_TOKEN.");return r}a(Aie,"resolveToken");function Iie(n){let e=a(r=>_i.join(n,r),"abs"),t=a(async(r,i)=>{let s;try{s=await Fo.promises.readdir(r,{withFileTypes:!0})}catch{return}for(let o of s){let c=_i.join(r,o.name);if(o.isDirectory()){if(o.name===".git")continue;await t(c,i)}else o.isFile()&&i.push(_i.relative(n,c).split(_i.sep).join("/"))}},"walk");return{async list(){let r=[];return(0,Fo.existsSync)(n)&&await t(n,r),r},read:a(r=>Fo.promises.readFile(e(r),"utf-8"),"read"),async readBinary(r){return new Uint8Array(await Fo.promises.readFile(e(r)))},async write(){throw new Error("exosync-parity is read-only \u2014 write refused")},async delete(){throw new Error("exosync-parity is read-only \u2014 delete refused")}}}a(Iie,"nodeLocalFilesPort");function xie(n){let e=new ht(n),t=new Si.SpaceSpecAccumulator;for(let r of e.getAllFiles()){let i=e.getFrontmatter(r);if(!i)continue;let s=(0,Si.classifySpaceDeclaration)(i,r.path);if(s.kind==="not-space"||(s.warning!==void 0&&t.warnings.push(s.warning),s.kind==="skip"))continue;let o=t.offer(s.candidate);o!==null&&(0,Fo.existsSync)(_i.join(n,o.localPath))&&t.commit(s.candidate)}return{specs:t.specs,warnings:t.warnings}}a(xie,"collectVaultSpecs");function Rie(n,e){for(let t of n.repos){let r=t.headSha!==void 0?` @${t.headSha.slice(0,7)}`:"";e(`${t.repoKey}${r}: ${t.status} \u2014 ${t.inParity}/${t.filesChecked} in parity, M2 diffs ${t.m2SemanticDiffs}, accounted ${t.accountedCount}, M1 violations ${t.m1Violations.length}${t.attachmentHashSetIdentical!==void 0?`, attachment hash-set ${t.attachmentHashSetIdentical?"identical":"DIFFERS"}`:""}`),t.detail!==void 0&&e(` ${t.detail}`);for(let i of t.warnings)e(` warn: ${i}`);for(let i of t.discrepancies)e(` ${i.cls}: ${i.path}${i.detail!==void 0?` (${i.detail})`:""}`);for(let i of t.m1Violations)e(` M1 VIOLATION: ${i.path} \u2014 ${i.detail}`)}e((0,Si.summarizeParityRound)(n))}a(Rie,"printHumanReport");async function Cie(n,e={}){let t=e.out??(g=>console.log(g)),r=_i.resolve(n.vault);if(!(0,Fo.existsSync)(r))throw new Error(`Vault path does not exist: ${r}`);let i=Aie(n,e),s=new Do({token:i,...n.apiBase!==void 0?{apiBase:n.apiBase}:{}}),o=e.transportFactory?.(i,n.apiBase)??s.transport(),{specs:c,warnings:l}=xie(r);for(let g of l)t(`warn: ${g}`);if(c.length===0)return t("Nothing to check \u2014 no materialized AssetSpaces with a GitHub source found in this vault."),2;let u=n.configDir??".obsidian",f=_i.join(r,u,"plugins","exocortex",Si.WATERMARK_STORE_FILENAME),d=new Si.FileWatermarkStore({read:a(async()=>{try{return await Fo.promises.readFile(f,"utf-8")}catch{return null}},"read"),writeAtomic:a(async()=>{throw new Error("exosync-parity: watermark access is read-only by contract")},"writeAtomic")}),h=new Si.ParityValidator({transport:o,sha1:vie,localFilesFor:a(g=>Iie(_i.join(r,g.localPath)),"localFilesFor"),watermarks:{get:a(g=>d.get(g),"get")},yaml:Tie,redact:a(g=>s.redact(g),"redact"),...n.apiBase!==void 0?{baseURL:n.apiBase}:{}});t(`ExoSync parity check: ${c.length} repo(s), vault ${r}`);let p=await h.runRound(c,{trigger:"standalone"});return n.json===!0?t(JSON.stringify(p,null,2)):Rie(p,t),p.vacuous?2:p.ok?0:1}a(Cie,"runExosyncParity");function m4(){return new Re("exosync-parity").description("ExoSync M1/M2 parity report: compare materialized sync units against their remote heads (read-only; RFC 4e4dc453 Phase E)").requiredOption("--vault <path>","Vault root path").option("--config-dir <name>","Obsidian config dir name (watermark location)",".obsidian").option("--json","Print the full round record as JSON").option("--token <pat>","GitHub PAT (or env GITHUB_TOKEN / GH_TOKEN). Prefer --token-from-gh.").option("--token-from-gh","Resolve the PAT via `gh auth token`").option("--api-base <url>","GitHub API base (testing)").action(async n=>{try{process.exitCode=await Cie(n)}catch(e){be.handle(e,{command:"exosync-parity"}),process.exitCode=1}})}a(m4,"exosyncParityCommand");function g4(n){let e=new Re;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.87.0"),e.addCommand(xM()),e.addCommand(MM()),e.addCommand(wk()),e.addCommand(Tk()),e.addCommand(Zk()),e.addCommand(Rk()),e.addCommand(Ck()),e.addCommand(Lk()),e.addCommand(rM()),e.addCommand(lM()),e.addCommand(fM()),e.addCommand(gM()),e.addCommand(IM()),e.addCommand(JM()),e.addCommand(s4()),e.addCommand(o4()),e.addCommand(c4()),e.addCommand(h4()),e.addCommand(m4()),e}a(g4,"createProgram");g4().parse();0&&(module.exports={createProgram});
777
777
  /*! Bundled license information:
778
778
 
779
779
  reflect-metadata/Reflect.js:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitelev/exocortex-cli",
3
- "version": "16.86.0",
3
+ "version": "16.87.0",
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": {